2017-01-09 29 views
0

我有一个nuget从一个C++项目形成 - 在那个nuget我有一个extern方法GetBytes里面的静态类FileAccess.cs,我调用另一个项目的(C#)REST服务调用检索一些数据。每当我从我的C#REST服务中调用这个GetBytesextern方法时,出于某种原因,我得到一个AccessViolationException。该方法需要两个字符串和几个int值并返回IntPtrAccessViolationException直接调用extern方法时

我很困惑,因为我有一个类似的调用不会导致违规。关键的区别是这个版本不直接调用extern方法。相反,它调用一个C#DataGroup类(它是nuget的一部分),它包含一个调用extern方法的函数。 DataGroup类方法返回一个byte[,],但仅在它调用extern方法并编组数据后。

//导致AccessViolation版本:

  1. REST调用的extern方法IntPtrIntPtr ptr = FileAccess.getBytes(...);
  2. 的extern方法返回IntPtr
  3. AccessViolationException发生

//工作版本与特级:

  1. REST调用数据组方法返回byte[,]。 (例如dataGroupInstance.getDataGroupBytes();
  2. 的extern方法被称为内部方法getDataGroupBytes
  3. 的extern方法返回IntPtr
  4. 方法getDataGroupBytes警数据从IntPtr并返回一个byte[,]
  5. 没有错误

基本上,这是为什么调用extern方法直接产生一个AccessViolationException

+0

如果您的'FileAccess.getBytes(...);'方法使用可变参数,请确保在PInvoke签名上设置'CallingConvention.Cdecl'。 – Peter

回答

0

想通了。这个问题是我的参数造成的 - 当我应该使用const char*时,我的C++函数使用std::string。我用const char*替换std::string(它们用作参数的地方)的所有实例,我不再收到异常。

相关问题