您的位置:首页 > 编程语言 > C#

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官网
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: