最近需要在Nodejs中用到C#的代碼,從網上了解到可以采用Edgejs來實現Nodejs與C#的代碼交互,
直接復制網上的代碼運行總是出各種錯,填了不少坑,現在把自己的案例代碼大致整理一下,方便以后自己查詢。
一、安裝Edge.js
運行命令行(CMD),進入當前項目的目錄,執行命令“npm install edge”進行安裝。(這里也可以選擇全局安裝,具體操作就不說了)
二、調用Edge.js
在用Edge.js和C#代碼交互的時候,有三種方式:
1. 第一種方式是將c#的代碼封裝成dll,然后在nodejs里面調用
代碼示例如下:
Nodejs:
// 引入Edge模塊var edge = require('./node_modules/edge'); // 定義方法var StudyMath = edge.func({
assemblyFile: '../../_lib/Rocky.dll', // assemblyFile為dll路徑 atypeName: 'RockyNamespace.Study', // RockyNamespace為命名空間,Study為類名 methodName: 'StudyMath' // StudyMath為方法名}); // s為傳遞方法傳遞的參數,result為方法返回的結果 StudyMath (s, function (error, result) { if (error) throw error; if (0 == result) ; // Successelse ; // Failure });
C#:
namespace RockyNamespace { public class Study { // C#中,方法必須用async異步修飾,且返回值必須為Task<object>,其中,input即為方法的參數,上文的s => input
public async Task<object> StudyMath(object input) { // 方法體
return 0; } } }
2. 第二種方式是將c#的代碼用async處理后直接在nodejs中書寫:
代碼示例如下:
Nodejs:
var edge = require('./node_modules/edge'); var StudyMath = edge.func(function () {/* //using System.Reflection; using System.Collections.Generic; async (input) => { // 方法體 return 0; } */});
// s為傳遞方法傳遞的參數,result為方法返回的結果
StudyMath (s, function (error, result) { if (error) throw error; if (0 == result) ; // Success
else ; // Failure
});
3. 第三種方式是第一種和第二種的結合
代碼示例如下:
Nodejs:
var edge = require('./node_modules/edge'); var StudyMath = edge.func(function () {/* using System.Collections.Generic; using System.Threading.Tasks; namespace RockyNamespace { public class Startup { // C#中,方法必須用async異步修飾,且返回值必須為Task<object>,其中,input即為方法的參數,上文的s => input public async Task<object> Invoke(object input) { // 方法體 return 0; } } } */});
// s為傳遞方法傳遞的參數,result為方法返回的結果
StudyMath (s, function (error, result) { if (error) throw error; if (0 == result) ; // Success
else ; // Failure
});
需注意的是,采用第三種方式的時候,必須將類名命名成Startup,方法名命名為Invoke,
因為在edge內部中,會默認將typeName定義為Startup,將methodName定義為Invoke
類似如下的定義:
var func= edge.func({ typeName: 'Startup', methodName: 'Invoke' });
Edgejs官網:
http://tjanczuk.github.io/edge/#/
這里推薦一篇寫的比較詳細的文章:
http://blog.csdn.net/kimmking/article/details/42708049