使用 C# 访问非托管 C++ DLL 时出现 AccessViolationException

Posted

技术标签:

【中文标题】使用 C# 访问非托管 C++ DLL 时出现 AccessViolationException【英文标题】:AccessViolationException when accessing unmanaged C++ DLL with C# 【发布时间】:2015-11-21 12:23:59 【问题描述】:

我正在尝试从 C# 项目访问非托管 C++ 代码的 Double Dummy Solver dll (http://privat.bahnhof.se/wb758135/bridge/dll.html),但收到以下错误消息:

“System.AccessViolationException”类型的未处理异常 发生在 Dds.Net.dll

附加信息:试图读取或写入受保护的内存。 这通常表明其他内存已损坏。

错误似乎与调用方法有关 Par 接受三个参数

struct ddTableResults *tablep, struct parResults *presp, int 易受攻击

具体来说,与传入第二个参数有关,描述为:

结构parResults 字符 parScore[2][16]; char parContractsString [2][128];

这是我的代码: 我的 c# 结构:

using System.Runtime.InteropServices;

namespace Dds.Net.Integration

    [StructLayout(LayoutKind.Sequential)]
    internal struct ParResults
    
        [MarshalAs(UnmanagedType.ByValArray, SizeConst =32)]
        public char[,] parScore;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
        public char[,] parContractString;


    

dllimport 调用函数:

[DllImport("dds.dll")]
        public static extern int Par(DdTableResults tablep, int vulnerable, ParResults parResults);

知道我可以做些什么来让它工作吗?

非常感谢!

【问题讨论】:

c# 签名与您提供给我们的 c++ 签名不匹配:public static extern int Par(DdTableResults tablep, int vulnerable, ParResults parResults); vs struct ddTableResults *tablep, struct parResults *presp, int vulnerable(交换了第 2 和第 3 个参数) 感谢您的回复。我现在已经切换了参数,但它仍然会导致 SystemViolation 异常。 【参考方案1】:

据我了解,你的 c++ 签名是

int Par(struct ddTableResults *tablep, struct parResults *presp, int vulnerable)

c# 可能是

[DllImport("dds.dll")]
public static extern int Par(ref DdTableResults tablep, ref ParResults parResults, int vulnerable);

c++ 想要一个指向DdTableResultsParResults 的指针,没有ref c# 将按值传递结构。

【讨论】:

非常感谢,这解决了访问冲突问题,这使我能够非常快速地调试程序的其余部分并让程序运行!

以上是关于使用 C# 访问非托管 C++ DLL 时出现 AccessViolationException的主要内容,如果未能解决你的问题,请参考以下文章

在非托管 C++ 程序中实现 C# DLL COM 文件

尽管链接到带有导​​出符号的 .lib 文件,但从托管 C++ 链接到非托管 C++ 时出现链接错误

C#调用C++编写的DLL(非托管)

使用托管 C++ 库时出现 WS2_32.dll_unloaded 异常

使用 COM 互操作从非托管 C++ 访问 c# 属性

C#:加载 C++ DLL 时出现问题