0

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

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

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

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

[DllImport(MyDLL.dll)]
4

1 回答 1

4

Pinvoke 互操作助手在 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++ 声明和函数功能的简短描述。

于 2013-10-18T11:44:55.087 回答