通过Swig使C#可以链接C++编译的dll[勘误和修改]

通过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.hSwiglib.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.hSwiglib.cppswig.i三个文件放到同一个文件夹中,如:D:\Swiglib

3.       接着点迹开始-运行,输入cmd,在命令行窗口中依次输入下面命令用于将命令行路径切换到D:\Swiglib

待输入命令为:

(1)D:回车

(2)cd D:\ Swiglib回车

经过上面两个命令行可将命令行路径切换到包含Swiglib.hSwiglib.cppswig.i三个文件的D:\Swiglib目录下。

(3)运行swig传入参数,当然,此处一定要保证 swig.i,Swiglib.h,Swiglib.cppD:\Swiglib目录下。待输入命令为:

swig -c++ -csharp -o libswig.cpp -namespace "Swiglib "  -dllimport Swiglib swig.i

解释一下:libswig.cpp就是以后要编译出来的cpp文件,namespace就是以后C#要引用的命名空间,生成后可以修改,dllimportlibswig.cpp生成出来的dll的名字,以后dll可以重命名来配对,最好能和dll名字一样。

执行以后生成ModuleSwiglib.csModuleSwiglibPINVOKE.cslibswig.cpp

仔细观察可以发现cs文件名称和swig.i%module ModuleSwiglib一样就明白前面的%module的意义了。

4.       libswig.cpp编译成dll文件

 打开VS2010,新建项目-选择Win32项目(项目名:swig-test)->选择dll,空项目,项目命名为Swiglib(项目名字要和dllimport里面写的一样,因为vs生成dll是根据项目名称的,你也可以修改)。把libswig.cppSwiglib.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++InteropCOM Interop》来了解相关内容。

5.       在其它C#项目中通过相关的CS文件调用C++编译的DLL

接着通过ModuleSwiglib.csModuleSwiglibPINVOKE.cs就可以调用Swiglib.dll了。具体步骤如下:

1)打开VS2010,新建项目--选择Visual C#--控制台应用程序,在名称中输入MathAlgSwigTest,点迹“确定”按钮,在项目名称上单击右键,选择“添加”-“现有项”,找到并选中ModuleSwiglib.csModuleSwiglibPINVOKE.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

http://blog.csdn.net/MapGuide_Inside/article/details/4296863
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值