【问题标题】:MSScriptControl Issue on Windows Server 2008Windows Server 2008 上的 MSScriptControl 问题
【发布时间】:2012-03-31 16:38:48
【问题描述】:

所以我正在使用 MSScriptControl 在我的应用程序中运行一些 javascript,并且我希望能够获得有关脚本可能导致的任何错误的一些信息。

MSScriptControl.ScriptControlClass script = new MSScriptControl.ScriptControlClass();
try
{
    script.Language = "JScript";
    script.Timeout = 15000;
    script.Eval(Code);
}
catch (Exception ex)
{
    MSScriptControl.Error err = script.Error;
    ret = new Exception("Error on line: " + err.Line + ", Description: " + err.Description);
}

代码在我的开发机器上运行良好,一个 Windows 7 机器,并给了我一个错误的行号。所以我很高兴地将它发布并推送到生产机器上,它总是告诉我错误发生在第 0 行并且没有提供描述。

我尝试去http://www.microsoft.com/download/en/details.aspx?id=1949下载最新版本,但安装没有效果。我还将属性 Embed Interop Types 设置为 false,并将我自己的 msscript.ocx 文件复制到 Windows 2008 服务器的 system32 目录中,但这些尝试都没有解决任何问题。

有人有什么建议吗?

【问题讨论】:

  • 在位数上可能存在差异 - 例如“为 AnyCPU 构建”,在 32 位(开发机器)上运行正常,在 Windows 2008 64 位机器上出现问题?
  • 另一点:根据您提供的链接,Win7 和 Win2K8 都不是受支持的平台...这可能是因为 UAC 或其他控制(从 2004 年开始!)未实施支持的更改...

标签: javascript iscriptcontrol msscriptcontrol


【解决方案1】:

如果您想在没有任何第三方或“组件”外部依赖项的所有本机 c# 中执行此操作,请使用带有小型 JScript 引导程序的 CodeDomProvider,如下所示:

private static readonly MethodInfo eval = CodeDomProvider
        .CreateProvider("JScript")
        .CompileAssemblyFromSource(new CompilerParameters(), "package e{class v{public static function e(e:String):Object{return eval(e);}}}")
        .CompiledAssembly
        .GetType("e.v")
        .GetMethod("e");

private static object JsEval(string jscript)
{
    try
    {
        return eval.Invoke(null, new[] { jscript });
    }
    catch (Exception ex)
    {
        return ex;
    }
}

创建一个 JsEval(string) 方法,您可以在代码中的任何位置使用该方法将字符串“评估”为 JavaScript(以及 JScript)...所以调用:

MessageBox.Show("" + JsEval("2 + 2")); // 4
MessageBox.Show("" + JsEval("(function(){ return 3+7; })();")); // 10
MessageBox.Show("" + JsEval("function yay(a) { return a + 1; } yay(2);")); // 3

根据您的使用情况,您可能不想静态实例化这些成员。如果你想操作复杂的对象,你需要创建一个包装器来反射性地提取数据(或者你可以转换为适当的 JScript 对应物,但我从未尝试过,因为你必须包含 JScript 程序集)。

这是一个包装类的示例,它可以完成 JavaScript 允许您在本机执行的所有操作,添加更多高级功能可能会很麻烦,因此您最好将成员提取到字典/哈希表中,或者在另一端交替序列化和反序列化

private class JsObjectWrapper : IEnumerable
{
    public readonly object jsObject;
    private static PropertyInfo itemAccessor = null;
    private static MethodInfo getEnumerator = null;

    public JsObjectWrapper(object jsObject)
    {
        this.jsObject = jsObject;

        if (itemAccessor == null) 
        {
            itemAccessor = jsObject.GetType().GetProperty("Item", new Type[] { typeof(string) });
        }

        if (getEnumerator == null)
        {
            getEnumerator = jsObject.GetType().GetInterface("IEnumerable").GetMethod("GetEnumerator");
        }
    }

    public object this[string key]
    {
        get { return itemAccessor.GetValue(jsObject, new object[] { key }); }
        set { itemAccessor.SetValue(jsObject, value, new object[] { key }); } 
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return (IEnumerator)getEnumerator.Invoke(jsObject, null);
    }
}

您可以通过执行以下操作看到这一点:

var jsObj = JsEval("var x = { a:7, b:9 };");
var csObj = new JsObjectWrapper(jsObj);

MessageBox.Show("a: " + csObj["a"]);  // a: 7
MessageBox.Show("b: " + csObj["b"]);  // b: 9

csObj["yay!"] = 69;

foreach (string key in csObj)
{
    MessageBox.Show("" + key + ": " + csObj[key]); // "key": "value"
}

我个人曾经使用过类似的代码,在某个时候效果很好,并且可以保证它在服务器环境中的可用性和可运行性。我希望这会有所帮助-ck

【讨论】:

    【解决方案2】:

    关于你面临的问题只是一些想法:

    • 根据您提供的链接,此控件既不支持 Windows 7 也不支持 Windows 2008
    • 这可能是关于 COM/UAC 等的安全问题。
    • 如果你为 AnyCPU 编译可能会因为位数而出现问题,请尝试使用 x86

    关于可能的替代方案:

    • 使用JScript,您可以构建一个evaluator rather easily,它在任何运行.NET 4 的地方(包括Windows Server 2008)都受支持。
    • 使用 JInt 作为 JavaScript 解释器

    【讨论】:

    • 我使用了一点 JInt,但在最初的几分钟内,我发现它与我可以在浏览器中编写的 javascript 类型之间存在一些差异。最值得注意的是关于匿名函数。它仍然可以工作,但 JScript 选项是我不知道的选项,所以我也会研究一下。
    • @SpencerRuport 您是否试图模仿类似浏览器的 javascript 执行(包括 DOM 等)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2011-04-07
    相关资源
    最近更新 更多