通过Swig使C#可以链接C++编译的dll
VS2010C#,C++版本其实不重要。
登录swig官方,下载 swigwin-2.0.2。以下是下载地址,选择好C#,windows平台就可以下载:http://www.swig.org/survey.html
解压缩后,设置系统属性-高级-环境变量-系统变量下 Path 添加你的解压缩后的目录。我解压E:\后重命名文件夹为swigwin,就在Path下后面添加 ;E:\swigwin(注意前面有个分号)。
1. 现在可以随便用一个文本编辑器编写一个Swiglib.h和Swiglib.cpp。
Swiglib.h代码如下:
#pragma once
class Swiglib
{
public:
Swiglib(void);
~Swiglib(void);
int AaddB(int a,intb);
};
Swiglib.cpp代码如下:
#include"Swiglib.h"
Swiglib::Swiglib(void)
{
}
Swiglib::~Swiglib(void)
{
}
int Swiglib::AaddB(inta,int b)
{
return a+b;
}
(上面的代码就不解释了)
2. 再写一个swig使用的是swig.i文件(可新建一个.txt文件再修改后缀名实现,文件名可以自己取,意义不大)这个可以理解为swig的配置文件。
swig.i代码如下:
%module ModuleSwiglib
%{
#include"Swiglib.h"//注意:以#而非%开始
%}
%include"Swiglib.h"//注意:以%而非#开始
将Swiglib.h、Swiglib.cpp和swig.i三个文件放到同一个文件夹中,如:D:\Swiglib。
3. 接着点迹开始-运行,输入cmd,在命令行窗口中依次输入下面命令用于将命令行路径切换到D:\Swiglib。
待输入命令为:
(1)D:回车
(2)cd D:\ Swiglib回车
经过上面两个命令行可将命令行路径切换到包含Swiglib.h、Swiglib.cpp和swig.i三个文件的D:\Swiglib目录下。
(3)运行swig传入参数,当然,此处一定要保证 swig.i,Swiglib.h,Swiglib.cpp在D:\Swiglib目录下。待输入命令为:
swig -c++ -csharp -o libswig.cpp -namespace "Swiglib " -dllimport Swiglib swig.i
解释一下:libswig.cpp就是以后要编译出来的cpp文件,namespace就是以后C#要引用的命名空间,生成后可以修改,dllimport是libswig.cpp生成出来的dll的名字,以后dll可以重命名来配对,最好能和dll名字一样。
执行以后生成ModuleSwiglib.cs,ModuleSwiglibPINVOKE.cs,libswig.cpp
仔细观察可以发现cs文件名称和swig.i中%module ModuleSwiglib一样就明白前面的%module的意义了。
4. 把libswig.cpp编译成dll文件
打开VS2010,新建项目-选择Win32项目(项目名:swig-test)->选择dll,空项目,项目命名为Swiglib(项目名字要和dllimport里面写的一样,因为vs生成dll是根据项目名称的,你也可以修改)。把libswig.cpp,Swiglib.cpp,Swiglib.h放到工程里面。生成一下,去debug下面去拿dll吧,名字果然是Swiglib.dll。
看看ModuleSwiglibPINVOKE.cs中:
[DllImport("libswig",EntryPoint="CSharp_Swiglib_AaddB")]
public static extern intSwiglib_AaddB(HandleRef jarg1, int jarg2, int jarg3);
这个就是C#调用dll的代码,这属于.NET互操作中平台调用技术的内容。这个我们也可以调用window API。有兴趣的读者可以去参阅书籍《精通.NET互操作PInvoke,C++Interop和COM Interop》来了解相关内容。
5. 在其它C#项目中通过相关的CS文件调用C++编译的DLL
接着通过ModuleSwiglib.cs和ModuleSwiglibPINVOKE.cs就可以调用Swiglib.dll了。具体步骤如下:
(1)打开VS2010,新建项目--选择Visual C#--控制台应用程序,在名称中输入MathAlgSwigTest,点迹“确定”按钮,在项目名称上单击右键,选择“添加”-“现有项”,找到并选中ModuleSwiglib.cs和ModuleSwiglibPINVOKE.cs文件,添加到项目里(事先需要将这两个文件复制到MathAlgSwigTest项目Program.cs文件所在的目录下)。还要把Swiglib.dll放着系统path目录下或者程序相对目录下。
(2)然后在Program.cs文件中添加命名空间的引用:using Swiglib;
在Main()函数中天下如下代码:
//Swiglib sl=new Swiglib();
Swiglib.Swiglib sl=new Swiglib.Swiglib();//命名空间与类同名时
Console.WriteLine(sl.AaddB(1, 2));
引用链接:
http://blog.csdn.net/xiao_rory/article/details/5905771
http://www.cyqdata.com/cnblogs/article-detail-31713