SWIG入门 - c++ 同 c# 的混合编程
2014-11-02 10:44
441 查看
同C#的混合编程-SWIG入门
最后更新日期:2014-04-18 by kagula环境:Windows8.1 64bits(英文版)、Visual Studio 2013 Update1(英文版)、SWIG Win 3.0.0
正文:
做小项目直接《C#调用C++写的Native DLL》工作量也能接受,但是,当接口变得很复杂这个方式就不经济。
SWIG是个免费开源的C++接口生成工具,可以支持20多种常见计算机编程语言,可以帮助我们快速生成C++的外部接口,C#的调用接口。这篇文章就是介绍SWIG的最基本使用。
部署SWIG运行环境
从www.swig.org下载SWIG Win 3.0.0并解压缩到D:\SDK (你也可以选择其它目录),为系统配置环境变量SWIG_HOME,如下图。
为测试SWIG工具的功能,准备C++工程和C#工程
我们需要个含C++和C#工程的Solution来测试我们的SWIG工具,下图是新建Solution后的文件清单。
先建立C++工程
在Visual Studio中新建Win32工程,选择应用程序类型为DLL,空项目。给项目起名为SWIG_Tutorial1
为空项目添加PlusPlusClass.h和PlusPlusClass.cpp两个文件
PlusPlusClass.h的源码清单如下
#ifndef _PLUSPLUSCLASS_H_ #define _PLUSPLUSCLASS_H_ namespace kagula { namespace cplusplus { class CPlusPlusClass { public: // 测试对C++模块中定义的Class的调用 int Add(int a, int b); }; } } #endif
PlusPlusClass.cpp的源码清单如下
#include "PlusPlusClass.h" namespace kagula { namespace cplusplus { // 测试对C++模块中定义的Class的调用 int CPlusPlusClass::Add(int a, int b) { return a + b; } } }
在当前Solution中添加C#的Win32 工程
新建项目名称为“SWIG_Tutorial1_CSharp”修改默认的Program.cs源文件内容如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SWIG_Tutorial1_CSharp { class Program { static void Main(string[] args) { CPlusPlusClass fromCPlusPlus = new CPlusPlusClass(); Console.WriteLine("来自C++的调用结果:"+fromCPlusPlus.Add(123, 1000)); Console.ReadKey(); } } }
这时候还没有生成cs文件,上面的代码应该会出现红线。
SWIG接口定义文件
C++ Native DLL项目的源代码写好后,我们要新建接口定义文件,即那些东西要暴露给C#工程。
为当前项目添加SWIG_Tutorial1.i文件,源码清单如下
%module SWIG_Tutorial1 %{ /* 在包装代码中包含头文件 */ #include "PlusPlusClass.h" %} /* 解析头文件生成包装代码 */ %include "PlusPlusClass.h"
SWIG接口定义文件(I文件)需要Build后才会产生C++和C#的接口定义文件。
打开SWIG_Tutorial.i属性页
为SWIG_Tutorial1.i定义Item Type为Custom Build Tool.点击OK后关闭属性页。
再次打开SWIG_Tutorial1.i文件的属性页,参考下面的图片操作
在Command Line中输入下面五行信息
echo Invoking SWIG...
echo SWIG_HOME=$(SWIG_HOME)
echo on
$(SWIG_HOME)\swig.exe -c++ -csharp -outdir "$(SolutionDir)$(ProjectName)\interface" "%(FullPath)"
echo off
在Outputs中输入下面这一行信息
%(Filename)_wrap.cxx
在C++项目的路径下新建interface目录,用来存放swig.exe输出的cs文件。
swig.exe读取SWIG_Tutorial1.i文件产生接口文件(SWIG_Tutorial1.cxx文件和几个cs类型文件)。
-c++ 参数告诉swig.exe当前是个C++工程,如果不指定,swig.exe会把当前项目当作是C语言工程。
-csharp 参数告诉swig.exe输出C#的调用接口,swig.exe会产生cs源文件,供C#项目调用。
-outdir参数让swig.exe把cs文件输出到指定目录
接下来为C++工程添加Build后复制动态链接库命令
在[Configuration Properties]->[Build Events]->[Post-BuildEvent]->[Command Line]输入框中插入复制DLL文件的命令
echo on
copy "$(OutDir)$(ProjectName).dll" "$(SolutionDir)SWIG_Tutorial1_CSharp\bin\$(Configuration)
echo off
在[Configuration Properties]->[Build Events]->[Post-BuildEvent]->[Description]输入框中插入对命令的描述
例如“Copy native dll to csharp run directory”,其中“SWIG_Tutorial1_CSharp”是用来测试C++项目的C Sharp项目路径。
这样C++工程Build完毕后会把DLL复制到C#工程的bin\Debug目录下。
开始测试
Build SWIG_Tutorial1.i文件后,swig.exe会在C++工程的当前目录中产生SWIG_Tutorial1.cxx文件,在Interface目录下产生cs文件。在C++工程中添加SWIG_Tutorial1.cxx文件,重新Rebuild C++工程。
设置C#工程为启动项目,按[F5]以Debug方式运行,结果如下。
按任意键后程序结束运行。
参考资料
[1]www.swig.org SWIG官网
相关文章推荐
- SWIG - C++同C#的混合编程(二)
- C#与DLL和COM的混合编程(1)-C#调用C++写的非托管的DLL中导出的函数
- C#和C++混合编程
- C# Socket 入门5 UPD 结构体 与 C++ 通信
- C#和C++混合编程
- 快速入门:触摸输入(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)
- SWIG,把C/C++ API 导出成Java,C#,Python,Ruby,Php的类库
- C#和C++混合编程
- matlab c++混合编程入门之Mex环境配置
- c# 与c++ 混合编程
- C C++ Java C# JS编译、执行过程的原理入门分析
- 谈谈Matlab与C/C++或C#的互调用(混合编程)
- C#和C++混合编程(ZZ)
- [转帖] c++ 与 c# 混合编程 (native C++)
- Excel开发入门(C#和C++实例)
- Excel开发入门(C#和C++实例)
- 【转贴】C++/C# 混合编程 (Mix code C++/C#)
- Swig转c++ lib项目到c#可引用的dll
- Swig转c++ lib项目到c#可引用的dll
- swig--在java、C#中调用c++写的DLL(以vs2012配置为例)