从C#调用C ++方法时获取内存异常错误

时间:2019-02-20 05:52:54

标签: c# c++

我有C ++ dll,它具有以下方法签名。我想知道什么是兼容的C#方法来调用C ++ dll。尝试读取写保护的内存时,执行时出现错误。这里使用的dll是第三方dll。我可以在没有C ++ dll指针的情况下调用简单方法。

C ++声明:

int __stdcall Deduct(int V, unsigned char *AI);

C#声明

 [System.Runtime.InteropServices.DllImport("rwl.dll",EntryPoint = "_Deduct@8", CallingConvention = CallingConvention.Cdecl)]   
 public static extern long Deduct(long i,ref string AI);

根据第三方dll的文件。

AI 用作输入和输出缓冲区。缓冲区应至少有80个字节 输入交易的其他信息。这是一个包含7个字节的字节指针。

例如假设未使用使用信息,

if receipt number = 1234567,
hex value = 0x12D687,
7 bytes AI = D6 87 00 00 00 D6 87
Output On return, the AI contains the UD.

请帮助。

2 个答案:

答案 0 :(得分:0)

我认为C#签名看起来不正确。

 [System.Runtime.InteropServices.DllImport("rwl.dll",EntryPoint = "_Deduct@8", CallingConvention = CallingConvention.Cdecl)]   
 public static extern long Deduct(int i,ref char[] AI);

如果期望输入的是char [80],则可能需要这样声明它,并自己将其终止为null,因为从其中读取的内容可能正在读取数组的末尾。

用法

char[] tmp = new char[80];
tmp[0] = (char)0x00;
int i = 0;
Deduct(i, ref tmp);

我不确定这是否会奏效,但希望会有所帮助。

答案 1 :(得分:0)

除了字符串封送处理之外,我还发现了引发异常的可能原因。

您已在C中将返回类型和第一个参数指定为int,但将C#设置为long int。这可能会导致问题。

C语言指定整数类型的最小位数,这意味着对于环境而言是不同的。

  • int in C:无符号整数,至少 16位
  • C中的
  • long:无符号整数,至少 32位
  • int in C#:始终为32位无符号整数
  • long in C#:始终为64位无符号整数

大多数主要的32/64位OS /编译器在C中的类型int中使用32位。但是long在C#中始终是64位。因此签名不匹配。我建议修改:

public static extern int Deduct(int i, ref string AI); // Still not sure about string