Pregunta

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

Básicamente, la aplicación Principal, tendrá algún código almacenado (código que potencialmente puede cambiar), y necesitará para compilar el código y ejecutarlo. sin crear ningún archivo.

la creación de los archivos, ejecutar el programa, y ??luego borrar los archivos no es una opción. el código compilado tendrá que ser RAN de la memoria.

ejemplos de código o punteros, o casi cualquier cosa es bienvenida:)

¿Fue útil?

Solución

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 compila una clase simple de la cadena de código fuente incluido, a continuación, crea una instancia de la clase y reflexivamente invoca una función en él.

Otros consejos

Este es un ejemplo de cómo utilizar System.Linq.Expressions añadir a la respuesta de Tim. Obviamente no es el código más bonito pero tenerlo en este bonito árbol-como forma hace que el desarrollo tan fácil.

private  Expression<IsWordChar> 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<IsWordChar>(
        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 la cantidad y el tipo de código que desea escribir.

Editar Nota 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 que, la asignación de variables, etc.

Sí, usted puede hacer esto. Es muy lento, pero que sin duda puede hacerlo. Vistazo a la CodeDOM o la (new CSharpCodeProvider().CreateCompiler()) en .Net.

Mira en System.CodeDom. Se hará exactamente lo que busca.

En Mono se utilizan CSharp.Evaluator. Funciona realmente en la memoria v. Algunas de las otras soluciones mencionado que escribir y leer de nuevo en un archivo bajo el capó.

También echar un vistazo a la incorporación de un lenguaje de programación como Python, Ruby, Lua, etc .. todos los que apoyo la ejecución de código de la memoria sin que nada se escribe en el disco.

Es difícil, si no imposible compilar y ejecutar C # sin crear un archivo, porque ... Bueno, eso es lo que es- compilación convertir una lengua en un archivo ejecutable. Lo que estás buscando es algún tipo de funcionalidad de secuencias de comandos. Lo que usted describe en su pregunta es esencialmente la diferencia entre un interpretado lenguaje y una compilado idioma. Ver Wikipedia:. lenguaje de scripts

En función de lo que va a utilizar esta función para, usted podría hacer un gran uso de un lenguaje de programación como Python, Ruby, o Lua. He aquí un ejemplo: ¿Cómo se ejecuta una secuencia de comandos de Python desde C # ?

Esto haría dependiente de su aplicación sobre python.exe (o lo que sea ejecutable que había necesidad de ejecutar el lenguaje de programación que elija). Si se quiere evitar que, tal vez no sea demasiado duro para hacer su propio lenguaje de scripts que su aplicación hace el tiempo de ejecución para, en función de lo que tiene que ver con su script inyectado.

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

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