C# 调用c代码时避免AccessViolationException

C# 调用c代码时避免AccessViolationException,c#,c,dllimport,access-violation,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 ReadC

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

可能是什么问题?

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

在编写时,C代码似乎使用默认的cdecl调用约定。您的C#代码使用stdcall


最好对参数应用
[In,Out]
属性。因为
byte[]
是可空转的,这不是严格必要的,但在语义上是准确的

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

在编写时,C代码似乎使用默认的cdecl调用约定。您的C#代码使用stdcall


最好对参数应用
[In,Out]
属性。因为
byte[]
是可空转的,这不是严格必要的,但在语义上是准确的

电话会议对吗?你真的只需要分配4个字节吗?是的,这是一个4字节的缓冲区和调用约定?我想这也是对的,请参阅上面源头文件中的声明,在我看来它像cdecl。这并不能解释这个错误。找一些工作实例C++代码。调用约定是正确的吗?你真的只需要分配4个字节吗?是的,这是一个4字节的缓冲区和调用约定?我想这也是对的,请参阅上面源头文件中的声明,在我看来它像cdecl。这并不能解释这个错误。找到一些C++的工作例子。我只想提到C代码也调用DLL,那么我怎么才能修复我的C代码呢?我仍然得到相同的错误
publicstaticbyte[]Data=newbyte[1024];[DllImport(“CardLib.dll”,CallingConvention=CallingConvention.Cdecl)]公共静态外部程序Int32 ReadCardSN(字节[]数据);int resCode=ReadCardSN(数据)
1024小于10240我只想说c代码也在调用DLL,那么我如何修复我的c代码呢?我仍然得到相同的错误
publicstaticbyte[]Data=newbyte[1024];[DllImport(“CardLib.dll”,CallingConvention=CallingConvention.Cdecl)]公共静态外部程序Int32 ReadCardSN(字节[]数据);int resCode=ReadCardSN(数据)1024小于10240