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?
risposta
È 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.
Questa soluzione risponde direttamente alla domanda. Grazie. –
È 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.
È possibile utilizzare Mono.Cecil per manipolare IL. È uno strumento potente, anche se in qualche modo non ha documentazione.
- 1. Come si emette un System.Linq.Expression?
- 2. Come si inserisce un modello in un altro modello?
- 3. Come si inserisce il titolo lungo?
- 4. Come si inserisce una case case in un rdd e si comporta come una tupla (coppia)?
- 5. Come si inserisce un file in un dispositivo in Django?
- 6. Come si inserisce un file fittizio in un repository git?
- 7. Il controller non è stato caricato da un altro assieme?
- 8. Come si inserisce un Func in un attributo C# (annotazione)?
- 9. Come si inserisce il codice del profilo quando si utilizza knitr?
- 10. Come si inserisce il testo sotto un altro testo?
- 11. jQuery - Come si inserisce un DIV su sovrapposizione?
- 12. Come si inserisce un grande database esistente (schema) sotto il controllo del codice sorgente?
- 13. Come si inserisce un bordo attorno a un'immagine in WPF?
- 14. Come si inserisce HTML o XML in un YAML?
- 15. Determinare il contesto carico di un assieme
- 16. Viene visualizzata una pagina vuota quando si inserisce il frammento e lo si sostituisce nuovamente nello stesso frammento
- 17. Come si inserisce Grizzly con Glassfish?
- 18. Browser query MySQL Come si inserisce NULL?
- 19. Come si corregge il Modulo già caricato UserWarnings in Python?
- 20. Come si inserisce un bordo attorno a un tag tr?
- 21. Come si inserisce il punto blu sulle schede Chrome bloccate?
- 22. Perché il codice EF5 utilizza prima datetime2 quando si inserisce un datetime nullable nel database?
- 23. Come si inserisce un valore enum Postgres utilizzando Clojure JDBC?
- 24. Assieme al codice C
- 25. In elisp, come si inserisce una funzione in una variabile?
- 26. In che modo il fattore di portata si inserisce in cicli "do ... while" e viceversa?
- 27. Come posso ottenere un tipo da un assieme caricato da un'altra cartella?
- 28. Come si inserisce un vincolo sulla curva SciPy?
- 29. Come si inserisce ETL (database nel database) in SOA?
- 30. GCC non emette un avviso quando si compila
Perché è necessario iniettare i tipi in un assieme già caricato? Perché non puoi iniettarli in un assembly che stai attualmente costruendo? – yfeldblum
@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. –
Non sono sicuro che ci sia un modo per farlo. Se c'è, mi piacerebbe saperlo. –