如何使用 jint return 来自 C# 函数的值?

How do I return a value from a C# function using jint?

我目前正在使用 Jint (https://github.com/sebastienros/jint) 来处理 JavaScript。

我希望能够在 JavaScript 中使用自定义函数,该函数将执行在 C# 中创建的函数,然后 return 为 JavaScript.

例如,如果 JavaScript 是:

var x = MultiplyByTwo(100);

在我的 C# 中我有:

private static int MultiplyByTwo(int obj)
{
    return obj * 2;
}

那么上面的代码会给变量 x 赋值为 200。

根据文档,有以下选项:

var engine = new Engine()
.SetValue("log", new Action<object>(Console.WriteLine));

engine.Execute(@"
    function hello() { 
        log('Hello World');
    };
 
    hello();
");

我可以用函数名替换“Console.Writeline”,但它只接受无效函数。 换句话说,这可以从 JS 调用 C# 函数,但不能 return 一个值。

Jint 中是否存在我正在寻找的选项?

你当然可以引用一个class,它可以涉及设置属性,方法可以return值。例如:

class Program
{
    static void Main(string[] args)
    {
        var myobj = new MyClass();
        var engine = new Engine()
            .SetValue("log", new Action<object>(Console.WriteLine))
            .SetValue("myobj", myobj);

        engine.Execute(@"
        function hello() { 
            myobj.One = 'asdf';
            var x = myobj.TwoTimes(4);
            log(x); // logs 8
        };
    
        hello();
    ");
        Console.WriteLine($"{myobj.One}, {myobj.Two}");
        // output => "asdf 8"
    }

}

public class MyClass
{
    public string One { get; set; }
    public int Two { get; set; }
    public int TwoTimes(int value)
    {
        Two = 2 * value;
        return Two;
    }
}

如某些评论中所述,使用

SetValue("multiplyByTwo", new Func<int>(MultiplyByTwo))

这是一个功能齐全的示例。需要转换 Console.WriteLine,因为有多个重载,我们需要告诉编译器使用哪一个:

using System;
using Jint;

var engine = new Engine()
    .SetValue("multiplyByTwo", MultiplyByTwo)
    .SetValue("log", (Action<string>)Console.WriteLine)
    ;
    
engine.Execute(@"
    var x = multiplyByTwo(3);
    log(x);
");

static int MultiplyByTwo(int obj)
{
    return obj * 2;
}