Swig将C++编译lib项目转换为C#可引用的dll
swig是一个工具,可以将c,c++代码转换成c#,java,perl,tcl,ruby等等语言,官网介绍如下
http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn2。
个人目标:c++ lib 项目转成c#可直接引用的dll。
从头讲起,以下皆使用VS2008。
1. 建立和编译C++ lib项目
1.1 启动VS2008,新建项目->选择Win32项目(项目名:lib-test)->选择静态库lib
1.2 解决方案资源器中选择项目,右键选择添加类->c++类->输入类名libXiao等,一路next,自动生成libXiao.h和libXiao.cpp
1.3 在.h中加入intadd(int i,int j);声明,
在.cpp中加入add函数实现代码:
int libXiao::add(int i,int j)
{
returni+j;
}
1.4生成解决方案,得到lib-test.lib文件
接下来需要两个项目来完成转化,其中,一个项目(C++dll项目类型)利用swig来生成C#类文件和C++ dll,另一个项目(C#类库项目类型)利用生成的前一个项目生成的dll和C#文件来生成可以被其他C#项目可以直接引用的dll。
2. 使用swig生成C#类文件和C++ dll
2.1启动VS2008,新建项目->选择Win32项目(项目名:swig-test)->选择dll
2.2在项目属性->配置属性->C/C++->预编译头->创建/使用预编译头,选择”不使用预编译头“
2.3在本地创建一个test.i文件(可新建一个.txt文件再修改后缀名实现)
2.4 解决方案资源器中选择资源文件,右键选择添加现有项,添加刚生成的.i文件(当弹出“未找到匹配的自定义生成规则”对话框时选择“否”按钮,不创建规则)
2.5编辑test.i文件
%module Test
%include <windows.i>
%{
#include"libXiao.h"//注意:以#而非%开始
%}
%include "E:/Mine/lib-test/lib-test/libXiao.h"//注意:以%而非#开始
2.6 在项目属性->配置属性->预生成事件->命令行中输入:
swig -c++ -csharp -o test_wrap.cpp -namespace"Xiao.Test" -dllimport swig-test test.i
如果打算将产生出来的文件自动添加到“将dll编译成可被C#调用的dll的项目”中去,可以使用下面的命令行:swig-c++ -csharp -o test_wrap.cpp -namespace "Xiao.Test" -outdir$(SolutionDir)ClassLibrary1 -dllimport swig-test test.i
注意:$(SolutionDir)ClassLibrary1为接下来使用的c#的项目的路径,根据自己情况决定。-dllimportswig-test 的参数值为dll的名称,这点需要注意,如果%module跟dll名称一致则不需要此参数,这个会影响生成的c#类文件中的dllImport的名称,如 [DllImport("swig-test",EntryPoint="SWIGRegisterExceptionCallbacks_Test")]
2.7 在项目属性->配置属性->链接器->输入->附属依赖项中输入lib-test.lib的全路径:D:\MyProject\lib-test\Debug。如果将lib-test.lib拷贝到当前目录下就不需要全路径了。
2.8生成解决方案,会自动生成test_wrap.cpp
2.9解决方案资源器中选择源文件,添加test_wrap.cpp,生成解决方案
2.10生成了swig-test.dll和libXiao.cs,Test.cs,TestPINVOKE.cs
3. 利用生成的dll和C#文件来生成其他C#项目可以直接引用的dll
3.1可以在2中的解决方案中添加一个C#项目,类型为类库,项目名ClassLibrary1
3.2删除项目默认生成的cs文件
3.3添加2中生成的所有产出:swig-test.dll,libXiao.cs,Test.cs和TestPINVOKE.cs
3.3修改项目属性->应用程序->默认命名空间为Xiao.Test,修改项目属性->应用程序->程序集名称为test
3.4生成解决方案,得到test.dll文件
4.在C# .Net平台下使用经过托管的test.dll和非托管的swig-test.dll
至此所有的工作就已经完成了,接下来就可以添加引用test.dll到c#项目中使用
using Xiao.Test;
Xiao.Test.libXiao l = new libXiao();
int i = l.add(1, 12);
Console.WriteLine(i);
需要注意的是由于test.dll依赖于swig-test.dll。这个C++生成的dll所以我们使用的时候需要把swig-test.dll能让程序访问,可以把它放到程序运行的当前目录下或者system32或者环境变量包括的路径中。