2016-03-08 5 views
0

Я пытаюсь использовать edge.js для использования модуля node.js в C#.метод вызова с C# в модуле node.js с помощью edge.js

Я могу получить доступ к свойству модуля, но не к методу.

using System; 
using System.Threading.Tasks; 
using EdgeJs; 

class Program 
{ 

    static void Main(string[] args) 
    { 
     Start().Wait(); 
    } 

    public static async Task Start() 
    { 
     var func = Edge.Func(@"return require('../require.js')"); 
     var invoke = func.Invoke(new { }); 
     var require = (dynamic)invoke.Result; 

     Console.WriteLine(require.answer1); // answer 1 

     var deleg = require.answer2; 
     Console.WriteLine(deleg); 
     var task = deleg.Invoke(1); 
     Console.WriteLine(task); 

     // var result = await task.Run(); // error 
     // Console.WriteLine(result); 


    } 

} 

require.js

module.exports = function (data, callback) { 
    var module = require('./module'); 
    var result = module; 
    callback(null, result); 
}; 

module.js

exports.answer1 = "answer 1"; 
exports.answer2 = function() { 
    return "answer 2"; 
}; 

Есть ли способ, я могу вызвать функцию в node.js из C# и доступ к "ответ 2"?

Здесь ошибка:

answer 1 
System.Func`2[System.Object,System.Threading.Tasks.Task`1[System.Object]] 
System.Threading.Tasks.Task`1[System.Object] 

Unhandled Exception: System.AggregateException: One or more errors occurred. --- 
> Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: No overload for method 
'Run' takes '0' arguments 
    at CallSite.Target(Closure , CallSite , Object) 
    at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T 
0 arg0) 
    at Program.<Start>d__d.MoveNext() in c:\Users\admin\Documents\Visual Studio 2 
013\Projects\snippets\snippets\Program.cs:line 26 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceled 
Exceptions) 
    at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationTo 
ken cancellationToken) 
    at System.Threading.Tasks.Task.Wait() 
    at Program.Main(String[] args) in c:\Users\admin\Documents\Visual Studio 2013 
\Projects\snippets\snippets\Program.cs:line 10 
Press any key to continue . . . 
+0

Что 'Console.WriteLine (deleg)' производить? – CodingGorilla

+0

System.Func'2 [System.Object, System.Threading.Tasks.Task'1 [System.Object]] – David

+0

«Нет перегрузки для метода« Выполнить »принимает« 0 »аргументы» означает, что я думаю, что отсутствуют аргументы, но У метода node.js нет аргументов, поэтому я не понимаю, какие аргументы следует отправлять. – David

ответ

2

Я думаю, вам нужно настроить свой код следующим образом:

var deleg = require.answer2; 
Console.WriteLine(deleg); 
var task = (Func<object,Task<object>>)deleg; 
Console.WriteLine(task); 

var result = await task(1); 
Console.WriteLine(result); 

Я принял это непосредственно из GitHub ридми, но по существу призвании вызова на функцию фактически не работает с обычным синхронным делегатом, вместо этого он просто сразу возвращает управление, но не предоставляет планировщик, который может фактически запустить задачу.

+0

Я ничего не могу получить за результат. Он выводит делегат: System.Func'2 [System.Object, System.Threading.Tasks.Task'1 [System.Object]] и для задачи: System.Func'2 [System.Object, System.Threading.Tasks.Task '1 [System.Object]] – David

+0

Что выводит последняя строка, или она все еще висит на ожидании? – CodingGorilla

+0

Это было частью решения в любом случае! – David

0

Ответ будет изменить module.js на:

exports.answer2 = function (input, cb) { 
    cb(null, "answer 2"); 
}; 

Я получил ответ от edge.js