(转)Edge实现NodeJS与.NET互操作(包括UI界面示例)
本文转载自: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界面示例)的更多相关文章
- WebStorm开发Nodejs环境搭建,包括破解最新的WebStom11破解
先放上链接:http://pan.baidu.com/s/1eQUJZGm 文件内包含注册码和WebStom11安装包,希望能够帮助到大家,少些周折
- Nodejs学习笔记(十一)--- 数据采集器示例(request和cheerio)
目录 写在之前 示例 示例要求 采集器 加入代理 请求https 写在之后... 写在之前 很多人都有做数据采集的需求,用不同的语言,不同的方式都能实现,我以前也用C#写过,主要还是发送各类请求和正则 ...
- Nodejs学习笔记(十一)—数据采集器示例(request和cheerio)
写在之前 很多人都有做数据采集的需求,用不同的语言,不同的方式都能实现,我以前也用C#写过,主要还是发送各类请求和正则解析数据比较繁琐些,总体来说没啥不好的,就是效率要差一些, 用nodejs写采集程 ...
- Javascript--练习(包括主界面图片轮播效果)
练习一 例子1:做一个问题,如果输入的答案正确则弹出正确,错误弹出错误: 这里在text里面写了一个daan属性,里面存了答案的值,点击检查答案的时候cheak输入的内容和答案是否一样: Body中代 ...
- 今天才明白VC++.net的含义: VS系列的c++编译器可以支持托管C++(类似于C#,具体请看MS在线文档),当然包括winform界面开发。
因此我决定用winform做界面,用C++写逻辑.当然尽量不用托管代码写逻辑.
- 再窥R(包括一个R示例)
一.将输出作为输入——结果的重用 R有个特点,分析的结果可以保存下来,并可以作为进一步分析的输入使用.下面我们通过R中的预先安装好的数据集作为实例(这里只讲述原理,涉及到的统计知识,以后在另外的统计专 ...
- Linux强大屏幕截图方法,理论能截取任何图形界面,包括登录界面
众所周知,屏幕截图可以使用“Print Screen”按键,但是,此按键的响应是靠系统的后台服务实现的,Linux在某些场景下,是不响应此按键的. 这里介绍一种更强大的截图方法,它是靠转储X图形环境的 ...
- MVC5知识点记录
IIS/ASP.NET管道 原理永远是重中之重,所以在开篇的地方,先了解一下地址栏输入网址回车之后的故事. 不同IIS版本处理请求也不一样 IIS5 IIS 5.x 运行在进程InetInfo.exe ...
- 开发人员看测试之TDD和BDD
前言: 已经数月没有来园子了,写博客贵在坚持,一旦松懈了,断掉了,就很难再拾起来.但是每每看到自己博客里的博文的浏览量每天都在增加,都在无形当中给了我继续写博客的动力.最近这两天有听到Jbehave这 ...
随机推荐
- 利用HTML5云存储实现模拟对比投票效果
<!DOCTYPE HTML> <html> <head> <title>模拟对比投票效果</title> <meta name=&q ...
- cocos2d-html5如何更改预加载时的默认的logo图片和删除loading小圈圈
找到框架目录(2.1.4)里的cocos2d目录里有个CCLoader.js文件,找到LoaderScene的构造方法ctor,可以看到有一行: this._logoTexture.src= &quo ...
- LabVIEW串口通信的一个例子-串口"示波器"
1.程序界面:<ignore_js_op> 功能介绍:左边上方串口接收区,下方为串口字符发送区.右方为一个波形图表,在程序内部每次将串口发送过来的数据,以f%格式化,显示在波形图表上.按钮 ...
- Qt之QCheckBox
简述 QCheckBox继承自QAbstractButton,它提供了一个带文本标签的复选框. QCheckBox(复选框)和QRadioButton(单选框)都是选项按钮.这是因为它们都可以在开(选 ...
- 【转】apache与tomcat的区别
Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. Apache是web服 ...
- Linux(Ubuntu 13)下安装Eclipse
1.本机配置及软件情况: Ubuntu版本:Ubuntukylin-13.10-desktop-i386(32位) JDK:jdk1.7.0_15(jdk-7u15-i856.gz) eclipse: ...
- 刚查了,Z3795不支持EPT,即WP8开发必须的SLAT,看来只能作为简单的WINDOWS备机了
刚查了,Z3795不支持EPT,即WP8开发必须的SLAT,看来只能作为简单的WINDOWS备机了,也就只能做做文档编辑,脚本编写之类的. 数据来源 http://ark.intel.com/zh-C ...
- Spring MVC 属性文件读取注入到静态字段
目录(?)[-] servlet-contextxml configproperties 示例属性 ConfigInfo 对应的配置bean 使用 在项目中,有些参数需要配置到属性文件xxx.pr ...
- 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 ...
- 第九章 C语言在嵌入式中的应用
上章回顾 编码的规范和程序版式 版权管理和申明 头文件结构和作用 程序命名 程序注释和代码布局规范 assert断言函数的应用 与0或NULL值的比较 内存的分配和释放细节,避免内存泄露 常量特性 g ...