Pregunta

Entonces, estoy usando el MSSCRCTCONTROL para ejecutar un poco de JavaScript en mi aplicación y quiero poder obtener información sobre cualquier error que el script puede causar.

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);
}

El código funciona bien en mi máquina de desarrollo, una caja de Windows 7 y me da un número de línea con un error.Así que lo publico feliz y presiono a la máquina de producción que siempre me dice que se produjo el error en la línea 0 y no se proporciona una descripción.

Intenté ir a http://www.microsoft.com/Descargar / ES / Detalles.aspx? ID= 1949 Para descargar la última versión, pero la instalación no tenía efecto.También establece la propiedad Embed Interop Tyes a FALSO, así como copiando mi propio archivo MSScript.ocx en el directorio System32 de Windows 2008 Server, pero ninguno de estos intentos resolvió nada.

¿Alguien tiene alguna recomendación?

¿Fue útil?

Solución

con respecto al problema que enfrenta solo algunos pensamientos:

  • Según el enlace, proporcionó este control, tampoco admite Windows 7 ni Windows 2008
  • podría ser un problema de seguridad con respecto a COM / UAC, etc.
  • Podría ser un problema debido a la pitidez si compilaste para AnyCPU, intente usar x86

con respecto a posibles alternativas:

Otros consejos

Si desea hacerlo en todos los nativos C # sin ninguna de las dependencias externas de terceros o "componentes", use un CodeDomProvider con un pequeño bootstrap de JScript, como este:

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;
    }
}

que crea un método JsEval(string) que puede usar en cualquier lugar de su código para "eval" una cadena como JavaScript (Well JScript) ... así que llame:

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

Dependiendo de su uso, es posible que no desee instanciar estos miembros estáticamente. Si desea manipular objetos complejos, deberá crear un envoltorio para extraer reflexionando de forma reflectivamente (o podría lanzar como la contraparte de JScript adecuada, pero nunca lo he intentado, ya que tendría que incluir los ensamblajes de JScript).

Aquí hay un ejemplo de una clase de envoltura que hace todo lo que JavaScript le permitirá hacerlo de forma nativa, agregar más funcionalidad de alto nivel probablemente sería lo suficientemente engorrosa, para que estés mejor, ya sea que estuviera mejor, ya sea extraída de los miembros en una mesa de diccionario / hash o Alternativamente, serializando y deserialización en el otro extremo

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);
    }
}

Puedes ver esto en acción haciendo esto:

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"
}

Personalmente, he usado el código similar a esto a un gran efecto en un punto u otro y puede responder por su disponibilidad y ejecución dentro de un entorno de servidor ... espero que esto ayude a -ck

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top