之前的文章有提到 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. react link引入外部css样式的坑

    刚开始的代码是这样的,使用react router4.x写的demo路由跳转后,页面的没有渲染,是因为没有引入外部css文件(或者说引入外部文件路径错误) <!DOCTYPE html> ...

  2. vs2008如何新建自己工程的环境变量(局部)和 Windows系统(全局). .

    在vs2008的Project->Property设置里经常会看到类似$(IntDir).$(OutDir).$(ProjectName) 的预定义宏.以vc2008为例,有时候我们在引用别的库 ...

  3. sizeof and strlen 的区别

    首先,strlen 是函数,sizeof 是运算操作符,二者得到的结果类型为 size_t,即 unsigned int 类型.大部分编译程序在编译的时候就把 sizeof 计算过了,而 strlen ...

  4. buf.fill()

    buf.fill(value[, offset[, end]][, encoding]) value {String} | {Buffer} | {Number} offset {Number} 默认 ...

  5. Python关于函数作为返回值的理解(3分钟就看完了)

    话不多说,直接看例子,上代码: def line_conf(): def line(x): return 2 * x + 1 return line #return a function object ...

  6. Spring Quartz 和 Spring Task使用比较

    Quartz 和 Spring Task执行时间对比: 1. Quartz同步模式:一个任务的两次执行的时间间隔是:“执行时间”和“trigger的设定间隔”的最大值 2. Task默认同步模式:一个 ...

  7. Spring核心技术(六)——Spring中Bean的生命周期

    前文已经描述了Bean的作用域,本文将描述Bean的一些生命周期作用,配置还有Bean的继承. 定制Bean 生命周期回调 开发者通过实现Spring的InitializeingBean和Dispos ...

  8. CSDN编写技巧--CSDN中高亮显示代码

    1, 最近在编写CSDN博客的时候,有种生不如死的感觉,就是如下的现象: 除了图中圈红圈的部分,还有就是背景色是灰色,并且,关键字不高亮显示,起始正常的情况下,也会有这块区域的最上边这行. 2, 有一 ...

  9. Springboot+dubbo+zookeeper整合

    本想自己搭建一个Spring+dubbo+zookeeper整合好的框架,想寻找个最佳实现但是遇到各种各样的问题,只好自己看看dubbo starter的源码 整理如下: 通过打上断点来看配置的对不对 ...

  10. 如何在matlab里安装libsvm包

    有时我们需要用到SVR(支持向量回归)方法,而 matlab 自带的svm工具箱不能做回归分析,于是有了安装libsvm包的打算. 中间遇到一些困难,比如找不到编译器等等,经过一下午和一晚上的努力,在 ...