有没有人在使用C#时使用过 SWIG 库? 如果您使用过,遇到了什么问题,使用该库的最佳方法是什么? 我打算将其用作对用C编写的程序的包装器,并希望在其中包装可以在我的.NET应用程序中使用的头文件。
编辑:关于目标操作系统的一些澄清。
我计划在Linux和Windows上运行应用程序,因此我正在研究SWIG。 P / Invoke不是选项。
这是我的最后一个项目中的整个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而言,这很好。
我认为之前的帖子作者犯了一个错误,那就是阅读文档而不是查看示例。
几个小时前,我需要将一些C++类与C#进行接口连接。 我在我的Swig目录中查找(我已经有其他工作需要它),找到目录 Examples/csharp/class
,浏览了代码,加载了解决方案,理解了它,复制了它,将其放入我的代码中,它有效了,我的工作完成了。
话虽如此,生成的P / Invoke代码并不适用于所有需求。 根据您的项目,编写一些简单的API包装器或编写托管C++可能同样简单(查找SlimDX以获取出色的示例)。
对于我的需求来说,这很简单易行-我有mystuff.dll
,现在还可以提供mystuffnet.dll
。 我同意文档难以理解。
编辑:我注意到OP只提到了C。 对于这一点,您真的不需要Swig,只需使用常规的C#/C DLLImport互操作语法即可。 当您想要让C++类从C#中调用时,Swig变得非常有用。