【问题标题】:P/Invoke Interop Assistant - Is it as easy as importing the dll's headers?P/Invoke Interop Assistant - 是否像导入 dll 的标头一样简单?
【发布时间】:2015-07-30 04:44:15
【问题描述】:

我正在尝试为一组非托管 C++ 库创建包装器。我有库的代码,所以我下载了 P/invoke 互操作助手。

我对 C++ 项目中的导出内容有点困惑。它只是项目的标题吗?

这是一个相当大的项目。我是否只是将每个库中的标头加载到命令行工具中并生成 C# 签名?

完成后我是否需要手动添加实际的 dll 导入到它们之后,如下所示,或者有没有办法将其定义为一个 DLL?:

[DllImport(MyDLL.dll)]

【问题讨论】:

标签: c# c++ .net interop pinvoke


【解决方案1】:

Pinvoke 互操作助手在 Windows 头文件中使用所谓的 SAL 注释来获得更准确的 pinvoke 声明。 SAL 帮助工具更好地分析代码,C 和 C++ 声明通常不足以确定指针是指单个值还是值数组,并且没有指定数据流,是否被函数使用或被它退回。编写 [DllImport] 属性时非常重要的事情。 SAL 补充了缺失的信息。

您的 C++ 代码不太可能有这些 SAL 注释。在 C++ 声明中查找类似于 __in__in_opt__deref_out 的标记,这些标记写在函数的参数之前。如果没有这个标记,Pinvoke 互操作助手就无法做得更好。

另外一个问题是 pinvoke 不支持真正的 C++ 声明,它只适用于 C 声明。换句话说,您不能调用 C++ 类的实例方法或处理接受或返回 C++ 对象的 C++ 函数,例如 std::string 等。您必须改为使用 C++/CLI 语言编写托管包装器。

SWIG 是一个开源工具,它试图让这种工作变得更容易。它确实受到经典的“现在你有两个问题”场景的影响,要处理困难的情况,你确实必须学习两件事,pinvoke 和 SWIG。

找到正确的 [DllImport] 声明的一个很好的资源是您已经找到的,您可以在此处询问有关它的问题。请务必发布准确的 C++ 声明和函数功能的简短描述。

【讨论】:

  • 我刚下载了 SWIG,我想我还是有点困惑。我不确定如何实际使用它来生成初始包装器。在文档中,它仅说明它们是 C# 文件夹中的示例项目。据我了解,我需要以某种方式将 SWIG 附加到 C++ 项目,但我不明白该怎么做。我只需要附加它,这样我就可以生成初始的 C# 代码——或者弄清楚如何去做,否则我将手动修复它。你觉得你能帮我吗?
  • 是的,这就是我警告过你的“现在你有两个问题”的场景。不,我帮不了你,我从不喜欢遇到两个问题,也从不需要 SWIG。
  • 感谢您的详细回答。我真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2022-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
相关资源
最近更新 更多