c# .net dynamic .net-4.0 dynamic-language-runtime

Interpretación DLR y Javascript en c#4?



.net dynamic (2)

Quiero ejecutar un código de JavaScript desde c # usando DLR.

Así que escribí un código simple usando c# y Jint :

var script = @" function show( ) { return parseInt(''123asd''); //in js it''s 123 }; return show();"; var result = new JintEngine().Run(script); Console.WriteLine(result);

parseInt(''123asd'') en javascript es: 123

Pero el resultado que obtengo es:

  • Tal vez no veo la imagen completa, pero si un programador del otro lado del mundo me envía su archivo de script, ¡yo (y él) esperamos que el resultado sea constante!

  • Si me equivocaba, ¿en qué situación usaría ejecutar otro código en .Net? (Tendré que ser muy muy sospechoso para cada línea de código ...)


Este parece ser el comportamiento actual de la función de partseInt de Jint.

Código relacionado:

// most common case double result; if(double.TryParse(number,NumberStyles.Any, CultureInfo.InvariantCulture, out result)) { // parseInt(12.42) == 42 return NumberClass.New(sign * Math.Floor(result)); } else { return this["NaN"]; }

.NET''s double.TryParse no analizará ''123asd'' como 123 , pero devuelve que no puede analizar toda la cadena.

Deberías completar el informe de errores en Jint.

E: Este es un problema con los "estándares". Nunca se pueden obtener estándares 100% compatibles en todas las implementaciones. Siempre habrá diferencias. Basta con mirar IE vs Chrome vs Firefox vs Opera. Todos usan motores de JavaScript diferentes, por lo que puede esperar diferencias. Si realmente quiere ser compatible cruzado, debe implementar de acuerdo con el estándar y tratar todo el comportamiento no estándar como un error en la implementación. Depende de usted si intenta solucionar este error o informarlo y esperar que se solucione.


Si está buscando una coincidencia 1: 1 entre cómo se ejecuta su javascript en .NET y cómo se ejecutaría en un programa de Windows como Internet Explorer, hay una manera de reutilizar los motores de scripts de Windows (no solo Jscript sino también VBScript o cualquier otro lenguaje de scripting ActiveX ) que se describe aquí en SO: analizar y ejecutar JS por C #

Así es como su código podría implementarse utilizando esta técnica:

var script = @" function show( ) { return parseInt(''123asd''); //in js it''s 123 }"; // Note I have removed the return as it''s not needed here using (ScriptEngine engine = new ScriptEngine("jscript")) { ParsedScript parsed = engine.Parse(script); Console.WriteLine(parsed.CallMethod("show")); } }

Esto generará 123 como se esperaba. Tenga en cuenta que creo que el código original podría mejorarse con la nueva palabra clave dynamic C #, por lo que probablemente podríamos escribir Console.WriteLine(parsed.show()) directamente.