Actualmente tengo un código que se genera de forma dinámica. En otras palabras, un C# .cs archivo es creado dinámicamente por el programa, y la intención es incluir este archivo C# en otro proyecto.

El desafío es que me gustaría generar un .Archivo DLL en lugar de generar un C# .cs archivo de manera que se podría hacer referencia a cualquier tipo de .NETO de la aplicación (y no sólo de C#) y por lo tanto ser más útil.

InformationsquelleAutor 7wp | 2009-03-02

3 Comentarios

  1. 39
    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
    CSharpCodeProvider codeProvider = new CSharpCodeProvider();
    ICodeCompiler icc = codeProvider.CreateCompiler();
    System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
    parameters.GenerateExecutable = false;
    parameters.OutputAssembly = "AutoGen.dll";
    CompilerResults results = icc.CompileAssemblyFromSource(parameters, yourCodeAsString);

    Adaptado de http://support.microsoft.com/kb/304655

    • Nota: las versiones anteriores de este código tienen una línea de código adicional que crear un compilador desde el proveedor a través de CSharpCodeProvider.CreateCompiler(). Esta es obsoleta, usted debe llamar a compilar en el proveedor directamente.
  2. 32

    La no-deprecated forma de hacerlo (usando .NET 4.0 como los anteriores carteles mencionados):

    using System.CodeDom.Compiler;
    using System.Reflection;
    using System;
    public class J
    {
        public static void Main()
        {       
            System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateExecutable = false;
            parameters.OutputAssembly = "AutoGen.dll";
    
            CompilerResults r = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters, "public class B {public static int k=7;}");
    
            //verify generation
            Console.WriteLine(Assembly.LoadFrom("AutoGen.dll").GetType("B").GetField("k").GetValue(null));
        }
    }
    • Si utiliza parameters.GenerateInMemory = true; usted puede conseguir en memoria de la asamblea con r.CompiledAssembly
  3. 4

    Ahora, su mejor apuesta es CSharpCodeProvider; los planes para la 4.0 incluyen compilador «como un servicio», lo que hará que esta totalmente gestionado.

    • título del tema es «la generación de dll-asamblea-de forma dinámica en tiempo de ejecución» NO «generar-EXE-asamblea-de forma dinámica en tiempo de ejecución» de su enlace descripción apero crear exe en tiempo de ejecución.
    • y quien dijo algo acerca de exe? Si te refieres a «, pero el ejemplo de código de MSDN, se crea un archivo exe» – que estará feliz de crear archivos dll demasiado; en última instancia, el archivo de paquete es no la parte más interesante de una asamblea

Dejar respuesta

Please enter your comment!
Please enter your name here