我在发布之前已经对此进行了一些研究,但我找不到特定于我的环境的直接答案。
我有一个用C ++编写的第三方库。我可以访问该库的.dll
,.lib
和.h
标题。
我想使用p / invoke将库包装在C#中使用。我想知道在执行和维护时我有哪些选择。我希望这里有.h
标题,我可以利用一些应用程序自动提供包装代码。
我对各种解决方案感兴趣,包括商业软件解决方案以及尝试自动管理包装代码的任何陷阱。
答案 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接口通常不会改变。它们不会改变,因为您不想破坏二进制兼容性。