使用SWIG和C#的最佳实践是什么?

22

有没有人在使用C#时使用过 SWIG 库? 如果您使用过,遇到了什么问题,使用该库的最佳方法是什么? 我打算将其用作对用C编写的程序的包装器,并希望在其中包装可以在我的.NET应用程序中使用的头文件。

编辑:关于目标操作系统的一些澄清。

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

3个回答

15

这是我的最后一个项目中的整个C# SWIG配置文件:

%module mdProject

%{
#include "mdProject.h"
%}

我使用SWIG进行编译:

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

我使用SWIG生成了Project.cxx文件,将其直接编译和链接到“main” DLL中,因此我不需要第二个C ++“helper” DLL。 SWIG还生成了一堆C#文件,我将它们编译成.NET DLL。我的其他包装器(Java,PHP等)确实使用辅助DLL。

正如@patrick所提到的,SWIG使用P / Invoke,因此如果您对此有问题,则需寻找另一种解决方案。

如果您使用与普通类型(voids、structures等)不同的类型,则需要进行一些额外的工作才能正确处理它,但对于使用int、char *等的平均API而言,这很好。


我知道这是去年的事了,但你能否分享一下你如何将生成的.cxx文件“编译并直接链接到'main' DLL”?我完全不知道该怎么做。提前感谢! :) - Ozzie Perez
你需要拥有“main” DLL的源代码(在我的情况下是C++)。我只需打开DLL的C++项目,将SWIG自动生成的C++文件添加到项目中并重新构建即可。如果您无法访问DLL的源代码,则无法执行此操作。换句话说,您无法逐步向现有DLL添加新的源文件-必须从头开始重新构建整个内容,并加入新的源文件。很多时候您无法访问源代码,因此最终只能在您的C#代码和DLL之间创建一个小型的“中间人”DLL。 - Marc Bernier

11

我认为之前的帖子作者犯了一个错误,那就是阅读文档而不是查看示例。

几个小时前,我需要将一些C++类与C#进行接口连接。 我在我的Swig目录中查找(我已经有其他工作需要它),找到目录 Examples/csharp/class ,浏览了代码,加载了解决方案,理解了它,复制了它,将其放入我的代码中,它有效了,我的工作完成了。

话虽如此,生成的P / Invoke代码并不适用于所有需求。 根据您的项目,编写一些简单的API包装器或编写托管C++可能同样简单(查找SlimDX以获取出色的示例)。

对于我的需求来说,这很简单易行-我有mystuff.dll,现在还可以提供mystuffnet.dll。 我同意文档难以理解。

编辑:我注意到OP只提到了C。 对于这一点,您真的不需要Swig,只需使用常规的C#/C DLLImport互操作语法即可。 当您想要让C++类从C#中调用时,Swig变得非常有用。


我认为即使是在C语言中,SWIG也很酷。你可以将过程式编程转化为面向对象编程! - Matthias

6
我曾经尝试使用SWIG将一个C++项目包装起来,以便在.NET中使用。但是由于SWIG需要复杂的配置,我没有取得太大进展。当时我只是想要一个解决方案,而不是学习另一种语言/ API等。现在的SWIG可能更容易使用,但我无从得知。
最终,我们使用Managed C++来包装C++项目。这个方案非常成功。
如果你只是从dll中直接调用函数,我建议不要担心上述任何问题,只需使用P/Invoke即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接