2009-11-15 6 views
7

Ho creato alcuni tipi in modo dinamico utilizzando System.CodeDom.CodeCompileUnit, voglio compilarli in codice IL in memoria e iniettare quel codice IL in un assembly caricato in memoria - non è necessario salvarlo sul disco. Forse il mio piano dichiarato è sbagliato. Aprire ad altri suggerimenti su come ottenere quell'istanza CodeCompileUnit sulla destinazione specificata.Come si emette il codice e lo si inserisce in un assieme caricato?

+1

Perché è necessario iniettare i tipi in un assieme già caricato? Perché non puoi iniettarli in un assembly che stai attualmente costruendo? – yfeldblum

+1

@Justice: Questo è un buon punto: è una curiosità più di ogni altra cosa. Suppongo che se dovessi inventare gli scenari possibili: eliminare le autorizzazioni del file system sulla creazione di assiemi semplicemente lavorando in memoria; o forse per iniettare il codice in un assembly e invocarlo dinamicamente per ispezionare le cose senza la necessità di ricompilare l'app. –

+0

Non sono sicuro che ci sia un modo per farlo. Se c'è, mi piacerebbe saperlo. –

risposta

7

È possibile inserire il codice in un assieme esistente (già caricato) utilizzando le interfacce ICorDebug. Modifica e continua lo fa.

Calcola i tuoi byte delta e chiama ICorDebugModule2::ApplyChanges. Vedere lo MDbg sample code per ulteriori dettagli.

Una volta abbiamo usato ICorDebugModule::GetEditAndContinueSnapshot e parenti, ma ora sono deprecati.

Aggiornamento Se non si cura di iniettare il codice in un assembly già caricati, usando solo Reflection.Emit per creare un nuovo gruppo è più efficiente e molto più facile.

+0

Questa soluzione risponde direttamente alla domanda. Grazie. –

1

È inoltre possibile utilizzare System.Reflection.Emit spazio dei nomi e creare un assembly dinamico in memoria.

L'alternativa è utilizzare CodeDom per generare il codice di compilazione &, quindi effettuare una chiamata.

XMLSerialization() fa quest'ultimo.

1

È possibile utilizzare Mono.Cecil per manipolare IL. È uno strumento potente, anche se in qualche modo non ha documentazione.

Problemi correlati