Blog d'Emmanuel Istace

Compilation et appel de code C# dans un System.String au runtime

Posted in DotNet, Programmation by Emmanuel Istace on 28 janvier 2012

Voici un petit bout de code vous permettant de compiler du code sous forme de string et d’instancier des objets. Pour éviter d’écrire du code d’appel par réflexion, ma classe a générer implémente une interface que j’utiliserai ensuite manipuler le resultant de CreateObjectFromAssembly. Seul la construction de l’objet se fait par réflexion.

/// <summary>
/// Produces new assembly at runtime.
/// </summary>
/// <param name="references">The assembly references.</param>
/// <param name="sourceCode">The source code to compile.</param>
/// <param name="outputAssemblyName">Output dll name.</param>
/// <returns>Compilation result</returns>
private CompilerResults ProduceAssembly(string[] references, 
                                        string sourceCode, 
                                        string outputAssemblyName)
{
    CSharpCodeProvider codeProvider = new CSharpCodeProvider();
    ICodeCompiler codeCompiler = codeProvider.CreateCompiler();

    CompilerParameters compilerParameters = 
                    new CompilerParameters(references, 
                                            outputAssemblyName);
    compilerParameters.GenerateExecutable = false;
    compilerParameters.GenerateInMemory = false;

    return codeCompiler.CompileAssemblyFromSource(compilerParameters, 
                                                  sourceCode);

}

/// <summary>
/// Creates new object from dynamicaly loaded assembly
/// </summary>
/// <param name="AssemblyName">Name of the assembly to load.</param>
/// <param name="className">Name of the class to instanciate.</param>
/// <param name="constructorParameters">The constructor parameters.</param>
private bool CreateObjectFromAssembly(string AssemblyName, 
                                        string className, 
                                        object[] constructorParameters, 
                                        out object createdObject)
{
    object tmp = createdObject = null;
    Assembly myAssembly = Assembly.LoadFrom(AssemblyName);
    Module[] myModules = myAssembly.GetModules();

    myModules.Where(module => module.Name == AssemblyName)
             .Select(module => module.GetTypes())
             .ToList()
             .ForEach
             (
             t => t.Where(types => types.Name == className)
                   .ToList()
                   .ForEach(
                          type => tmp = Activator.CreateInstance(type, 
                                               constructorParameters))
             );
    createdObject = tmp;
    return createdObject != null;
}

Pastebin : http://pastebin.com/S6fpYcXD

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Twitter picture

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Connexion à %s

Suivre

Get every new post delivered to your Inbox.

Joignez-vous à 30 followers