在Nodejs中如何调用C#的代码

最近需要在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

时间: 2025-01-06 02:05:52

在Nodejs中如何调用C#的代码的相关文章

PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码

PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) , 已有13次阅读 ,共0个评论 依照我一惯得套路,我会先说一点废话. PhoneGap和Cordova什么关系?为什么有的地方叫Cordova而有的地方叫PhoneGap ?PhoneGap是一款HTML5平台.通过它,开发商能够使用HTML.CSS及JavaScript来开发本地移动应用程序.因此,眼下开

java中方法调用

JAVA中方法的调用[基础] 一.调用本类中的方法 方法一.被调用方法声明为static ,可以在其他方法中直接调用.示例代码如下: public class HelloWord { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str="HelloWord!"; int a=0; int b=a+1; int result=

FreeSWITCH IVR中lua调用并执行nodejs代码

一.功能需求: 通过FreeSWITCH的IVR按键调用相应的脚本文件:nodejs提供很多的模组,可以方便的与其它系统或者进行任何形式的通讯,我的应用是通过nodejs发送http post请求: 由于不太熟悉FreeSWITCH直接调动执行nodejs文件的方法,所以我通过执行Lua脚本,在lua脚本中执行对nodejs文件的调用并执行,具体的设定记录如下: 二.具体设定: ①IVR设定: <entry action="menu-exec-app" digits="

C代码中如何调用C++ C++中如何调用C

1. 在C++中调用C:使用extern "C"则是告诉编译器依照C的方式来编译封装接口,当然接口函数里面的C++语法还是按C++方式编译. 包装(wrapper) 2. 在C中调用C++:extern "C" 的作用是:让C++连接器找调用函数的符号时采用C的方式 注意这里的C调用C++或者C++调用C意思是.c文件中调用.cpp文件中代码,或者相反. 集成开发环境如VC++6.0或者vs都是以文件后缀来区别当前要编译的是C代码还是C++代码,然后采用响应的编译.

在UIWebView中间接调用网页中的javascript代码获得想要的值

日记和一些废话: 今天在使用webView加载网页后, 发现网页中的点击事件是用js代码实现的, 可是怎么点击都没有反应, 而且我主要是想获取到点击事件转到的url , 后来发现html中又这么一段代码: document.addEventListener('WebViewJavascriptBridgeReady', function onBridgeReady(event) function openPage(pageUrl) { if(bridge) { bridge.send(pageU

ASP.NET中前台javascript与后台代码调用

ASP.NET中前台javascript与背景代码调用 1如安正在JavaScript访问C#函数? 2.如安正在JavaScript访问C#变量? 3.如安正在C#中访问JavaScript的已经有变量? 4.如安正在C#中访问JavaScript函数? 标题1谜底以下: javaScript函数中实施C#代码中的函数: 方法一:一.起首成立一个按钮,正在背景将调用或许搞定的内容写入button_click中; 二.正在前台写一个js函数,内容为document.getElementById(

ASP.NET中JavaScript 调用后台代码

前序:在不需要右击页面或回发的情况下刷新页面,即JS调用后台代码: 方法一:调用隐藏服务端按钮的点击事件 1.在前端放一个隐藏按钮,将需要调用的后台代码写入OnClick事件中; 2.在前台写一个js函数,函数体为document.getElementById("<%=btnID.ClientID%>").click(); 3.在需要刷新的地方调用js函数,即可调用按钮OnClick事件: 4.此方法适用无返回值: 方法二:JS中直接用<%=MethodName()%

在Java中直接调用js代码(转载)

http://blog.csdn.net/xzyxuanyuan/article/details/8062887 JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert” is not defined.   package com.sinaapp.manjushri;  import javax.script.ScriptEngine;  import

&lt;frameset&gt;框架集中不同&lt;frame&gt;之间的调用【js代码中】

top:永远指分割窗口最高层次的浏览器窗口;parent:包含当前分割窗口的父窗口,本文将围绕js中top.parent.frame进行讲述及他们的应用案例 引用方法top: 该变量永远指分割窗口最高层次的浏览器窗口.如果计划从分割窗口的最高层次开始执行命令,就可以用top变量. parent: 该变量指的是包含当前分割窗口的父窗口.如果在一个窗口内有分割窗口,而在其中一个分割窗口中又包含着分割窗口,则第2层的分割窗口可以用parent变量引用包含它的父分割窗口. 附:Window对象.Pare