Domanda

Sono riuscito a creare una classe usando CodeDom e ad aggiungere un singolo metodo a quella classe. Ora, c'è un modo per, dopo aver costruito l'istanza CodeCompileUnit, compilare il codice e invocare il metodo generato? L'invocazione del metodo deve essere effettuata nello stesso contesto della generazione del codice.

È stato utile?

Soluzione

Tratto da un il mio amico blog :

    CSharpCodeProvider codeProvider = new CSharpCodeProvider();
    codeProvider.GenerateCodeFromNamespace(codeNamespace, new StringWriter(), new CodeGeneratorOptions());

    CompilerParameters param = new CompilerParameters(assemblyReferences);
    param.GenerateExecutable = false;
    param.GenerateInMemory = true;
    param.TreatWarningsAsErrors = false;
    param.WarningLevel = 4;

    CompilerResults results = codeProvider.CompileAssemblyFromDom(param, compileUnit);
    Assembly assembly = results.CompiledAssembly;

    Type[] types = assembly.GetExportedTypes();

È quindi possibile utilizzare la riflessione sui tipi per creare un'istanza del tipo desiderato ed eseguire il metodo desiderato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top