本文转载自:http://blog.csdn.net/kimmking/article/details/42708049

1、  Edge是什么

Edge是一种在进程内实现NodeJS与.NET互操作的桥接技术,可以在NodeJS里使用.NET代码和库,也可以在.NET程序里使用NodeJS的代码。

Edge运行需要.netframework4.5,它使用.NET的Task、async、await机制跟NodeJS的event模型匹配。本质上是连接V8引擎和.NET /monoCLR运行时,同时支持Windows、MacOS、Linux。同时它还支持运行于.NET CLR上的各种脚本语言。借由这种进程内的桥接技术,两边的各种类库和其他技术就可以互通有无了,例如NodeJS使用.NET的图像处理库GDI+、直接用ADO.NET操作SQLServer数据库,甚至直接调用Winform的代码实现桌面UI程序等等。

Edge由微软的技术人员Tomasz Janczuk创建于2013年2月。

安装Edge很简单,只需要npm install –gd edge即可。

一个最简单的例子hello.js(NodeJS里使用C#代码):

var edge=require('edge');

varhelloWorld= edge.func(function () {/*

    async (input) => {  //这里是C#代码

        return ".NET Welcomes" + input.ToString();

    }

*/});

helloWorld('JavaScript',function (error, result) {

   if (error) throw error;

   console.log(result);

});

执行node hello.js时,会先调用.net framework编译/* */内的C#代码。然后执行整个混编的程序,整个过程只有一个node.exe的进程。

或另一种用法(C#里使用NodeJS代码):

using System;
using System.Threading.Tasks;
using EdgeJs; classProgram
{
publicstaticasyncvoidStart()
{
var func = Edge.Func(@"
return function (data, callback) {
callback(null, 'Node.js welcomes ' + data);
}
"); Console.WriteLine(await func(".NET"));
} staticvoidMain(string[] args)
{
Task.Run((Action)Start).Wait();
}
}

更多信息参见:Edge.js overview

项目Github主页:https://github.com/tjanczuk/edge

2、 Edge能做什么

除了上面例子提到的NodeJS与C#简单调用对方的代码实现,Edge还可以实现更复杂的功能,

2.1数据和函数传递

例如从NodeJS传递数据到.NET中去:

var dotNetFunction = edge.func('Edge.Sample.dll');

var payload = {
anInteger:1,
aNumber:3.1415,
aString:'foo',
aBoolean:true,
aBuffer:newBuffer(10),
anArray: [ 1, 'foo' ],
anObject: { a:'foo', b:12 }
}; dotNetFunction(payload, function (error, result) { });

直接把数据和函数传入C#,让C#回调NodeJS的函数:

var edge =require('edge');

var addAndMultiplyBy2 = edge.func(function () {/*
async (dynamic input) => {
var add = (Func<object, Task<object>>)input.add;
var twoNumbers = new { a = (int)input.a, b = (int)input.b };
var addResult = (int)await add(twoNumbers);
return addResult * 2;
}
*/}); var payload = {
a:2,
b:3,
add: function (data, callback) {
callback(null, data.a + data.b);
}
}; addAndMultiplyBy2(payload, function (error, result) {
if (error) throw error;
console.log(result);
});

需要注意的一点,为了防止进程内阻塞NodeJS的事件机制,NodeJS里无法直接调用.NET的方法,必须用Func<object,Task<object>>封装成异步回调方式。

2.2 .NET引用NodeJS的第三方库

classProgram
{
publicstaticasyncvoidStart()
{
var createWebSocketServer = Edge.Func(@"
var WebSocketServer = require('ws').Server; return function (port, cb) {
var wss = new WebSocketServer({ port: port });
wss.on('connection', function (ws) {
ws.on('message', function (message) {
ws.send(message.toUpperCase());
});
ws.send('Hello!');
});
cb();
};
"); await createWebSocketServer();
} staticvoidMain(string[] args)
{
Task.Run((Action)Start);
new ManualResetEvent(false).WaitOne();
}
}

简简单单,So easy!

2.3 ASP.NET里使用NodeJS代码

只需要用NuGet 安装Edge.JS,然后把node_modules复制到ASP.NET的webapplication里的bin目录即可。

2.4 NodeJS中使用基于.NET CLR的脚本语言

Python为例,3个步骤:

1)      安装依赖

npm install edge
npm install edge-py

2)      写混编代码

var edge =require('edge');

var hello = edge.func('py', function () {/*
def hello(input):
return "Python welcomes " + input lambda x: hello(x)
*/}); hello('Node.js', function (error, result) {
if (error) throw error;
console.log(result);
});

3)      执行

$>node py.js
Python welcomes Node.js

2.5 NodeJS中使用C#创建Winform桌面UI程序

NodeJS程序hello.js如下:

<span style="font-size:18px;">var edge = require('edge');  

var hello = edge.func(function () {/* 

         #r"System.Data.dll"
#r"System.Windows.Forms.dll"
#r"System.Drawing.dll" using System.Data;
using System.Threading.Tasks;
usingSystem.Windows.Forms;
usingSystem.ComponentModel;
usingSystem.Drawing; async(input) =>
{
Formf = new Form(); f.Text = "大漠穷秋";
Label l = new Label(); l.SetBounds(10, 10, 150, 20); l.Text = "飞猪"; f.Controls.Add(l);
TextBox t = new TextBox(); t.SetBounds(10, 35, 150, 20); t.Text = "理工男";f.Controls.Add(t);
ComboBox c = new ComboBox(); c.SetBounds(10, 60, 150, 20); c.Text ="翟伟"; f.Controls.Add(c);
Button b = new Button(); b.SetBounds(10, 85, 150, 30); b.Text = "棒棒糖";f.Controls.Add(b);
b.Click += (oo, ee) => { MessageBox.Show("this applicationcreated by KimmKing", "边边says"); };
l.BackColor = Color.Green; l.ForeColor = Color.Tomato; f.ShowDialog();
return".NET welcomes " + input.ToString();
}
*/}); hello('Node.js', function (error, result) {
if(error) throw error;
console.log(result);
});</span>

执行node hello.js,效果如下(官方没有这个方面的demo):

3、总结&&个人看法

Edge作为一个桥梁,打通了两个平台的任督二脉,基本上两边原有的东西,都可以相互调用,极大的增强了两个体系的功能拓展。

缺点也很明显:

1、性能:拿NodeJS调用C#来说,比原生的NodeJS差不少,see:Edge性能

2、融合:因为是桥接技术,其实还是两个完整独立的体系,无法细粒度的融合,比如直接用js调用winform的组件实现一套NodeJS的UI技术(如果要实现这一点,还需要一个复杂的中间层)。

(转)Edge实现NodeJS与.NET互操作(包括UI界面示例)的更多相关文章

  1. WebStorm开发Nodejs环境搭建,包括破解最新的WebStom11破解

    先放上链接:http://pan.baidu.com/s/1eQUJZGm 文件内包含注册码和WebStom11安装包,希望能够帮助到大家,少些周折

  2. Nodejs学习笔记(十一)--- 数据采集器示例(request和cheerio)

    目录 写在之前 示例 示例要求 采集器 加入代理 请求https 写在之后... 写在之前 很多人都有做数据采集的需求,用不同的语言,不同的方式都能实现,我以前也用C#写过,主要还是发送各类请求和正则 ...

  3. Nodejs学习笔记(十一)—数据采集器示例(request和cheerio)

    写在之前 很多人都有做数据采集的需求,用不同的语言,不同的方式都能实现,我以前也用C#写过,主要还是发送各类请求和正则解析数据比较繁琐些,总体来说没啥不好的,就是效率要差一些, 用nodejs写采集程 ...

  4. Javascript--练习(包括主界面图片轮播效果)

    练习一 例子1:做一个问题,如果输入的答案正确则弹出正确,错误弹出错误: 这里在text里面写了一个daan属性,里面存了答案的值,点击检查答案的时候cheak输入的内容和答案是否一样: Body中代 ...

  5. 今天才明白VC++.net的含义: VS系列的c++编译器可以支持托管C++(类似于C#,具体请看MS在线文档),当然包括winform界面开发。

    因此我决定用winform做界面,用C++写逻辑.当然尽量不用托管代码写逻辑.

  6. 再窥R(包括一个R示例)

    一.将输出作为输入——结果的重用 R有个特点,分析的结果可以保存下来,并可以作为进一步分析的输入使用.下面我们通过R中的预先安装好的数据集作为实例(这里只讲述原理,涉及到的统计知识,以后在另外的统计专 ...

  7. Linux强大屏幕截图方法,理论能截取任何图形界面,包括登录界面

    众所周知,屏幕截图可以使用“Print Screen”按键,但是,此按键的响应是靠系统的后台服务实现的,Linux在某些场景下,是不响应此按键的. 这里介绍一种更强大的截图方法,它是靠转储X图形环境的 ...

  8. MVC5知识点记录

    IIS/ASP.NET管道 原理永远是重中之重,所以在开篇的地方,先了解一下地址栏输入网址回车之后的故事. 不同IIS版本处理请求也不一样 IIS5 IIS 5.x 运行在进程InetInfo.exe ...

  9. 开发人员看测试之TDD和BDD

    前言: 已经数月没有来园子了,写博客贵在坚持,一旦松懈了,断掉了,就很难再拾起来.但是每每看到自己博客里的博文的浏览量每天都在增加,都在无形当中给了我继续写博客的动力.最近这两天有听到Jbehave这 ...

随机推荐

  1. 利用HTML5云存储实现模拟对比投票效果

    <!DOCTYPE HTML> <html> <head> <title>模拟对比投票效果</title> <meta name=&q ...

  2. cocos2d-html5如何更改预加载时的默认的logo图片和删除loading小圈圈

    找到框架目录(2.1.4)里的cocos2d目录里有个CCLoader.js文件,找到LoaderScene的构造方法ctor,可以看到有一行: this._logoTexture.src= &quo ...

  3. LabVIEW串口通信的一个例子-串口"示波器"

    1.程序界面:<ignore_js_op> 功能介绍:左边上方串口接收区,下方为串口字符发送区.右方为一个波形图表,在程序内部每次将串口发送过来的数据,以f%格式化,显示在波形图表上.按钮 ...

  4. Qt之QCheckBox

    简述 QCheckBox继承自QAbstractButton,它提供了一个带文本标签的复选框. QCheckBox(复选框)和QRadioButton(单选框)都是选项按钮.这是因为它们都可以在开(选 ...

  5. 【转】apache与tomcat的区别

    Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. Apache是web服 ...

  6. Linux(Ubuntu 13)下安装Eclipse

    1.本机配置及软件情况: Ubuntu版本:Ubuntukylin-13.10-desktop-i386(32位) JDK:jdk1.7.0_15(jdk-7u15-i856.gz) eclipse: ...

  7. 刚查了,Z3795不支持EPT,即WP8开发必须的SLAT,看来只能作为简单的WINDOWS备机了

    刚查了,Z3795不支持EPT,即WP8开发必须的SLAT,看来只能作为简单的WINDOWS备机了,也就只能做做文档编辑,脚本编写之类的. 数据来源 http://ark.intel.com/zh-C ...

  8. Spring MVC 属性文件读取注入到静态字段

    目录(?)[-] servlet-contextxml configproperties 示例属性 ConfigInfo 对应的配置bean 使用   在项目中,有些参数需要配置到属性文件xxx.pr ...

  9. leetcode 117 Populating Next Right Pointers in Each Node II ----- java

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  10. 第九章 C语言在嵌入式中的应用

    上章回顾 编码的规范和程序版式 版权管理和申明 头文件结构和作用 程序命名 程序注释和代码布局规范 assert断言函数的应用 与0或NULL值的比较 内存的分配和释放细节,避免内存泄露 常量特性 g ...