【问题标题】:How to run a jscript using C# and return the values in an array?如何使用 C# 运行 jscript 并返回数组中的值?
【发布时间】:2011-10-10 01:56:47
【问题描述】:

嗯,我在 javascript 中有很多变量,我需要获取值(我从其他页面获取)。 最好的方法是什么? 我正在使用 Microsoft.Jscript 类,你的方法可以工作。

我写了以下代码:

    static Dictionary<string, string> ParseVariables(string code)
        {

            string[] variables = code.Split(';');
            Dictionary<string, string> variablesValues = new Dictionary<string, string>();
            for (int i = 0, len = variables.Length - 1; i < len; i++)
            {
                string vvar = variables[i];
                string varName = Regex.Replace(vvar.Split('=')[0], @"^\s*var\s*", string.Empty).Trim();
                var compiler = Compile(vvar);                
               string varValue = compiler.ToString();
                variablesValues.Add(varName, varValue);
            }

            return variablesValues;

        }        


static object Compile(string JSource)
        {
            return Microsoft.JScript.Eval.JScriptEvaluate(JSource, Microsoft.JScript.Vsa.VsaEngine.CreateEngine());
        }

这适用于某些情况,例如:

var jscript = "var x = 'foo'; var y = 'baa';"; 
var output = ParseVariables(jscript); 
var val = output["y"]; //baa 
var val2 = output["x"]; //foo

但是对于这样的情况:

var jscript = "var x = {}; x['foo'] = 'baa'; x['baa'] = 'test';"; 
var output = ParseVariables(jscript); 
var val = output["x['foo']"]; //not works 

我该怎么做?任何帮助表示赞赏!谢谢!

【问题讨论】:

  • 很不清楚你在问什么。这是一个 ASP.NET 页面吗?你说的 JavaScript 是在浏览器中运行的吗?
  • @Jonh:这是一个控制台应用程序吗?我从其他页面获取的 javascript 代码作为字符串
  • 这是一个非常不寻常的环境。我强烈建议您通过编辑问题来描述它。

标签: c# javascript .net


【解决方案1】:

由于您的方法是将 JScript 源代码拆分为用分号 (;) 分隔的块,因此只有 var; 之间的部分将使用您的 Compile 方法进行编译。

如果你把你的 JScript 源代码改成var x = { "foo": "baa", "baa": "test" };,Compile 方法就会正常工作,它会返回一个 ScriptObject 对象。

但是,还有另一个错误 - 在将值插入结果字典之前,您使用的是 ToString

试试这个,以便朝着更好的方向开始:

将 Compile 方法更改为返回 ScriptObject,如下所示:

static ScriptObject Compile(string JSource)
{
    return (ScriptObject)Microsoft.JScript.Eval.JScriptEvaluate(JSource, Microsoft.JScript.Vsa.VsaEngine.CreateEngine());
}

然后试试这个:

var x = Compile("var x = { foo: 'baa', bar: { 'nisse': 'kalle' } };");

var foo = x["foo"];
var bar = (ScriptObject)x["bar"];
var nisse = bar["nisse"];

【讨论】:

  • VsaEngine 自 VS 2005 起已弃用(但在 VS 2017 中仍可用):D
【解决方案2】:

这里似乎有许多假设。例如,您将所有值重新放在一行上。您可以尝试这样设置 vvar:

string vvar = variables[i].Trim();

这将删除不需要的换行符和其他空格。

您可以为您的第二个示例发布compiler.ToString() 的输出吗?我猜问题出在解析上,而不是在 JScript 编译器上。

另外,在这种情况下会发生什么:

var foo = 'a';
foo = 'b';
foo = 'c';

foo 的最终值是多少?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 2016-09-18
    • 2017-04-06
    • 2010-09-07
    • 2016-02-13
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多