码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-12-02 20:54:58      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   ar   os   sp   on   文件   2014   

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;
}


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

标签:blog   http   io   ar   os   sp   on   文件   2014   

原文地址:http://blog.csdn.net/lee353086/article/details/41682431

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!