2013-03-01 7 views
9

Gli articoli che ho letto su T4 utilizzando TextTemplatingFilePreprocessor mostrano come generare dinamicamente il codice che diventa parte di un progetto e viene compilato con il progetto.Compilazione del codice dinamico in fase di esecuzione utilizzando T4 e C#

E 'possibile utilizzare T4 per generare codice che viene compilato in fase di esecuzione, emesso in una DLL, caricato ed eseguito, con detto codice che ha accesso alle normali funzionalità di visibilità associate a una dll?

In tal caso, potresti indicarmi un esempio.

Sto effettivamente cercando di fare la stessa cosa di generare una DLL dinamica usando IL, ma piuttosto usando C#.

EDIT

Il caso specifico ho bisogno di questo per è semplice. Sto scrivendo un router di messaggi che indirizza i messaggi ai servizi. I servizi possono essere locali o remoti. Uno script dichiarativo è compilato in C#. La parte dinamica è "questo servizio è locale o remoto?". L'uscita C# viene modificata di conseguenza. Lo stile di routing è diverso per locale/remoto, quindi la natura dinamica.

Questo è un esempio di ciò di cui ho bisogno.

+0

Non sono sicuro che avete bisogno di generazione di codice per questo. Non puoi avere due tipi: uno per il servizio locale e uno per il remoto e scegli in fase di esecuzione quale utilizzare? – svick

+0

Certo, anche una semplice istruzione if che collega il delegato corretto. Sto solo usando questo come un semplice esempio di * a * caso in cui la dinamica ne trarrebbe beneficio. Ho casi più complessi che non ho ancora completamente mappato. – IamIC

risposta

4

Per fare questo, è necessario sapere due cose:

  1. È possibile utilizzare template T4 runtime di generare una parte di testo in fase di esecuzione, tra cui C# codice sorgente.
  2. È possibile utilizzare CSharpCodeProvider per compilare un assembly dal testo in fase di esecuzione. Oppure potresti eseguire manualmente csc.exe (il compilatore C# della riga di comando) sul testo generato, ma sarebbe più complicato. (In realtà CSharpCodeProvider fa esattamente che dietro le quinte.)

Il codice potrebbe essere la seguente:

var template = new RuntimeTextTemplate(); 
string code = template.TransformText(); 

var compiler = new CSharpCodeProvider(); 
var result = compiler.CompileAssemblyFromSource(
    new CompilerParameters { OutputAssembly = "assembly.dll" }, code); 
+0

potresti indicarmi qualcosa che mostra come T4 può valutare i dati in fase di esecuzione (naturalmente i dati che determinano l'output). – IamIC

+1

@IanC Se si crea un modello run-time, verrà valutato in fase di runtime (come nel mio esempio di codice). Per modificare l'input del modello, è possibile ad esempio utilizzare le proprietà in "Class control block", che è possibile accedere dal modello. – svick

+0

C'è un bel post da @ ode2code http://odetocode.com/blogs/scott/archive/2011/01/04/preprocessed-t4-templates.aspx che mostra come aggiungere alcuni dati semplici anche in una classe parziale, che è una tecnica un sacco di gente come con i modelli di runtime. – GarethJ