David
David

Reputation: 93

calling method with C# in node.js module by the help of edge.js

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

Answers (2)

David
David

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

CodingGorilla
CodingGorilla

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

Related Questions