¿Comstack y ejecuta código dynamic, sin generar EXE?

Me preguntaba si era posible comstackr y ejecutar código almacenado, sin generar un exe o cualquier otro tipo de archivos, básicamente ejecutar el archivo desde la memoria.

Básicamente, la aplicación Principal tendrá un código almacenado (código que potencialmente se modificará) y necesitará comstackr el código y ejecutarlo. sin crear ningún archivo.

crear los archivos, ejecutar el progtwig y luego eliminar los archivos no es una opción. el código comstackdo deberá ejecutarse desde la memoria.

ejemplos de código, o punteros, o casi cualquier cosa es bienvenido 🙂

using (Microsoft.CSharp.CSharpCodeProvider foo = new Microsoft.CSharp.CSharpCodeProvider()) { var res = foo.CompileAssemblyFromSource( new System.CodeDom.Compiler.CompilerParameters() { GenerateInMemory = true }, "public class FooClass { public string Execute() { return \"output!\";}}" ); var type = res.CompiledAssembly.GetType("FooClass"); var obj = Activator.CreateInstance(type); var output = type.GetMethod("Execute").Invoke(obj, new object[] { }); } 

Esto comstack una clase simple a partir de la cadena de código fuente incluida, luego ejemplifica la clase e invoca reflexivamente una función en ella.

Aquí hay un ejemplo de cómo usar System.Linq.Expressions para agregar a la respuesta de Tim. Obviamente, no es el código más bonito, pero tenerlo en esta bonita forma de árbol hace que el desarrollo sea tan fácil.

 private Expression CreateIsWordCharExpression() { var e = Expression.Parameter(typeof(int), "e"); var c = Expression.Variable(typeof(char), "c"); var returnLabel = Expression.Label(Expression.Label(typeof(bool)), _falseConstant); var lambda = Expression.Lambda( Expression.Block( new[] { c }, Expression.IfThen( Expression.OrElse( Expression.Equal(e, Expression.Constant(-1)), Expression.Equal(e, _inputLengthVar) ), Expression.Return(returnLabel.Target, _falseConstant) ), Expression.Assign(c, Expression.MakeIndex(_str, _stringCharsPropertyInfo, new[] { e })), Expression.IfThenElse( Expression.OrElse( Expression.OrElse( Expression.OrElse( Expression.AndAlso( Expression.GreaterThanOrEqual(c, Expression.Constant('a')), Expression.LessThanOrEqual(c, Expression.Constant('z')) ), Expression.AndAlso( Expression.GreaterThanOrEqual(c, Expression.Constant('A')), Expression.LessThanOrEqual(c, Expression.Constant('Z')) ) ), Expression.AndAlso( Expression.GreaterThanOrEqual(c, Expression.Constant('0')), Expression.LessThanOrEqual(c, Expression.Constant('1')) ) ), Expression.Equal(c, Expression.Constant('_')) ), Expression.Return(returnLabel.Target, _trueConstant), Expression.Return(returnLabel.Target, _falseConstant) ), returnLabel ), "IsWordChar", new[] { e } ); return lambda; } 

Es posible. Es fácil o difícil, dependiendo de cuánto y qué tipo de código desea escribir.

  • Comstackr expresiones de una línea: System.Linq.Expressions (sencillo pero limitado)
  • Comstackr progtwigs completos: System.Reflection.Emit (difícil de depurar, pero no imposible)

Editar: Tenga en cuenta que, antes de .NET 4.0, System.Linq.Expressions se limita a lo que puede caber en una sola línea de C #: es decir, no si, mientras, la asignación de variables, etc.

Sí, usted puede hacer esto. Es muy lento, pero ciertamente puedes hacerlo. Mire el CodeDOM o el (new CSharpCodeProvider().CreateCompiler()) en .Net.

Mira en System.CodeDom . Hará exactamente lo que estás buscando.

En Mono, usa CSharp.Evaluator. Funciona verdaderamente en la memoria v. Algunas de las otras soluciones mencionadas que se escriben y leen en un archivo debajo del capó.

También eche un vistazo a la incrustación de un lenguaje de scripting como Python, Ruby, Lua, etc. Todos admiten el código de ejecución de la memoria sin que se escriba nada en el disco.

Es difícil, si no imposible, comstackr y ejecutar C # sin crear un archivo, porque … Bueno, eso es lo que es la comstackción: convertir un lenguaje en un archivo ejecutable. Lo que estás buscando es algún tipo de funcionalidad de scripting. Lo que describiste en tu pregunta es esencialmente la diferencia entre un lenguaje interpretado y un lenguaje comstackdo . Ver Wikipedia: lenguaje de scripting .

Dependiendo de para qué utilizará esta función, puede hacer un gran uso de un lenguaje de scripts como Python, Ruby o Lua. Aquí hay un ejemplo: ¿Cómo ejecuto un script de Python desde C #?

Esto haría que tu aplicación dependa de python.exe (o del ejecutable que necesites para ejecutar el lenguaje de scripts que elijas). Si desea evitar eso, puede que no sea demasiado difícil crear su propio lenguaje de scripting para el cual su aplicación realiza el tiempo de ejecución, dependiendo de lo que necesite hacer con su script insertado.

Editar: Ese primer párrafo es basura. Lo siento. Ver http://msdn.microsoft.com/en-us/library/8ffc3x75%28v=vs.110%29.aspx