利用Swig转换C++代码为C#可用的代码
详细的文件路径为:http://user.qzone.qq.com/1259374136/blog/1432887689
Swig学习教程
1.Swig的基本介绍
SWIG(Simplified Wrapper and Interface Generator)是一个非常优秀的开源工具,支持将C/C++代码与任何主流脚本语言相集成而进行联接开发。其原理是从C/C++头文件中找到申明并利用他们生成脚本语言访问C/C++代码所必须的封装代码。SWIG具有高度可自定义的特点,它能帮助你生成适合你的应用程序的封装包。
2.利用Swig转换C++代码为C#可用的代码
利用Swig转换C++代码为C#可用的代码,需要先部署Swig软件,然后利用Swig软件编译C++程序为dll和可调用dll的C#文件,最后在C#项目中添加生成的C#文件并且拷贝生成的dll到C#运行目录即可完成转换。下面按照此过程逐步的介绍。
2.1.Swig软件的安装部署
1)下载Swig软件,下载路径为http://www.swig.org/download.html,根据自己的操作系统选择相应的版本,我下载Windows版的
2)Swig软件下载完成后,解压软件到计算机,并且记录下目录;
3)在系统环境变量中添加解压的Swig软件的目录路径;Window7中操作过程如下所示,其他操作系统请问度娘;
4)在cmd命令界面中输入swig点击回车,若出现如下界面则Swig部署成功。(在运行中输入cmd点击回车就会弹出此界面)
2.2.C++代码的编写及C#可用代码的生成
1)启动VS,我的是2008版本,新建项目按照下图选择:
2)为新建的Win32项目添加Person类,如下所示:
Person.h文件中代码如下所示:
#pragma once
/// <summary>
/// 人类
/// </summary>
class Person
{
public:
/// <summary>
/// 标准构造函数
/// </summary>
/// <returns></returns>
Person(void);
/// <summary>
/// 构造函数
/// </summary>
/// <param name="birthYear">出生年份</param>
/// <returns></returns>
Person(int birthYear);
/// <summary>
/// 标准析构函数
/// </summary>
/// <returns></returns>
~Person(void);
/// <summary>
/// 获得出生年份
/// </summary>
/// <returns>出生年份</returns>
int GetBirthYear();
private:
/// <summary>
/// 出生年份
/// </summary>
int m_BirthYear;
};
Person.cpp文件中代码如下所示:
#include "Person.h"
/// <summary>
/// 标准构造函数
/// </summary>
/// <returns></returns>
Person::Person(void)
{
m_BirthYear=0;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="birthYear">出生年份</param>
/// <returns></returns>
Person::Person(int birthYear)
{
m_BirthYear=birthYear;
}
/// <summary>
/// 标准析构函数
/// </summary>
/// <returns></returns>
Person::~Person(void)
{
}
/// <summary>
/// 获得出生年份
/// </summary>
/// <returns>出生年份</returns>
int Person::GetBirthYear()
{
return m_BirthYear;
}
3)创建Swig规则文件;
在新建的项目路径下新建一个txt文件,并修改扩展名为i;
添加新建的i文件到项目中,如下图所示;
编辑新建的.i文件,该文件式Swig文件转化C++的规则文件;
4)为项目添加编译后事件命令,转化C++代码为C#代码;
命令行中的命令如下图中红框内所示:
5)重新生成项目,会自动生成Wrap文件和C#代码文件,如下图;
6)添加Wrap文件到项目源文件中,如下图所示:
7)重新生成项目,找到项目生成的dll、lib文件备用;
2.3.C#代码的调用
1)新建C#项目,并且修改运行平台为X86,如下图所示;
2)添加2.2步骤5中生成的C#文件到新建的项目中,如下图所示;
3)拷贝2.2步骤7中生成的dll、lib等文件到新建C#项目的生成路径下,如下图所示;
4)在新建的C#项目的主程序中输入如下代码,并将C#项目设置为启动项,运行应用程序;
出现如下运行界面表示你成功在C#中调用了C++编写的代码。
3.特别声明:
以上是自己对Swig应用的简单测试,可能有自己理解不恰当的地方,欢迎各位大神交流指正。
参考:http://www.swig.org/translations/chinese/exec.html
http://cherishlc.iteye.com/blog/1689224
http://m.blog.csdn.net/blog/xiao_xiao_rory/5905771
下一步要测试string、数组等如何在Swig中应用,大家多多交流哦,我的QQ号1259374136
利用Swig转换C++代码为C#可用的代码的更多相关文章
- c#利用SWIG调用c++dll学习总结【转】
开发环境: 操作系统:windows 7 IDE:Microsoft Visual Studio Professional 2015 SWIG: 3.0.12 swig的介绍 详细介绍可看官网,一下贴 ...
- json转换数据后面参数要带ture,代码
强大的PHP已经提供了内置函数:json_encode() 和 json_decode().很容易理解,json_encode()就是将PHP数组转换成Json.相反,json_decode()就是将 ...
- 利用LibreOffice转换ppt、doc转化pdf
利用LibreOffice转换ppt.doc转化pdf LibreOffice下载地址: http://www.libreoffice.org/download/libreoffice-fresh/ ...
- mac 环境下 Quantlib 使用Swig 转换到java
一.Mac安装boost方法:http://blog.csdn.net/xujiezhige/article/details/8230493 二.Swig,这里使用sudo install swig ...
- Android判断当前网络是否可用--示例代码
Android判断当前网络是否可用--示例代码 分类: *07 Android 2011-05-24 13:46 7814人阅读 评论(4) 收藏 举报 网络androiddialogmanagern ...
- 如何利用好chrome控制台这个神器好好调试javascript代码
上面的文章已经大致介绍了一下console对象具体有哪些方面以及基本的应用,下面简单介绍一下如何利用好chrome控制台这个神器好好调试javascript代码(这个才是我们真正能用到实处的地方) 1 ...
- PHP小程序后端支付代码亲测可用
小程序后端支付代码亲测可用 <?php namespace Home\Controller; use Think\Controller; class WechatpayController ex ...
- final、static、代码块、静态代码块、内部类、代码执行顺序
final final域使得确保初始化安全性(initialization safety)成为可能,初始化安全性让不可变形对象不需要同步就能自由地被访问和共享 作用在类上 ...
- 如何把if-else代码重构成高质量代码
原文:https://blog.csdn.net/qq_35440678/article/details/77939999 本文提纲: 为什么我们写的代码都是if-else? 这样的代码有什么缺点? ...
随机推荐
- 基于wavesurfer.js的超大音频的渐进式请求实现
最近在对超大音频的渐进式请求实现上面消耗了不少时间,主要是因为一对音频的基本原理不太理解,二刚开始的时候太依赖插件,三网上这块的资料找不到只能靠自己摸索.由于交互复杂加上坑比较多,我怕描述不清,这里主 ...
- 使用二叉搜索树实现一个简单的Map
之前看了刘新宇大大的<算法新解>有了点收获,闲来无事,便写了一个二叉搜索树实现的Map类. java的Map接口有很多不想要的方法,自己定义了一个 public interface IMa ...
- Service Discovery protocol(SDP)
locating services provided by Volume 3 , Part C , section 8 2.1sdp client-server architecture 2.2 se ...
- springcloud(五)-Ribbon
前言 先发句牢骚,最近太TM忙了,一直没时间静下心来继续写微服务架构!EMMMMMM..... 经过前文的讲解,我们已经实现了微服务的注册与发现.启动各个微服务时,Eureka Client会把自己的 ...
- sql geography类型(地理坐标) 赋值
sql 语句赋值 update [lishui].[dbo].[t_NearbyService] ,, ) ,[locationbaidu]=geography::Point(,, ) where [ ...
- JDK中ClassLoader的分类以及ClassLoader间的层次关系
几个常见的ClassLoader: bootstrap class loader: 最早启动的class loader,一般使用C语言,汇编语言,或是c++写的,用操作系统本地语言写的.这个cl ...
- Java多线程(三)锁对象和线程池
1:锁(Lock) 1.1 java提供了一个锁的接口,这个锁同样可以达到同步代码块的功能,API文档上说使用锁比使用synchronized更加灵活. 1.2 如何使用这个“ ...
- wpf 自定义ListView
1.listview.itemtemplate设置item的外层父元素的控件. 2.listview.template设置item的样式(datatemplate),也可以使用itemcontaine ...
- Django与前端的交互
在创建Django项目后,我们创建了一个App,我将这个App的名字命名为Cal,并在Cal这个文件夹下创建文件 templates. 创建templates文件夹以后,在项目settings.py文 ...
- CSS选择器详解(二)通用选择器和高级选择器
目录 通用选择器 高级选择器 子选择器 相邻兄弟选择器 属性选择器 通用选择器 通用选择器可以选择页面上的所有元素,并对它们应用样式,用 * 来表示. 语法: * { property1: value ...