.Net 与 Javascript 混合编程系列

之前的文章有提到 edge 和 nodejs 交互,通过node的模块为C# 提供一些扩展,这个还是比较方便。这里说下为什么要使用js。

1.SharpKit是一个用于在编译时将C#语言转换为JavaScript的工具。

从试用上来说还是比较强大的,基本上支持大部分语法。

2.c# 虽然是比较强大的,但是在一些方面还是比较薄弱的,而且在一些平台上还有些限制。

比如 ios 平台上unity3d 不能做到热更新,当然大部分时间都是用不到热更新的。但是如果想用的时候能用还是不错的。

要解决的问题?

如何打通C#和JS间的桥梁,已经有多个实现,比如上文提到的edge就是一个解决方案。

或者jint,Jurassic,ironjs这样的动态语言,也许性能上没v8强大,但是满足日用基本上也是足够了。

基于传统的值之间的传递,需要对模块进行严格的切割,在开发中需要预留接口,或者进行专门的模块设计,会导致开发中的进度拖慢,或者导致开发中的部分问题。

如何能达到无缝接入和侵入是现在所需要考虑的问题。

首先,我们多多少少都有一些已经存在的模块,旧有的模块可能需要一些底层的类库使用继承或者接口达到一些设计上的便利,但是跨语言/引擎的继承基本上是不可实现的。

然后,如果在开发中就需要考虑js的接入,那么会对开发人员能力带来考验,需要一个即会js又会c#的势必带来更高的开发难度,这样是我们所不愿意看到的。

那么,我们期望是什么?

我们期望在开发完成后,以最小的代价进行代码模块的切换,从发布手段上达到无缝切换引擎的目的,不管是nodejs 还是 dlr类引擎。

然后,为什么我们可能需要这样的切换。除了上文说到的热更新,那么可以跟上V8的大潮不得不说是一件比较开心的事情,nodejs,html5,等等,都是在可预想的范围内的。

最后,问题来了,为什么是c#,而不是js?

这得不得不从强大的VS说起,一个强大的IDE是效率开发的根本,而c#有着较低的入门门槛,在mono的大前提下,理论上所有平台移植已经都不是问题,但是js似乎更轻量一点,因为所有的平台上都有浏览器,旧有无所不在的js引擎,而各家不断竞争的js引擎大赛也是促成js遍地开花的原因之一。

设想:

1.首先,我们要解决对象继承问题,有的人说oo已死,这是仁者见仁,智者见智的事情,这里暂不讨论,我们说一下如何模拟继承,继承的好兄弟有另外一个,叫 组合,我们从js层创建 一个基础对象,然后里面包含一个 c# 的object,然后通过反射把所有的方法通过反射映射到 js 对象上,我们就拥有了第一个完成继承的伪对象。从使用上并没有什么问题,只有经过类型判断和类型转换的时候我们需要重写一些机制。流程大约是这样的:

c#/js调用某个对象的方法-》找到js方法-》调用c#内部对象方法-》返回结果

c#/js调用某个对象的方法-》找到js方法-》返回结果

2.接口,由于接口必须创建一个实现接口的对象,那么在无法动态创建类的平台上,我们就没有办法了,所以我们必须创建一个通用接口,暂时叫 Js通用接口,(可以由代码生成器默认生成)内部就是一个空的实现,有个入口跳转到js,流程大概是这样:

c# -》接口-》通用接口-》调用js中的方法-》返回结果

从这样的一种方式,我们实现了js实现c#接口的曲线救国方式。

3.重载,类似接口,必须通过一个代理模式实现,上面继承模式说明js类中必须包含一个c#的底层类,那么我们将这个底层类变成所谓的代理类,代理类中的方法调用指向的是js中的方法,由于代理类是继承与c#类的,那么他的实例化应该是 c#代理类(js类),那么我们的流程大概是这样:

c#-》方法-》代理类方法-》js对象方法(如果无重载)-》调用c#内部对象方法-》返回结果

从以上3点设想可以看出,我们需要提供一个代理类,也就是需要导出的接口的代理类,或者需要继承对象的代理类。然后通过js《-》c# 互通达到透明访问的目的。

时间: 2024-09-29 08:38:21

.Net 与 Javascript 混合编程系列的相关文章

.Net 与 Javascript 混合编程系列(如何穿透.net 和 js 的边界)

