我以前见过试图读取或写入受保护的内存错误。通常,当我没有正确设置 c# 结构时会出现错误。我确实有其他电话正常工作,但这个电话不合作。我几乎可以肯定它可能是我的函数调用和导致问题的结构。
C 语法
int CardTransaction(pTRequest req, char *ProductCodes)
请求结构(我把它浓缩成 b/c 有重复的数据类型)
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;
}