swig 是一个工具,可以将c,c++代码转换成c#,java,perl,tcl,ruby等等语言,官网介绍如下
http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn2
个人目标:c++ lib 项目转成c#可直接引用的dll
从头讲起,以下皆使用vs 2008
1. lib项目
1.1 vs,新建项目->选择Win32项目(项目名:lib-test)->选择静态库lib
1.2 解决方案资源器中选择项目,右键选择添加类->c++类->输入类名libXiao等,一路next,自动生成libXiao.h和libXiao.cpp
1.3 在.h中加入int add(int i,int j);声明,在.cpp中加入add函数实现代码
1.4 生成解决方案
接下来需要两个项目来完成转化,一个(c++ dll项目类型)利用swig来生成c#类文件和c++ dll,另一个(c# 类库项目类型)利用生成的dll和c#文件来生成其他c#项目可以直接引用的dll。
2. 使用swig生成c#类文件和c++ dll
2.1 vs,新建项目->选择Win32项目(项目名:swig-test)->选择dll
2.2 删除项目生成的所有文件,在项目属性->配置属性->c/c++->预编译头->创建/使用预编译头,选择”不使用预编译头“
2.3 在本地创建一个test.i文件
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" -outdir $(SolutionDir)ClassLibrary1 -dllimport swig-test test.i
注:$(SolutionDir)ClassLibrary1为接下来使用的c#的项目的路径,根据自己情况决定
-dllimport swig-test 的参数值为dll的名称,这点需要注意,如果%module跟dll名称一致则不需要此参数,这个会影响生成的c#类文件中的dllImport的名称,如 [DllImport("swig-test", EntryPoint="SWIGRegisterExceptionCallbacks_Test")]
2.7 在项目属性->配置属性->链接器->输入->附属依赖项中输入lib-test.lib的路径E:/Mine/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
3.4 生成解决方案
3.5 生成test.dll
至此所有的工作就已经完成了,接下来就可以添加引用test.dll到c#项目中使用
using Xiao.Test;
...
Xiao.Test.libXiao l = new libXiao();
int i = l.add(1, 12);
MessageBox.Show(i.ToString());
需要注意的是由于test.dll依赖于swig-test.dll这个c++生成的dll所以我们使用的时候需要把swig-test.dll能让程序访问,可以把它放到程序运行的当前目录下或者system32或者环境变量包括的路径中。