P / Invoke Interop助手 - 它是否像导入dll的标题一样简单?

时间:2013-10-18 07:19:40

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

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

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

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

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

[DllImport(MyDLL.dll)]

1 个答案:

答案 0 :(得分:4)

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

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

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

SWIG是一个开源工具,试图让这种工作变得更容易。它确实遭受了经典的“现在你有两个问题”的情景,处理你真正需要学习两件事的困难案例,pinvoke以及SWIG。

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