今天要介紹的是edge.js這個github上剛興起的開源項目,它可以讓node.js和.net之間在in-process下互操作。.net版本在4.5及以上,因為.net4.5帶來的Task,asyn,await關鍵字和node.js的Event模型正好匹配。如果你感興趣的話,可以參見githubhttps://github.com/tjanczuk/edge 和Edge.js overview.
下面這幅圖展示了edge.js在node.js和.net之間互操作的橋梁。Fun<object,Task<object>>表示輸入為object類型,輸出為Task<object>,后者對應node.js中的回調函數,前者則為.net方法輸入參數。更多詳情請參見github readme。
下面我們寫個菲波基數作為demo嘗鮮:完整項目寄宿在github:edge-demo。
1 var edge = require('edge'); 2 3 var fib = edge.func({ 4 source: function() {/* 5 6 using System; 7 using System.Linq; 8 using System.Threading.Tasks; 9 10 public class Startup 11 { 12 public async Task<object> Invoke(object input) 13 { 14 int v = (int)input; 15 var fib = Fix<int, int>(f => x => x <= 1 ? 1 : f(x - 1) + f(x - 2)); 16 return fib(v); 17 } 18 19 static Func<T, TResult> Fix<T, TResult>(Func<Func<T, TResult>, Func<T, TResult>> f) 20 { 21 return x => f(Fix(f))(x); 22 } 23 24 static Func<T1, T2, TResult> Fix<T1, T2, TResult>(Func<Func<T1, T2, TResult>, Func<T1, T2, TResult>> f) 25 { 26 return (x, y) => f(Fix(f))(x, y); 27 } 28 } 29 30 */}, 31 references: ['System.Core.dll'] 32 }); 33 34 fib(5, function (error, result) { 35 if (error) console.log(error); 36 console.log(result); 37 }); 38 39 var fibFromFile = edge.func(__dirname + "/fib.cs"); 40 fibFromFile(5, function (error, result) { 41 if (error) console.log(error); 42 console.log(result); 43 }); 44 45 var fibFromDll = edge.func({ 46 assemblyFile: 'edge.demo.dll', 47 typeName: 'edge.demo.Startup', 48 methodName: 'Invoke' 49 }); 50 fibFromDll(5, function (error, result) { 51 if (error) console.log(error); 52 console.log(result); 53 });
效果:
這里分為3類調用,直接源碼嵌入node.js和文件外置,以后編譯后的dll,多的不用說,其實很簡單,如果你和一樣同樣喜歡js和.net的話。
在當下node.js剛興起,成型的框架還不夠多,或者有時我們必須以c或者c++來完成node.js的本地擴展的時候,edge.js給我們提供了另一個可選的途徑就是 強大的.net大家族。