2

我想在 C# 中运行 Javascript 并在 C# 和 Javascript 之间传递变量。

似乎 ClearScript 是当前执行此操作的稳定方法。

我有一个看起来像这样的 JavaScript 函数:

var b = a[0];
var c = a[1];
var d = a[2];
var e = a[3];
rtnstr = "{errmsg: 'calculation never ran'}";

calculation()

function calculation() {
   rtnstr = "{ one:'" + a+b "', " two:'" + c+d + "'}";
}

我如何在 ClearScript 中调用它,传入a数组并取回rtnstr字符串。

我找到了这个 URL:https ://clearscript.codeplex.com ,它显示了如何检索整数数组;我需要它来检索一个字符串。

我还需要知道如何传入变量;该示例并未显示这一点。

4

3 回答 3

4

我不知道你是否还需要这个,但我偶然发现了你的问题并试了一下。

首先在您的解决方案中添加一个 JS 文件:

将 javascript 文件添加到您的解决方案中。

然后将您的 javascript 添加到 javascript 文件中:

var myArray = [0,1,2,3];
var a = myArray[0];
var b = myArray[1];
var c = myArray[2];
var d = myArray[3];
var rtnstr = "{errmsg: 'calculation never ran'}";

function calculation() {
   var one = a + b;
   var two = c + d;
   rtnstr = "{ one:'" + one  + "', two:'" + two + "'}";
   return rtnstr;
}

在您的 C# 代码中,然后执行以下操作:

using System;
using System.IO;
using Microsoft.ClearScript.V8;

namespace ClearScriptConsole
{
    class Program
    {
        static void Main(string[] args) {

            V8ScriptEngine _v8Engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging);

            string jsFilePath = @"..\..\HelloWorld.js";
            string jsContents = File.ReadAllText(jsFilePath);

            _v8Engine.Execute(jsContents);

            var returnedVal = _v8Engine.Script.calculation();
            Console.WriteLine(returnedVal);
        }
    }
}

返回值给了我以下信息:

计算结果显示在控制台窗口中。

干杯

于 2016-12-05T12:05:33.380 回答
3

我迟到了,还缺一美元,但这是另一种解决方案。在偶然发现 Intellisense 之前,我一直在寻找一个快速的答案。听起来您正在寻找 ClearScript 的“调用”方法:

假设您可能有一个 JavaScript 函数,例如:

function calculation(a) {
    var b = a[0];
    var c = a[1];
    var d = a[2];
    var e = a[3];

    return `{{ one: ${(b + c)}, two: ${(d + e)} }}`;
};

您希望使用整数数组从 C# 调用:

var rtnstr = engine.Invoke("calculation", new int[] { 1, 2, 3, 4, 5 });

ClearScript 5.6 中可能存在的错误:它似乎不喜欢函数变量。我最初试图将函数声明为:

const calculation = (a) => {
    var b = a[0];
    var c = a[1];
    var d = a[2];
    var e = a[3];

    return `{{ one: ${(b + c)}, two: ${(d + e)} }}`;
};

但我收到一个异常“找不到方法或属性”。不过,在全局范围内声明为普通的旧函数是可行的。

于 2019-12-04T14:13:25.030 回答
1

请注意,我还没有处理这个问题,并且正在尝试使用文档来连接这些点。

using Microsoft.ClearScript.V8;

public static void Main(string[] args)
{
    var engine = new V8ScriptEngine();
    engine.AddHostObject("a", args);    // it looks like a is the name of the variable that wil be used by script to refer to host object which is args in this case

    engine.Execute(".... your javascript code ....");
    var returnStr = engine.Script.rtnstr;
}   
于 2016-03-10T03:41:52.463 回答