【问题标题】:AccessViolationException when calling an extern method directly直接调用外部方法时出现 AccessViolationException
【发布时间】: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 的版本:

  1. REST 调用外部方法为IntPtr (IntPtr ptr = FileAccess.getBytes(...);
  2. extern 方法返回一个IntPtr
  3. AccessViolationException 发生

// 额外类的工作版本:

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

基本上,为什么直接调用 extern 方法会导致AccessViolationException

【问题讨论】:

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

标签: c# c++ rest exception access-violation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多