上一篇研究了如何做到CS和JS互相透明访问的设想,经过一些实践,这里做出了一个小DEMO. 这里有第一个演示类: public class TestCSClass { public TestCSClass() { } //如果可被重写则重载 public virtual object Method1() { Console.WriteLine("CS CALL!!"); return "Hello CS"; } } 简单的C#代码,然后有个可重载的方法 Metod1

ATL - JavaScript混合编程

JavaScript混合编程- ATL 最后更新日期:2014-5-10 环境:Windows8.1 64bit英文版,Visual Studio 2013 Professional Update1英文版 阅读前提:COM的基本概念 内容简介 ATL(ActiveTemplate Library)是微软为了简化COM编程提供的一套C++模板,这里介绍如何用ATL建立一个简单的轻量级COM服务供JavaScript脚本调用,使我们对ATL的使用有个概念. Hello,World 使用Adminis

Javascript模块化编程系列三: CommonJS & AMD 模块化规范描述

CommonJS Module 规范 CommonJS 的模块化规范描述在Modules/1.1.1 中 目前实现此规格的包有: Yabble,CouchDB,Narwhal (0.2), Wakanda, TeaJS (formerly v8cgi), CommonScript, PINF JS Loader, SeaJS, ArangoDB, sorrow.js 注意,这里并没有找到 requireJS,因为它使用的是AMD规范. 此规范定义的具体内容包括: Requirerequire是一

javascript 高级编程系列 - 基本数据类型

javascript中的基本数据类型包括: Undefined, Null, Boolean, Number, String 5种数据类型 1. Undefined 类型 (只有一个值 undefined, 常被用来表示未初始化的变量) 如果一个变量未进行初始化则它的初始值为undefined, 数据类型为Undefined var myVar; myVar === undefined               // return true typeof myVar === 'undefine

javascript 高级编程系列 - 函数

一.函数创建 1. 函数声明 (出现在全局作用域,或局部作用域) function add (a, b) { return a + b; } function add(a, b) { return add1(a,b); function add1(m, n) { return m + n; } }    2. 函数表达式 作为普通变量 var add = function (a, b){ return a + b; }; 作为对象方法 var obj = { value: 0, add: fun

解决问题1:可以从桌面显示到FORM MFC/HALCON混合编程系列一_打开图像_简单处理_

没法爱上新浪  转载:http://blog.sina.com.cn/s/blog_812e326f010110og.html 从图1到图2 图1(在桌面显示了) open_window(0,0, Width/2, Height/2,0,"visible","",&WindowHandle); 更改为: Hlong MainWndID =(Hlong) m_hWnd; open_window(0,0, Width/2, Height/2,MainWndID,

【iOS与EV3混合机器人编程系列之三】编写EV3 Port Viewer 应用监测EV3端口数据

在前两篇文章中,我们对iOS与EV3混合机器人编程做了一个基本的设想,并且介绍了要完成项目所需的软硬件准备和知识准备. 那么在今天这一篇文章中,我们将直接真正开始项目实践. ==第一个项目: EV3 Port Viewer== 项目目的:在iOS设备上通过WiFi连接EV3并且读取EV3每个端口的数据. 大家可以一周之后在App Store上搜索EV3 Port Viewer,那么我已经做了一个范例App发布了,正在审核中 应用的基本使用要求:将EV3和iPhone同时连接到同一个WiFi网络中

【iOS与EV3混合机器人编程系列之二】工欲善其事,必先利其器(准备篇)

在上一篇文章中,我们论述了iOS与EV3结合后机器人开发的无限可能, 那么,大家要不要一起来Hacking一把呢? 为了能够完整地完成我接下来我讲的项目,我们需要做以下准备: 1.一台Mac运行MAC OS X 10.9.3以上的操作系统. 2.Xcode6.这是iOS在Mac上的开发工具.我们将使用Xcode来进行所有的项目程序的编写 3.一两个iOS设备,iPhone或iPad都行.实际上大家最好有两个iOS设备,因为最后的项目中iPhone将和EV3机器人放在一起,而用另一个iOS设备来查

【iOS与EV3混合机器人编程系列之五】iOS_WiFi_EV3_Library 剖析之连接EV3

在上一篇文章中,我们讲解了如何用开源代码库CocoaAsyncSocket来实现iOS上的UDP和TCP数据通信.那么在本文中,我们将介绍在CocoaAsyncSocket的基础如何使用UDP和TCP连接EV3的机制. 之所以我们能够通过无线连接EV3,根本原因在于EV3的源代码内建了一套无线连接通信的机制. 这套机制是这样的: 1)EV3在连接到无线网络后,就不断地从3015端口发送UDP数据,数据的格式如下: Serial-Number: 0016533f0c1ePort: 5555Name