【发布时间】:2017-01-09 17:37:28
【问题描述】:
我有一个从 C++ 项目形成的 nuget - 在该 nuget 内部,我在静态类 FileAccess.cs 中有一个外部方法 GetBytes,我在另一个项目的 (C#) REST 服务调用中调用它来检索一些数据。每当我从我的 C# REST 服务中调用此 GetBytes extern 方法时,出于某种原因,我都会得到一个 AccessViolationException。该方法接受两个字符串和几个 int 值并返回一个IntPtr。
我很困惑,因为我有一个类似的电话不会导致违规。关键区别在于这个版本不直接调用 extern 方法。相反,它调用一个 C# DataGroup 类(它是 nuget 的一部分),其中包含一个调用 extern 方法的函数。 DataGroup 类方法返回一个byte[,],但仅在它调用extern 方法并编组数据之后。
// 导致 AccessViolation 的版本:
- REST 调用外部方法为
IntPtr(IntPtr ptr = FileAccess.getBytes(...); - extern 方法返回一个
IntPtr -
AccessViolationException发生
// 额外类的工作版本:
- REST 调用返回
byte[,]的数据组方法。 (例如dataGroupInstance.getDataGroupBytes(); - 在方法
getDataGroupBytes内部调用外部方法 - extern 方法返回一个
IntPtr - 方法
getDataGroupBytes编组来自IntPtr的数据并返回byte[,] - 没有错误
基本上,为什么直接调用 extern 方法会导致AccessViolationException?
【问题讨论】:
-
如果您的
FileAccess.getBytes(...);方法采用可变参数,请确保在 PInvoke 签名上设置CallingConvention.Cdecl。
标签: c# c++ rest exception access-violation