我使用c#通过DLL调用c代码,我在调用方法时遇到了AccessViolationException,这里是来自源头的代码
extern __declspec( dllexport )
int ReadCardSN( IN OUT unsigned char* CardSN );
在我使用的c#代码中
public static byte[] Data = new byte[4];
[DllImport("CardLib.dll")]
public static extern Int32 ReadCardSN(byte[] Data);
int resCode = ReadCardSN(Data);
可能是什么问题?
答案 0 :(得分:3)
错误是因为你的缓冲区太小了。示例代码显示了使用长度为10240的缓冲区。您提供长度为4的缓冲区。
如上所述,C代码使用默认的cdecl调用约定。您的C#代码使用stdcall。
将[In, Out]
属性应用于参数也会更好。因为byte[]
是blittable,并非严格必要,但它在语义上是准确的。