调用c代码时避免访问AccessViolationException

时间:2016-05-31 09:57:50

标签: c# c dllimport access-violation

我使用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);

可能是什么问题?

1 个答案:

答案 0 :(得分:3)

错误是因为你的缓冲区太小了。示例代码显示了使用长度为10240的缓冲区。您提供长度为4的缓冲区。

如上所述,C代码使用默认的cdecl调用约定。您的C#代码使用stdcall。

[In, Out]属性应用于参数也会更好。因为byte[]是blittable,并非严格必要,但它在语义上是准确的。