SWIG - C++同C#的混合编程(二)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/*
 * 功能:演示C++对C#的回调
 * 最后更新日期:2014-04-19
 * 作者: Kagula
 * 测试环境:Windows8.1 64bits, Visual Studio 2013 Update1, SWIG Win 3.0.0
 * */
namespace SWIG_Tutorial3_CSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //测试C++对C#代码的回调
            Caller myCaller = new Caller();

            // Test pure C++ class
            using (Base myBase = new Base())
            {
                makeCalls(myCaller, myBase);//C++控制台输出
            }

            // Test director / C# derived class
            using (Base myBase = new CSharpDerived())
            {
                makeCalls(myCaller, myBase);//C#控制台输出
            }

            //按任意键,退出应用程序
            Console.ReadKey();
        }

        /* 设置回调对象,并回调 */
        static void makeCalls(Caller myCaller, Base myBase)
        {
            myCaller.set(myBase);
            myCaller.UIntMethodCall(123);
        }
    }

    /* 测试对C++继承类的回调 */
    public class CSharpDerived : Base
    {
        public override uint UIntMethod(uint x)
        {
            Console.WriteLine("CSharpDerived - UIntMethod({0})", x);
            return x;
        }
    }
}

SWIG_Tutorial3.i文件清单
<pre name="code" class="plain">%module(directors="1") SWIG_Tutorial3 /* directors的设置是为了使SWIG支持回调 */

%{
/* 指定在当前文本中要引用到的头文件 */
#include "Caller.h"
%}

%feature("director") Base; /* 设置Base, C++回调C#用的基类 */

/* 解析头文件 */
%include "Caller.h"

Caller.h


<pre name="code" class="cpp">#pragma once

/*
功能:演示C++对C#的回调机制
作者:Kagula
测试环境:Windows 8.1 64bits, Visual Studio 203 Update1, SWIG Win3.0.0
参考资料:http://www.swig.org/Doc3.0/CSharp.html#CSharp_directors_example
*/
class Base {
public:
	virtual unsigned int UIntMethod(unsigned int x);
};

class Caller {
public:
	Caller() : m_base(nullptr) {}

	/* 不要释放从C#传进来的指针,这里遵循谁分配谁释放原则 */
	void set(Base *b) {
		m_base = b;
	}

	/* 回调测试 */
	unsigned int UIntMethodCall(unsigned int x)
	{
		if (m_base == nullptr)
			return -1;

		return m_base->UIntMethod(x);//callback
	}

private:
	Base *m_base;
};

Caller.cpp

#include "Caller.h"
#include <iostream>

unsigned int Base::UIntMethod(unsigned int x) {
	std::cout << "Base - UIntMethod(" << x << ")" << std::endl;
	return x;
}
时间: 2024-08-08 20:46:33

SWIG - C++同C#的混合编程(二)的相关文章

VC调用matlab dll方式混合编程(c风格--例2)&lt;二&gt;

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -B csharedlib:ellipsefit ellipsefit.m (此方式为c风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序设计>刘维,第

VC与Matlab混合编程之调用动态链接库dll(C++)——&lt;二&gt;

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -W cpplib:ellipsefit ellipsefit.m -T link:lib (此方式为c++风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序

SWIG - 同Java的混合编程

同Java的混合编程 - SWIG 最后更新日期:2014-04-20 阅读前提:推荐已经阅读<同C#的混合编程_SWIG入门>, 有Eclipse下编写JavaProject的经验. 作者: Kagula 环境:Windows 8.1 64bit(英文版).VisualStudio 2013 Update1(英文版).SWIG Win 3.0.0 .JDK 1.6.0_45 64bit.eclipse-jee-kepler-SR1-win32-x86_64 正文: 新建C++工程用于测试Ja

用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)

本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.android实现自绘日期选择控件 目的: 通过一个相对复杂的自定义自绘控件来分享: 1.ios以及android自定义自绘控件的开发流程 2.objc与c/c++混合编程 3.android ndk的环境配置,android studio ndk的编译模式,swig在android ndk开发中的作

TCL和C的混合编程

Tcl作为一种脚本语言具有非常高的效率,因此在实际的设计中我们可以采用TCl来完成一些对性能要求不是很高但是用C却需要很长开发周期的任务,而只把执行时间有很高的要求的部分采用C语言设计 1 在C中引用TCL时要包含头文件<tcl.h>编写,c中的所有tcl命令均通过TCL解释器Tcl_Interp完成.他是一个C结构体 主要的函数有 Tcl_Interp * Tcl_CreateInterp();//产生tcl解释器 Tcl_DeleteInterp(Tcl_Interp *interp);

【5.1送礼】国内第一部Matlab和C#.Net混合编程入门级视频教程【完全免费】

上一次写博客很久了,一直在忙彩票分析系统架构的事情,写博客真是件费神的事情,非常花时间.今天抽空发布这篇博客,是为了开源一部自己录制的视频教程-Matlab和C#.Net混合编程视频教程[入门级].下面说说这部视频教程的来由和一些事情,想获取的仔细看看,别忘了点[推荐]哦! 一.为啥要开源 1.1 视频的来源 这部视频教程是在2012年年底闲时比较多,当初也是很多朋友,网友提出这个Matlab.Net混合编程入门比较难,没有资料,所有就特意录制了一部比较简单的视频教程.并有条件的对广大网友免费开

C#和matlab混合编程

C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力.在此以一个小例子的形式给大家讲述一下二者混合编程的实现. 一.软件的配置说明 C#版本:VS2010        matlab版本:matlab2013a 二.把 matlab函数编译成dll文件 2.1首先写一个函数的.m文件(如下函数MatrixOpera实现两个矩阵的相加和相减) %--------------------------------------------------------

混合编程杂谈续——发布

上一篇简单的描述了一下混合编程中C++与python混合编程的操作,基本环节的搭建应该是没有什么问题了,这一篇说一下C++与python混合编程的发布问题,因为我们不能让客户和我们一样去了解程序的实现原理,他们要的只是一个结果,可以正常运行的程序,并不关心你的实现方式.因此我们要提供一个安装包,不依赖具体环境的可执行的程序. 在上一篇中我们实现了可以调用python脚本的环境,但是它的运行强烈的依赖环境,所以今天我们就要解决这个问题,将程序发布到其他别的机器上时不受限制. 今天在网上看了好多例子

【新年送礼】国内第一部C#.Net调用Matlab进行混合编程的视频教程【彻底免费无注册码】

其他混合编程文章 1[原创]Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码) 2.[原创]Matlab.NET混合编程技巧之——找出Matlab内置函数 3.[原创]Matlab与.NET混编解决人脸识别问题 4.[原创]Matlab与.NET基于类型安全的接口编程入门 5.[原创分享]Matlab.NET混编调用Figure窗体 一.视频说明 2014年的5.1,我将这套视频教程进行了免费下载,免费注册开放:[5.1送礼]国内第一部Matlab和C#.Net混合编程