c# - P/Invoke Interop Assistant - 是否像导入 dll 的 header 一样简单?

标签 c# c++ .net interop pinvoke

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

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

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

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

[DllImport(MyDLL.dll)]

最佳答案

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

您的 C++ 代码不太可能包含这些 SAL 注释。在 C++ 声明中查找看起来像 __in__in_opt__deref_out 的标记,写在函数的参数之前。没有这个标记,Pinvoke Interop Assistant 就无法做得更好。

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

SWIG 是一种开源工具,旨在简化此类工作。它确实遭受了经典的“现在你有两个问题”场景的困扰,要处理困难的情况,你确实必须学习两件事,pinvoke 和 SWIG。

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

关于c# - P/Invoke Interop Assistant - 是否像导入 dll 的 header 一样简单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19443822/

相关文章:

c# - Azure Pipelines - 在 .NET Core 项目中使用从 NuGet 下载的工具

c++ - 耗尽 std::random_device 的熵

c# - 冗长的代码行与可读性

c# - 检查列表是否包含包含字符串的元素并获取该元素

c# - 响应式扩展 - 属性相互更新

c++ - 错误 : 'class TermPaper' has no member named ''

c++ - Visual Studio 2010 调试器指向错误的行

.net - 如何在 .ascx 页面中使用 javascript

.net - 相当于 WebView2 中的 WebBrowser.InvokeScript(String, Object[])

c# - 用于查看用户上次访问的文档的 Web 部件