[英]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语言指定整数类型的最小位数,这意味着对于环境而言是不同的。
int
:无符号整数, 至少 16位 long
:无符号整数, 至少 32位 int
:始终为32位无符号整数 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.