如何使用C#运行jscript并返回数组中的值?
问题描述:
那么,我有很多javascript的变量,我需要获取值(我从其他页面获得)。 这样做的最好方法是什么? 我使用Microsoft.Jscript
类和您的方法工作。如何使用C#运行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
我如何做到这一点?任何帮助表示赞赏!谢谢!
答
由于您的方法是用分号(;)分隔大块的JScript源代码,因此只有var
和;
之间的部分将使用Compile方法进行编译。
如果您将JScript源代码更改为var x = { "foo": "baa", "baa": "test" };
,则编译方法将正常工作,并且它将返回一个ScriptObject对象。
但是,然后,还有另一个错误 - 您在使用ToString
将值插入生成的词典之前。
只需按照自己的代码一行一行,这应该是显而易见的。
尝试了这一点,以获得更好的方向开始:
更改编译方法进入返回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"];
答
似乎这里有很多假设。例如,你正在将所有的值返回到一行。你可以尝试这样设置vvar:
string vvar = variables[i].Trim();
这将修剪掉不需要的换行符和其他空格。
你可以为第二个例子发布compiler.ToString()
的输出吗?我猜想问题在于解析,而不是在JScript编译器中。
而且,在这样的情况下会发生什么:
var foo = 'a'; foo = 'b'; foo = 'c';
什么价值与foo
结束了?
这是非常不清楚你在问什么。这是一个ASP.NET页面吗?您正在谈论的JavaScript是否在浏览器中运行? –
@Jonh:这是一个控制台应用程序。 我从其他页面获取的javascript代码为字符串 –
这是一个非常不寻常的环境。我强烈建议你通过编辑你的问题来描述它。 –