将SWIG与C#结合使用时的最佳实践是什么?

时间:2020-03-05 18:42:38  来源:igfitidea点击:

有人在C#中使用SWIG库吗?如果有的话,我们发现了什么陷阱,使用图书馆的最佳方法是什么?我正在考虑将其用作用C编写的程序的包装,并且我想将头文件包装在可以在.NET应用程序中使用的头文件中。

编辑:关于目标操作系统的一些说明。

我计划在Linux和Windows上运行该应用程序,因此我正在研究SWIG。不能使用P / Invoke。

解决方案

回答

几年前,我曾尝试使用SWIG来包装要在.NET中使用的项目C ++。

我并没有走太远,因为生产SWIG所需的配置非常麻烦。当时我只是想要一个解决方案,而不是学习另一种语言/ api / etc。这些天,SWIG可能更易于使用,我无法告诉我们。

我们最终使用了托管C ++来包装C ++项目。它真的很好。

如果我们只是直接从dll调用函数,则建议不要担心以上任何一项,而只需使用P / Invoke

回答

我认为早期发布者犯的错误是阅读文档,而不是查看示例。

几个小时前,我需要将一些C ++类连接到C#。我查看了我的Swig目录(我已经将其用于其他工作),找到目录" Examples / csharp / class",浏览了代码,加载了解决方案,摸索了它,复制了它,并放入了我的代码中,它起作用了,工作完成了。

话虽如此,生成的P / Invoke代码并不是满足所有需求的解决方案。根据项目,我们自己编写一些简单的API包装程序或者编写托管的C ++可能很简单(查找SlimDX以获取此类示例)。

对于我的需求,我拥有mystuff.dll非常简单,现在我还可以运送mystuffnet.dll。我同意很难深入研究该文档。

编辑:我注意到OP仅提到C。为此,我们实际上不需要Swig,只需使用常规的C#/ C DLLImport互操作语法。当我们希望从C#调用C ++类时,Swig变得很有用。

回答

对于我的上一个项目,这是整个CSWIG配置文件:

%module mdProject

%{
#include "mdProject.h"
%}

我用以下代码在SWIG中进行了编译:

swig -csharp -c++ -I../../Include mdProject.i

这生成了一个Project.cxx,我将其编译并直接链接到"主" DLL,因此不需要第二个C ++"辅助" DLL。 SWIG还生成了一堆Cfile,我将其编译为.NET DLL。我的其他包装器(Java,PHP等)确实使用了辅助DLL。

正如@patrick所提到的,SWIG使用P / Invoke,因此,如果对此有疑问,则需要找到其他解决方案。

如果我们使用的类型与普通类型(空隙,结构等)背道而驰,则必须做一些额外的工作才能正确处理,但是对于使用int,char *等的普通API来说,这很好。