DllImport导致访问冲突异常

时间:2018-06-28 10:37:22

标签: c# dllimport unmanaged access-violation managed

C dll标头是这样的:

HRESULT App_Process(char *FileName, char *Output, const bool& LogInformation);

我的C#DllImport看起来像这样:

[DllImport("App.dll")]
public static extern Int32 App_Process(
    [MarshalAs(UnmanagedType.LPStr)]string FileName,
    [MarshalAs(UnmanagedType.LPStr)]string Output,
    [MarshalAs(UnmanagedType.Bool)]bool LogInformation);

例外是:

var result = App_Process("MyFile.txt", "Output.txt", true);
  

System.AccessViolationException:尝试读取或写入受保护的   记忆。这通常表明其他内存已损坏。

现在奇怪的是,该方法已成功完成了其应做的所有事情。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

原始答案

假设DLL标头的参数类型为ref bool,则extern方法的最后一个参数应该是bool而不是const bool&

// Parameter names changed to be idiomatic for C#
[DllImport("App.dll")]
public static extern Int32 App_Process(
    [MarshalAs(UnmanagedType.LPStr)] string fileName,
    [MarshalAs(UnmanagedType.LPStr)] string output,
    [MarshalAs(UnmanagedType.Bool)] ref bool logInformation);

在C#7.2中,我怀疑您可以使用in代替ref,这将使该方法更易于调用:

// Parameter names changed to be idiomatic for C#
[DllImport("App.dll")]
public static extern Int32 App_Process(
    [MarshalAs(UnmanagedType.LPStr)] string fileName,
    [MarshalAs(UnmanagedType.LPStr)] string output,
    [MarshalAs(UnmanagedType.Bool)] in bool logInformation);

更新

(摘自Hans Passant的评论)

这不是C代码,因为bool&仅在C ++中有效。这很可能需要将参数编组为[MarshalAs(UnmanagedType.U1)]。仔细检查本机代码中的sizeof(bool)。但是您应该与DLL的作者联系,因为const bool&毫无意义。通过引用传递布尔值没有意义,但是不允许代码对其进行更新。