使用C#访问非托管C++DLL时发生AccessViolationException

AccessViolationException when accessing unmanaged C++ DLL with C#

本文关键字:AccessViolationException C++DLL 访问 使用      更新时间:2023-10-16

我正在尝试访问双伪解算器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++想要一个指向DdTableResultsParResults的指针,如果没有ref,c#将按值传递结构。