Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Windows Server 2008上的MSScript控件问题_Javascript_Iscriptcontrol_Msscriptcontrol - Fatal编程技术网

Javascript Windows Server 2008上的MSScript控件问题

Javascript Windows Server 2008上的MSScript控件问题,javascript,iscriptcontrol,msscriptcontrol,Javascript,Iscriptcontrol,Msscriptcontrol,因此,我正在使用MSScript控件在我的应用程序中运行一些javascript,我希望能够获得有关脚本可能导致的任何错误的信息 MSScriptControl.ScriptControlClass script = new MSScriptControl.ScriptControlClass(); try { script.Language = "JScript"; script.Timeout = 15000; script.Eval(Code); } catch (

因此,我正在使用MSScript控件在我的应用程序中运行一些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);
}
代码在我的开发机器Windows7上运行良好,并给我一个带有错误的行号。因此,我很高兴地将其发布并推送到生产机器上,生产机器总是告诉我错误发生在第0行,并且没有提供任何描述

我试图下载最新版本,但安装没有效果。我还将属性Embed Interop Types设置为false,并将自己的msscript.ocx文件复制到Windows 2008 server的system32目录中,但这两次尝试都没有解决任何问题


有人有什么建议吗?

关于你面临的问题,有一些想法:

  • 根据您提供的链接,此控件既不支持Windows 7也不支持Windows 2008
  • 这可能是COM/UAC等的安全问题
  • 这可能是一个问题,因为位如果您为任何CPU编译,请尝试使用x86
关于可能的替代方案:

  • 使用,您可以构建运行.NET 4的任何位置(包括Windows Server 2008)都支持的
  • 用作JavaScript解释器

关于您所面临的问题,请给出一些想法:

  • 根据您提供的链接,此控件既不支持Windows 7也不支持Windows 2008
  • 这可能是COM/UAC等的安全问题
  • 这可能是一个问题,因为位如果您为任何CPU编译,请尝试使用x86
关于可能的替代方案:

  • 使用,您可以构建运行.NET 4的任何位置(包括Windows Server 2008)都支持的
  • 用作JavaScript解释器

如果您想在所有本机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)
方法,您可以在代码中的任何位置使用该方法将字符串“eval”为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

如果您想在所有本机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)
方法,您可以在代码中的任何位置使用该方法将字符串“eval”为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

位是否有差异-例如“build for AnyCPU”,在32位(开发机器)上运行正常,在Windows 2008 64位机器上出现问题?另一点:根据您提供的链接,Win7和Win2K8都不受平台支持。。。例如,这可能是由于UAC或其他控件(从2004年起!)未实现以支持的更改…位是否有差异-例如“build for AnyCPU”,在32位(开发机器)上运行正常,Windows 2008 64位计算机出现问题?另一点:根据您提供的链接,Win7和Win2K8都不受平台支持。。。这可能是因为UAC或其他控件(从2004年开始!)没有实现以支持的更改…我使用了JInt一点,但在最初几分钟内,我发现它与我可以在浏览器中编写的javascript之间存在一些差异。最明显的是匿名函数。它可能仍然可以工作,但JScript选项是我不知道的,所以我也会研究一下。@SpencerRuport您是否试图模仿类似浏览器的javascript执行(包括DOM等)?我使用了一点JInt,但在最初几分钟内,我发现它与我可以在浏览器中编写的javascript之间存在一些差异。最明显的是匿名函数。它可能仍然可以工作,但JScript选项是我不知道的,所以我也会研究一下。@SpencerRuport您是否试图模拟类似浏览器的javascript执行(包括DOM等)?