Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoLauretta Lillo Modificato 11 anni fa
1
Generazione dinamica di codice.NET 2.0 Ricci Gian Maria ricci.gm@nablasoft.com MarCamp : 24 febbraio 2007
2
Codice che genera codice Codice che genera codice Un programma genera codice a run-time durante la sua esecuzione Un programma genera codice a run-time durante la sua esecuzione Un programma così strutturato deve necessariamente essere strutturato per essere estensibile. Un programma così strutturato deve necessariamente essere strutturato per essere estensibile. Supporto nativo dellambiente alla generazione ed al caricamento dinamico di codice Supporto nativo dellambiente alla generazione ed al caricamento dinamico di codice Generazione dinamica di codice
3
Non si conosce a priori il tipo di dato su cui si lavora Non si conosce a priori il tipo di dato su cui si lavora Creare interfacce come punti di collegamento per lestendibilità Creare interfacce come punti di collegamento per lestendibilità Utilizzare classi base con metodi virtuali per incapsulare le funzionalità base Utilizzare classi base con metodi virtuali per incapsulare le funzionalità base Accedere ai nuovi tipi con indentificazione run- time (reflection) Accedere ai nuovi tipi con indentificazione run- time (reflection) Strutturare le modalità di caricamento Strutturare le modalità di caricamento Single AppDomain Single AppDomain Multi AppDomain Multi AppDomain Come strutturare il progetto
4
Comunicare per interfacce Core Interfaccia Tipo dinamico Tipo dinamico Tipo dinamico Tipo dinamico Tipo dinamico Tipo dinamico
5
Comunicare per classi base Core Base Tipo dinamico Tipo dinamico Tipo dinamico Tipo dinamico Tipo dinamico Tipo dinamico
6
Comunicare per reflection Core Tipo dinamico Tipo dinamico Informazioni sul tipo Invocazione dinamica
7
Creazione classi proxy di classi reali Creazione classi proxy di classi reali Intercettare le chiamate ai metodi per trovare metriche di codice Intercettare le chiamate ai metodi per trovare metriche di codice Aspect Oriented Programming Aspect Oriented Programming Necessità specifiche es: NHibernate lazy load Necessità specifiche es: NHibernate lazy load Mock object Mock object Creare oggetti che simulano classi reali Creare oggetti che simulano classi reali Generazione runtime proxy a servizi Generazione runtime proxy a servizi E affascinante E affascinante Perchè generare codice dinamicamente
8
Generazione in.NET 2.0 Una prima possibilità consiste nel generare dinamicamente un file di testo contenente codice C#, VB, etc.. e poi chiamare direttamente il compilatore generando così una dll che può essere caricata runtime. Vantaggi Vantaggi Estrema semplicità Estrema semplicità Svantaggi Svantaggi Possibilità di errore nella generazione di file Possibilità di errore nella generazione di file Scarso controllo degli errori Scarso controllo degli errori
9
Generazione tramite compilatore Core C# sc.exe dll
10
Utilizzare il CodeDom Una possibilità migliore consiste nella generazione di codice tramite le classi contenute nel namespace CodeDom. Grazie a questa libreria è possibile controllare in dettaglio come verranno generati i tipi dinamici. Dim cg As ICodeGenerator = _ New CSharpCodeProvider().CreateGenerator() Vantaggi Vantaggi Controllo accurato sul codice generato Controllo accurato sul codice generato Impossibiltà di generazione di errori di sintassi Impossibiltà di generazione di errori di sintassi Utile per generatori di codice Utile per generatori di codice Svantaggi Svantaggi Generazione di codice complessa Generazione di codice complessa
11
Generazione tramite CodeDom Core dll CodeDom
12
Reflection.Emit() Lultima possibilità offerta dal.NET 2.0 è la generazione di codice dinamica tramite Reflection.Emit(). Sostanzialmente tramite Emit si possono ottenere gli stessi risultati che si possono ottenere tramite CodeDom, ma si hanno dei vantaggi. Codice più lineare e snello Codice più lineare e snello Iniezione diretta dei tipi in un AppDomain senza passare per una classe compilatore Iniezione diretta dei tipi in un AppDomain senza passare per una classe compilatore Estrema facilità di utilizzo a patto di conoscere MSIL Estrema facilità di utilizzo a patto di conoscere MSIL Possibilità di generare nuovi tipi in ogni momento, lassembly generato dinamicamente non è chiuso. Possibilità di generare nuovi tipi in ogni momento, lassembly generato dinamicamente non è chiuso.
13
Generazione tramite Reflectio.Emit() Core Emit
14
Reflection.Emit() Lultima possibilità offerta dal.NET 2.0 è la generazione di codice dinamica tramite Reflection.Emit(). Vantaggi Vantaggi Codice più lineare e snello Codice più lineare e snello Iniezione diretta dei tipi in un AppDomain senza passare per la compilazione Iniezione diretta dei tipi in un AppDomain senza passare per la compilazione Maggiore performance Maggiore performance Possibilità di generare nuovi tipi in ogni momento Possibilità di generare nuovi tipi in ogni momento Svantaggi Svantaggi Richiesta buona conoscenza di MSIL Richiesta buona conoscenza di MSIL
15
Abstract View
16
Domande?
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.