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

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

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

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

[DllImport(MyDLL.dll)]

最佳答案

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

您的C ++代码不太可能具有这些SAL批注。在看起来像__in__in_opt__deref_out的C ++声明中查找标记,该标记写在函数的参数之前。没有此标记,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/

10-11 18:27