之前的文章有提到 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# 互通达到透明訪问的目的。

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

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

    javascript中的基本数据类型包括: Undefined, Null, Boolean, Number, String 5种数据类型 1. Undefined 类型 (只有一个值 undefin ...

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

    CommonJS Module 规范 CommonJS 的模块化规范描述在Modules/1.1.1 中 目前实现此规格的包有: Yabble,CouchDB,Narwhal (0.2), Wakan ...

  3. javascript 高级编程系列 - 继承

    1. 原型链继承 (缺点:子类继承父类的引用类型的属性值会在各个实例中共享,创建子类实例时无法向父类构造函数传递参数) // 定义父类构造函数 function SuperClass(father, ...

  4. javascript 高级编程系列 - 创建对象

    1. 工厂模式 function createPerson(name, age) { var obj = {}; obj.name = name; obj.age = age; obj.getName ...

  5. javascript 高级编程系列 - 函数

    一.函数创建 1. 函数声明 (出现在全局作用域,或局部作用域) function add (a, b) { return a + b; } function add(a, b) { return a ...

  6. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  7. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(上)

    学习ASP.NET Core Blazor编程系列一--综述 一.概述 Blazor 是一个生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 U ...

  8. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  9. Javascript模块化编程(三):require.js的用法

    Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...

随机推荐

  1. CREATE LANGUAGE - 定义一种新的过程语言

    SYNOPSIS CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name HANDLER call_handler [ VALIDATOR valfunctio ...

  2. zTree 点击文字 勾选check

    callback: { onClick:function(event, treeId, treeNode){ console.info("onClick") var treeObj ...

  3. java匹配http或https的url的正则表达式20180912

    package org.jimmy.autosearch20180821.test; import java.util.regex.Matcher; import java.util.regex.Pa ...

  4. scws分词配置

    1.下载安装包 wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 | tar xjf - 2.进入源码目录配置和编译 ...

  5. SqlSever锁及存储过程优化

    SqlSever锁及存储过程优化 SQL server的所有活动都会产生锁.锁定的单元越小,就越能提高并发处理能力,但是管理锁的开销越大.如何找到平衡点,使并发性和性能都可接受是SQL Server的 ...

  6. myBatis查询报错 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

    myBatis查询报错 You have an error in your SQL syntax; check the manual that corresponds to your MySQL se ...

  7. mac apache 配置

    mac系统自带apache这无疑给广大的开发朋友提供了便利,接下来是针对其中的一些说明 一.自带apache相关命令 1. sudo apachectl start 启动服务,需要权限,就是你计算机的 ...

  8. 理解ZAB协议

    ZAB协议 介绍 1.zab协议是为分布式协调服务zookpeer专门设计的一种支持崩溃恢复的原子广播协议 2.在zookeeper中主要依赖ZAB协议来实现数据一致性,基于该协议zk实现了一种主备模 ...

  9. loadrunner 添加负载机

    1.打开Controller 2. 添加负载 3. 配置参数 4.完成

  10. 杭电 2111 Saving HDU (贪心)

    Description 话说上回讲到海东集团面临内外交困,公司的元老也只剩下XHD夫妇二人了.显然,作为多年拼搏的商人,XHD不会坐以待毙的.   一天,当他正在苦思冥想解困良策的时候,突然想到了自己 ...