自动执行C ++库的C#包装

时间:2013-12-17 02:10:47

标签: c# c++ pinvoke

我在发布之前已经对此进行了一些研究,但我找不到特定于我的环境的直接答案。

我有一个用C ++编写的第三方库。我可以访问该库的.dll.lib.h标题。

我想使用p / invoke将库包装在C#中使用。我想知道在执行维护时我有哪些选择。我希望这里有.h标题,我可以利用一些应用程序自动提供包装代码。

我对各种解决方案感兴趣,包括商业软件解决方案以及尝试自动管理包装代码的任何陷阱。

2 个答案:

答案 0 :(得分:4)

您可以尝试SWIG这是免费的。您可以将其编写为脚本,以便在构建过程中自动运行。

就个人而言,我只是使用[DllImport]编写一些包装器。你真的需要从C#访问C ++库中的所有吗?通常我发现你真的只需要调用一些函数,而dllimport的简单性很棒

答案 1 :(得分:1)

  

我希望这里有.h标题,我可以利用一些应用程序自动提供包装代码。

如果这是可能的话会很可爱,但事实并非如此。这是不可能的,因为头文件不包含足够的信息来确定如何编组参数。例如,请考虑以下声明:

void foo(int *x);

什么是x?它的类型是int*,指向int的指针。但它是指向单个int值的指针,还是int的数组?你根本无法从头文件中分辨出来。您需要阅读文档。

那么数据流呢?信息是流入本机代码还是流出本机代码,还是两个方向?同样,该细节不能表示为头文件。

现在,有各种注释约定可以帮助解决这个问题。基本上这些宏是评估为工具无法读取的任何内容,因此有助于转换。您会看到使用_In__In_Opt_等注释的Win32 API函数。这些可以提供帮助,但只有最简单的库才能自动转换为p / invoke声明。

现在,如果您准备为原始头文件添加额外注释,那么您可能有机会。只要您在注释或宏中表达缺少的信息,现有的工具肯定有可能做得很好。 SWIG当然值得一看,还有其他工具。

我的回答的基本点是试图理解这样的翻译并不像你希望的那样自动。就个人而言,我总是手工编写我的p / invoke声明。这允许我完全按照我想要的方式获取它们,并且维护并不是什么大问题,因为DLL接口通常不会改变。它们不会改变,因为您不想破坏二进制兼容性。