原文链接: http://www.cnblogs.com/zouzf/p/3971021.html

上一篇提到工程使用 XAML 和 Direct3D 项目模板 是因为要涉及到C++和C#的交互,微软给我们提供了一个叫运行时组件的东西(也就是 windows phone 运行时组件 模板,一下简称winRT组件)来实现两者的交互。winRT组件 工程里用的C++/CX语言(关于winRT自行谷歌),但完全兼容C++。在winRT组件 工程里,里面定义的类和方法只要符合一定的规范,就能被C#的工程直接访问到,那C++如何访问C#呢?毕竟,在Cocos2dx-wp8框架里,除了一开始启动是从xaml-C# 端开始之外,后面的运行都是在C++工程里,只是在有必要的时候,C++才会访问回C#,谷歌了一下,主流的解决方法是利用callback的思想实现,可以看看别人的实现: WP8:在WinRT组件(C++)中调用C#类库的解决方案  Calling C# method from C++ code in WP8  。

上面两篇文章基本上已经把C++和C#的交互这个问题比较清晰地解决掉了,但只是在winRT组件的C++和C#工程交互,而在我项目的具体实现里要求类似如下:C#工程依赖winRT工程,winRT工程依赖其他工程如Cocos2d工程(公司框架是直接在Cocos2d-x框架的源码基础上修改和增加,而不是使用Cocos2d-x项目生成的DLL)。如果Cocos2d工程有需要访问C#的话,怎么办?毕竟,Cocos2d工程才是作为主游戏逻辑的工程,而winRT工程更多是偏向于通道的作用,总不能把游戏逻辑的东西都挪到winRT工程里吧(虽然Cocos2d-x自带的HelloCpp例子是这样子做的~~)。

下面说一下个人的实现

前半段和上面那两个链接一样,实现winRT组件访问C#,需要注意的是在定义ICallxxx 接口的那个h文件里,别include太多自己的头文件,否则 被include的头文件 以及 被include的头文件里include的头文件(递归)所在的路径都要加到工程头文件依赖里。

后半段,在主游戏逻辑所在的工程里(winRT组件工程依赖主游戏逻辑工程),实现一个单例类,主要就是定义一个函数指针 void (*FunCallCS_ImageCropper)();//, h文件如下:

 class  WZCallCS_And_BackToLua_Image
{
public: static WZCallCS_And_BackToLua_Image* Share_GetInstance(); void (*FunCallCS_ImageCropper)();//在CX里被实现为调用CS的方法 private: static WZCallCS_And_BackToLua_Image* m_pInstance; WZCallCS_And_BackToLua_Image();
~WZCallCS_And_BackToLua_Image(); //把复制构造函数和=操作符也设为私有,防止被复制,只声明不实现,为什么?
WZCallCS_And_BackToLua_Image(const WZCallCS_And_BackToLua_Image&);
WZCallCS_And_BackToLua_Image& operator=(const WZCallCS_And_BackToLua_Image&); };

还记得winRT组件工程里的那个能被C#访问的类吧,那个类里有一个setCallback 方法,实现改为如下:

 void WZCallCS_And_BackToCX_Image::setCall_FromCXToCS(ICallCS_And_BackCX_Image^ callback)
{
globalCallCS = callback; WZCallCS_And_BackToLua_Image *callCS = WZCallCS_And_BackToLua_Image::Share_GetInstance(); callCS->FunCallCS_ImageCropper = [] ()
{
globalCallCS->getPictureFromPhotos("");
};
}

在这里给 单例类的函数指针 一个实现,让函数指针指向一个lambda表达式,实现内容就是访问一个在C#里实现的方法,如此一来,在C++里需要访问C#的时候,就获取那个单例类,调用单例类里的函数指针即可。需要注意的时候,把lambda表达式赋给一个函数指针时,lambda表达式的函数体里是不能捕获外部变量的,如果lambda表达式函数体里要访问什么,就只能通过静态变量 全局变量的方式来实现了。

需要注意的是,这部分工作必须早点做,也就是C#工程里继承winRT组件 ICallback的那个类必须尽早(最好在mainPage 的loaded事件里做)被创建并调用winRT组件那个类的setCallback 方法,否则单例类的函数指针有可能在初始化前就被调用了。整个流程可以理解在程序启动初始化的时候就搭好一条 C++和C# 交互的通道,主游戏逻辑想什么时候通过这条通道来访问C#都可以。

原文链接: http://www.cnblogs.com/zouzf/p/3971021.html

