2009-09-14 20 views
6

Html puede contener pequeños bits de Javascript incrustados en él (por ejemplo, definido en onclick controladores de eventos).Interpretar y/o recibir código dotNet en tiempo de ejecución

  1. Si estuviera escribiendo un navegador HTML utilizando un lenguaje dotNet como C#, lo tecnologías o las API podría utilizar para ejecutar dichos fragmentos de Javascript, dado que yo no lo recibo hasta que el tiempo de ejecución (y recibirla como datos de cadena, no como código ejecutable)?

  2. ¿Es más fácil o más difícil si el código que se ejecuta fuera C# snippets en lugar de Javascript?

  3. ¿Existe alguna técnica que no requiera que mi código tenga privilegios inusuales? Por ejemplo, un método como CodeCompiler.FromSource requiere SecurityPermissionFlag.UnmanagedCode (que me parece excesivo: no veo por qué es tan arriesgado compilar código).

  4. Si controlé tanto el lado del servidor como el código del lado del cliente, también podría considerar compilar tales fragmentos de script en el servidor en lugar de hacerlo en el cliente y luego enviarlo como código precompilado al lado del cliente. ser ejecutado. ¿Hay alguna forma de enviar ese código (un ensamblado dotNet, presumiblemente) a través de la red para el cliente, tener el código del lado del cliente recibirlo de la red en la RAM del lado del cliente e invocarlo en el lado del cliente sin almacenarlo como un archivo en una unidad de disco del lado del cliente?


Editar

tengo respuesta a las tres primeras preguntas: Me he resignado al hecho de que la compilación toma altos privilegios. No veo por qué; tal vez (aunque no considero que esto sea una razón muy convincente) es porque el compilador se implementa utilizando código no administrado. Tal vez esto cambie cuando vuelvan a implementar el compilador utilizando el código administrado, tal vez en el marco temporal de "C# versión 5". En cualquier caso, sea cual sea el motivo, parece ser lo que es, y no hay soluciones alternativas (otras API similares pero que requieren menos privilegios).

Mi pregunta restante es cómo obtener una instancia de ensamblado de una máquina a otra. Cuando tenga tiempo, averiguaré si el código que no es de confianza puede ejecutar el método Assembly.Load(byte[] rawAssembly).

+2

¿Has visto la demo de Anders REPL loop de PDC '08. Solo espere hasta que salga y estará configurado :) --http: //channel9.msdn.com/pdc2008/TL16/ (Está hacia el final) –

+0

Así que quiere interpretar el código .NET del cliente, compilar en lado del servidor, luego ejecutar en el cliente directamente desde la memoria? –

+0

Tengo un código de cliente-servidor ya en ejecución. Usando eso, me gustaría enviar scripts desde el servidor para ejecutarlos en el cliente. Si esos scripts necesitan ser compilados, no me importa mucho si están compilados en el servidor o en el cliente. Preferiría hacerlo usando un código del lado del cliente que tenga privilegios mínimos, p. "confianza parcial/zona de internet", que me impide escribir en el disco del lado del cliente, etc. – ChrisW

Respuesta

2
  1. Server side JavaScript es uno de los idiomas admitidos por la plataforma .NET. Lo usé muchas veces en los scenrios cuando necesitas insertar pequeños fragmentos de código en el código existente. Runtime se puede cargar desde, por ejemplo, la base de datos y compilarse, por lo que no hay una penalización de preformance.

  2. Desde el punto de vista de hacer que la plomería funcione (recuperar la fuente, compilarla, etc.) no hay diferencia. Sin embargo, con los lenguajes fuertemente tipados es mucho más difícil ensamblar los fragmentos de código en una unidad de compilación compilable.

  3. Permisos es ciertamente un desafío. No estoy seguro del permiso específico que mencionó, pero la seguridad es una preocupación, después de todo, la fuente compilada puede ser cualquier cosa y si no tiene cuidado con la fuente de su código puede convertirse en la puerta trasera de su sistema

  4. La respuesta a esta es - sí, por supuesto. Puede cargar un ensamblaje desde cualquier lugar, no necesariamente desde un archivo, también puede compilar en la memoria, eso es lo que hago. No hay un archivo dll en este caso.

+0

Para resumir mi problema: incluso instanciar una instancia de JScriptCodeProvider requiere plena confianza, por lo que la compilación en el lado de poca confianza del cliente no se ve bien. O si creo/compilo una instancia de ensamblado en el servidor, puedo serializarlo usando un BinaryFormatter ... pero cuando intento deserializarlo obtengo una excepción ("System.IO.FileNotFoundException: Could can load file or assembly" Foo, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null 'o una de sus dependencias. El sistema no puede encontrar el archivo especificado ") por lo que no sé cómo obtener la instancia de Assembly desde el servidor al cliente. – ChrisW

+0

No lo "deserializa". no explícitamente Solo proporciónale la dirección URL que apunta a tu servidor y deja que AssemblyLoader haga el trabajo – mfeingold

1

Usted está haciendo varias preguntas, más o menos, así que le daré una idea sobre una de ellas. Hay un artículo muy bueno y algunos ejemplos de código de: http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm que se refiere a la compilación y ejecución del código C# en el tiempo de ejecución. Lo encontré muy útil y estoy usando esto en una aplicación C# estándar. Parece que también sería útil para su problema.

Cuestiones relacionadas