我有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.
请帮助。
答案 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位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