本文轉載自: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(8080); } 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技術(如果要實現這一點,還需要一個復雜的中間層)。