Cocos2d-x项目移植到WP8系列之三:C++和C#的交互的更多相关文章

  1. Cocos2d-x项目移植到WP8系列之二:开篇

    原文链接: http://www.cnblogs.com/zouzf/p/3970130.html 开发环境一笔带过吧,主板和CPU要支持虚拟化技术,要开启才行,装个64位win8.1系统,win8不 ...

  2. Cocos2d-x项目移植到WP8系列之一:前传

    原文链接: http://www.cnblogs.com/zouzf/p/3969993.html 许久没动笔了,随想一直都有动笔的想法,但拖来拖去,归根到底还是一个懒字吧 .发现人的惰性真是太强大了 ...

  3. Cocos2d-x项目移植到WP8系列之九:使用自定义shader

    本文原链接:http://www.cnblogs.com/zouzf/p/3995132.html 有时候想得到一些例如灰度图等特殊的渲染效果,就得用到自定义shader,关于shader的一些背景知 ...

  4. Cocos2d-x项目移植到WP8系列之八:CCLabelTTF显示中文不换行

    原文链接: http://www.cnblogs.com/zouzf/p/3985330.html 在wp8平台上,CCLabeTTF显示中文不会自动换行,看了下源码,原来底层的实现是根据text的空 ...

  5. Cocos2d-x项目移植到WP8系列之六:C#工程使用C++的DLL

    原文链接: http://www.cnblogs.com/zouzf/p/3984510.html 此时,一些大问题都被解决后,整个工程基本能跑起来了,最后一个大问题是:业务层是用Lua开发的,底层的 ...

  6. Cocos2d-x项目移植到WP8系列之四:文件操作

    原文链接: http://www.cnblogs.com/zouzf/p/3972457.html 读写文件Cocos已经用fopen fwrite来做好了,这里说的主要是文件和文件夹的创建.删除.判 ...

  7. Cocos2d-x项目移植到WP8系列之七:中文显示乱码

    原文链接:http://www.cnblogs.com/zouzf/p/3984628.html C++和C#互调时经常会带一些参数过去例如最常见的字符串,如果字符串里有中文的话,会发现传递过去后变成 ...

  8. Cocos2d-x项目移植到WP8系列之五:播放MP3

    原文链接: http://www.cnblogs.com/zouzf/p/3972549.html 这一块的细节还是不太了解,只是东凑西拼能跑起来而已 1.网上下载lamb库 生成需要的lib库,详情 ...

  9. Cocos2d-x项目移植到WP8小记

    Cocos2d-x项目移植到WP8小记 作者: K.C. 日期: 10/24/2013 Date: 2013-10-24 00:33 Title: Cocos2d-x项目移植到WP8小记 Tags: ...

随机推荐

  1. 猜数字游戏-python

    题目: 用python写一个猜数字的游戏,游戏规则如下: 1.由一个人随机写一个整数1-99(如:21) 2.一群小伙伴轮流猜数字,如第一个人猜一个数(如:48),则缩小范围至(1-48) 3.如第二 ...

  2. Unity3d Resources TextAsset 文本

    一些小型数据,可以用txt文本作为媒介,进行获取.传输.修改.存储: 比如:User1.2.3.txt,放入 Resources/Data 文件下: 一,Unity3d Resources.Load ...

  3. Android开发:fragment将事件传递回activity

    fragment触发事件后传递会给activity,可以通过在fragment中定义一个接口,让activity实现这个接口. 具体代码如下 public class AAFragment exten ...

  4. Android开发:使用DialogFragment实现dialog自定义布局

    使用DialogFragment实现dialog的自定义布局最大的好处是可以更好控制dialog的生命周期. TestFragment的代码: public class TestFragment ex ...

  5. 【BZOJ4724】[POI2017]Podzielno 数学+二分

    [BZOJ4724][POI2017]Podzielno Description B进制数,每个数字i(i=0,1,...,B-1)有a[i]个.你要用这些数字组成一个最大的B进制数X(不能有前导零, ...

  6. 《从零开始学Swift》学习笔记(Day 19)——函数参数传递

    原创文章,欢迎转载.转载请注明:关东升的博客   函数的语法格式如下: func 函数名(参数列表) -> 返回值类型 { 语句组 return 返回值 } 关键字是func. 多个参数列表之间 ...

  7. 微信小程序开发遇见的问题之一

    在开发的时候,因为要定位到当前的城市,而小程序提供的API只是能够获取当前的经纬度,所以我们需要通过接入百度地图的API.调接口的时候发现报错,说域名不合法,此时千万不要着急,只要你登录你的微信开发公 ...

  8. golang 面向对象

    深入理解GO语言的面向对象_Golang_脚本之家 https://www.jb51.net/article/94030.htm 深入理解GO语言的面向对象 更新时间:2016年10月04日 10:4 ...

  9. JavaScript获取地址栏内容

    例如地址为:http://www.mazey.net/baby/blog/index.php?a=1&b=2#c var query = window.location.href; //htt ...

  10. springboot集成h2

    h2数据库是常用的开源数据库,与HSQLDB类似,十分适合作为嵌入式数据库使用,其他的数据库大部分都需要安装独立的客户端和服务器端 h2的优势: (1)h2采用纯java编写,因此不受平台的限制 (2 ...