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:尝试读取或写入受保护的 记忆。这通常表明其他内存已损坏。
现在奇怪的是,该方法已成功完成了其应做的所有事情。
有什么想法吗?
答案 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&
毫无意义。通过引用传递布尔值没有意义,但是不允许代码对其进行更新。