Reputation: 93
I'm trying to use edge.js for using a node.js module within C#.
I can access a property of the module, but not a method.
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";
};
Is there a way I can call the function in node.js from C# and access "answer 2"?
Here the error:
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 . . .
Upvotes: 0
Views: 1685
Reputation: 93
The answer would be to change module.js to:
exports.answer2 = function (input, cb) {
cb(null, "answer 2");
};
I got the answer from edge.js
Upvotes: 0
Reputation: 19842
I think you need to adjust your code to the following:
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);
I took this directly from the github readme, but essentially calling invoke on the function doesn't actually work like it would with a normal synchronous delegate, instead it just returns control immediately but does not provide a scheduler that can actually run the task.
Upvotes: 2