我有一个nuget从一个C++项目形成 - 在那个nuget我有一个extern方法GetBytes
里面的静态类FileAccess.cs,我调用另一个项目的(C#)REST服务调用检索一些数据。每当我从我的C#REST服务中调用这个GetBytes
extern
方法时,出于某种原因,我得到一个AccessViolationException
。该方法需要两个字符串和几个int值并返回IntPtr
。AccessViolationException直接调用extern方法时
我很困惑,因为我有一个类似的调用不会导致违规。关键的区别是这个版本不直接调用extern方法。相反,它调用一个C#DataGroup类(它是nuget的一部分),它包含一个调用extern方法的函数。 DataGroup类方法返回一个byte[,]
,但仅在它调用extern方法并编组数据后。
//导致AccessViolation版本:
- REST调用的extern方法
IntPtr
(IntPtr ptr = FileAccess.getBytes(...);
- 的extern方法返回
IntPtr
AccessViolationException
发生
//工作版本与特级:
- REST调用数据组方法返回
byte[,]
。 (例如dataGroupInstance.getDataGroupBytes();
- 的extern方法被称为内部方法
getDataGroupBytes
- 的extern方法返回
IntPtr
- 方法
getDataGroupBytes
警数据从IntPtr
并返回一个byte[,]
- 没有错误
基本上,这是为什么调用extern方法直接产生一个AccessViolationException
?
如果您的'FileAccess.getBytes(...);'方法使用可变参数,请确保在PInvoke签名上设置'CallingConvention.Cdecl'。 – Peter