繁体   English   中英

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

[英]Getting Memory Exception Error when calling C++ method from 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.

请帮忙。

我认为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);

我不确定这是否行得通,但希望能有所帮助。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM