DllImport 导致访问冲突异常

DllImport causing access violation exception

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: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

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

有什么想法吗?

原回答

extern 方法的最后一个参数应该是 ref bool 而不是 bool,因为 DLL header 有一个 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)]。 Double-check 与本机代码中的 sizeof(bool)。但是你应该和 DLL 的作者谈谈,因为 const bool& 根本没有意义。通过引用传递布尔值但不允许代码更新它是没有意义的。