使用C#访问非托管C++DLL时发生AccessViolationException
本文关键字:AccessViolationException C++DLL 访问 使用 | 更新日期: 2023-09-27 18:23:48
我正在尝试访问双伪解算器dll(http://privat.bahnhof.se/wb758135/bridge/dll.html)的非托管C++代码,但我收到以下错误消息:
"System.AccessViolationException"类型的未处理异常发生在Dds.Net.dll 中
附加信息:试图读取或写入受保护的内存。这通常表示其他内存已损坏。
错误似乎与调用方法有关接受三个参数的Par
struct ddTableResults*tablep,struct parResults*presp,int易受攻击的
具体而言,与传入第二个参数有关,该参数被描述为:
结构parResultschar 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++签名是
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++想要一个指向DdTableResults
和ParResults
的指针,如果没有ref
,c#将按值传递结构。