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

时间:2015-11-21 12:23:59

标签: c# c++ dll

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

  

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

     

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

错误似乎是在调用方法 Par取三个参数

  

struct ddTableResults * tablep,struct parResults * presp,int vulnerability

具体而言,与传递第二个参数有关,该参数被描述为:

  

struct parResults   char parScore [2] [16];   char parContractsString [2] [128];

这是我的代码: 我的c#struct:

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);

知道我能做些什么才能让它发挥作用?

非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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

c#one可能是

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

c ++需要DdTableResultsParResults的poitner,没有ref c#将按值传递结构。