我曾经见过“尝试读取或写入受保护的内存”的错误。通常当我没有正确设置C#结构时,就会出现这个错误。我已经成功使用其他调用,但是这一个没有配合起来。
我几乎确定这可能是我的函数调用和结构都导致了问题。
C语法
C语法
int CardTransaction(pTRequest req, char *ProductCodes)
请求结构(我进行了压缩,因为有重复的数据类型)
typedef struct _cardRequest
{
unsigned short RedemptionNum
long TotalAmount;
unsigned char filler1[257];
char CardNumber[80];
unsigned char cardType;
} TRequest, *pTRequest;
C#函数调用
[DllImport("card.dll"), CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static extern int CardTransaction(ref CardRequest cardRequest, [MarshalAs(UnManagedType.LPStr)] StringBuilder productCodes);
ProductCodes为空,因此我只是实例化了一个空的StringBuilder对象并将其传递。这是我认为可能存在问题的地方之一。
C#结构
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct CardRequest
{
public uint16 RedemptionNum
public int TotalAmount;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
public string filler1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string CardNumber;
public byte cardType;
}
char filler1[257]
不是 TStr,因为它的元素始终为 1 字节大小。 - usr