我正在尝试为一组非托管 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/