Post on 01-May-2015
www.devleap.itwww.devleap.it
Introduzione al .NET Introduzione al .NET FrameworkFramework
Marco RussoMarco RussoMCSD MCAD MCSE+I MCSA MCDBA MCTMCSD MCAD MCSE+I MCSA MCDBA MCT
Mail: marco@devleap.itMail: marco@devleap.itItalian blog: http://blogs.devleap.com/marco.blogItalian blog: http://blogs.devleap.com/marco.blog
www.devleap.it
DevLeap? Che roba è?DevLeap? Che roba è?• www.DevLeap.itwww.DevLeap.it• Un gruppo di 5 persone con tanta voglia Un gruppo di 5 persone con tanta voglia
didi• Studiare a fondo le tecnologieStudiare a fondo le tecnologie• Capire il “behind the scenes”Capire il “behind the scenes”• Implementare soluzioni realiImplementare soluzioni reali• Confrontarsi con le problematiche realiConfrontarsi con le problematiche reali• Sperimentare nuove ideeSperimentare nuove idee
• Facciamo Corsi, Conferenze, TrainingFacciamo Corsi, Conferenze, Training• Scriviamo libriScriviamo libri
• http://www.devleap.it/fullcontacthttp://www.devleap.it/fullcontact
www.devleap.it
Chi siete ?Chi siete ?• Chi conosce Java?Chi conosce Java?• Chi conosce Visual Basic?Chi conosce Visual Basic?• Chi conosce C++?Chi conosce C++?• Chi conosce COM?Chi conosce COM?
www.devleap.it
AgendaAgenda• Perché .NETPerché .NET• Common Language RuntimeCommon Language Runtime• Semplificazione: sviluppo e deploymentSemplificazione: sviluppo e deployment• Affidabilità del codiceAffidabilità del codice• Principali servizi del FrameworkPrincipali servizi del Framework• Piattaforma multi-linguaggioPiattaforma multi-linguaggio• Unificazione modello programmazioneUnificazione modello programmazione• Librerie disponibiliLibrerie disponibili
www.devleap.it
Perché .NETPerché .NET• Attuali tecniche di programmazione:Attuali tecniche di programmazione:
• Server: C++, Java, T-SQL, …Server: C++, Java, T-SQL, …• Middle-tier: VB, C++, …Middle-tier: VB, C++, …• Web Presentation: ASP, JSP, PHP, …Web Presentation: ASP, JSP, PHP, …• Web Client: Jscript, VBscriptWeb Client: Jscript, VBscript• Rich-client: VB, C++, Java, …Rich-client: VB, C++, Java, …• Protocolli: HTTP, XML-RPC, DCOM, CORBA, …Protocolli: HTTP, XML-RPC, DCOM, CORBA, …
www.devleap.it
Perché .NETPerché .NET• Difficile effettuare sviluppo omogeneoDifficile effettuare sviluppo omogeneo• Molto tempo viene dedicato a far Molto tempo viene dedicato a far
comunicare i vari “strati”comunicare i vari “strati”• Serve un salto qualitativo per Serve un salto qualitativo per
semplificare lo scenariosemplificare lo scenario• Ma non c’era COM ?Ma non c’era COM ?
www.devleap.it
Prima di COMPrima di COM
Prima di COM, le applicazioni erano entità completamente separate, senza integrazione
Applicazione
Codice e strutture dati
www.devleap.it
L’era di COML’era di COM
COM fornisce un meccanismo per integrare dei componenti.Ogni componente deve però fornire dei “contatti” e gli oggetti non possono interagire direttamente
www.devleap.it
.NET: oltre l’era di COM.NET: oltre l’era di COM
Con “.NET Framework Common Language Runtime”, i componenti sono costruiti su uno strato comune. Gli oggetti interagiscono direttamente.
www.devleap.it
Architettura .NET FrameworkArchitettura .NET Framework
Base Class Library
Common Language Specification
Common Language Runtime
Data and XML
VB C++ C#V
isual S
tud
io.N
ET
JScript …
WebServices
UserInterface
www.devleap.it
Cosa è .NETCosa è .NET• È un ambiente di esecuzioneÈ un ambiente di esecuzione
(runtime environment)(runtime environment)• Semplifica lo sviluppo e il deploymentSemplifica lo sviluppo e il deployment• Aumenta l’affidabilità del codiceAumenta l’affidabilità del codice• È completamente indipendente da COMÈ completamente indipendente da COM• È fortemente integrato con COMÈ fortemente integrato con COM• Unifica il modello di programmazioneUnifica il modello di programmazione
www.devleap.it
Ambiente di esecuzioneAmbiente di esecuzione• Concetti chiave:Concetti chiave:
• MSIL: Microsoft Intermediate LanguageMSIL: Microsoft Intermediate Language• CLR: Common Language RuntimeCLR: Common Language Runtime• CTS: Common Type SystemCTS: Common Type System• CLS: Common Language SpecificationCLS: Common Language Specification
www.devleap.it
Codice MSILCodice MSIL
Codicenativo
OutputCompilatoreJIT
CodiceMSIL
(Assembly).EXE/.DLL
Compilatore.NET
Sorgenti
www.devleap.it
Common Language RuntimeCommon Language Runtime
Base Class Library
Common Language Specification
Common Language Runtime
Data and XML
VB C++ C#V
isual S
tud
io.N
ET
JScript …
WebServices
UserInterface
www.devleap.it
Common Language RuntimeCommon Language Runtime• IL CLR offre vari servizi alle applicazioniIL CLR offre vari servizi alle applicazioni
Managed code (MSIL)
Sistema operativo (Win32, …)
Common Language Runtime (CLR)
Funzionalità esistenti (es. I/Osu file) mediate da CLR
Funzionalità specifiche di CLR(es. Garbage Collection)
www.devleap.it
Common Language RuntimeCommon Language Runtime• Sviluppo iniziato nel ’97Sviluppo iniziato nel ’97• Nato inizialmente come ambiente di Nato inizialmente come ambiente di
esecuzione migliorato per COM+esecuzione migliorato per COM+• Metadati distribuiti in troppe posizioni Metadati distribuiti in troppe posizioni
diversediverse• RegistryRegistry• COM+ catalogCOM+ catalog• DLLDLL
• Modello nuovo per fare cose vecchieModello nuovo per fare cose vecchie• Sviluppo di una API (C, C++)Sviluppo di una API (C, C++)• Sviluppo di wrapper COM per l’APISviluppo di wrapper COM per l’API
www.devleap.it
Common Language RuntimeCommon Language Runtime
Class Loader
IL to NativeCompilers
CodeManager
GarbageCollector
Security Engine Debug Engine
Type Checker Exception Manager
Thread Support COM Marshaler
Base Class Library Support
www.devleap.it
Sviluppo semplificatoSviluppo semplificato
• Ambiente object-orientedAmbiente object-oriented• Qualsiasi entità è un oggetto Qualsiasi entità è un oggetto • Classi ed ereditarietà pienamente supportatiClassi ed ereditarietà pienamente supportati• Anche tra linguaggi diversi !Anche tra linguaggi diversi !
• Riduzione errori comuni di Riduzione errori comuni di programmazioneprogrammazione• Linguaggi fortemente tipizzatiLinguaggi fortemente tipizzati• Errori non gestitiErrori non gestiti• Meno memory leak: Garbage CollectorMeno memory leak: Garbage Collector
www.devleap.it
Indipendenza dalla piattaformaIndipendenza dalla piattaforma
• .NET è un’implementazione di CLI.NET è un’implementazione di CLI• Common Language InfrastructureCommon Language Infrastructure
• CLI è uno standard ECMA, definito con CLI è uno standard ECMA, definito con C#C#• ECMA-334, ECMA-335ECMA-334, ECMA-335
• Esistono già altre implementazioni di Esistono già altre implementazioni di CLI:CLI:• SSCLI (Microsoft, per Windows, FreeBSD e SSCLI (Microsoft, per Windows, FreeBSD e
Macintosh)Macintosh)• Mono (per Linux)Mono (per Linux)• DotGNUDotGNU• Intel OCL (Open CLI Library)Intel OCL (Open CLI Library)• ……
www.devleap.it
Deployment semplificatoDeployment semplificato• AssemblAssemblyy
• Unità minima per la distribuzione, il Unità minima per la distribuzione, il versioning e la securityversioning e la security
• Simile alle DLL, ma aggiunge meta-dati sul Simile alle DLL, ma aggiunge meta-dati sul contenuto attraverso il “Manifest”contenuto attraverso il “Manifest”
• Può essere composto da uno o più filePuò essere composto da uno o più file• Il manifest può risiedere in un file EXE/DLL Il manifest può risiedere in un file EXE/DLL
separato, oppure in un EXE/DLL che contiene separato, oppure in un EXE/DLL che contiene codice dell’assemblycodice dell’assembly
ApprofondimentApprofondimento:o:www.devleap.www.devleap.itit
www.devleap.it
AssemblyAssembly
Assembly a modulo singolo
Codice IL
Metadati
Manifest
Modulo(file PE)
www.devleap.it
Deployment semplificatoDeployment semplificato• Installazione senza effetti collateraliInstallazione senza effetti collaterali
• Le applicazioni e i componenti possono Le applicazioni e i componenti possono sempre essere condivisi o privatisempre essere condivisi o privati
• Esecuzione sEsecuzione side-by-sideide-by-side• Diverse versioni dello stesso componente Diverse versioni dello stesso componente
possono coesistere, anche nello stesso possono coesistere, anche nello stesso processoprocesso
www.devleap.it
Dove sono gli assemblyDove sono gli assembly• Assembly privatiAssembly privati
• Directory applicazione (e sub-directory)Directory applicazione (e sub-directory)
• Assembly condivisiAssembly condivisi• Global Assembly Cache (GAC)Global Assembly Cache (GAC)• c:\windows\assemblyc:\windows\assembly
• Assembly scaricati da URLAssembly scaricati da URL• Download cacheDownload cachec:\Documents and Settings\%USERNAME%\Local Settings\Application Data\assembly\dl2c:\Documents and Settings\%USERNAME%\Local Settings\Application Data\assembly\dl2
GACUTIL.EXEGACUTIL.EXE• Tool per esaminare GAC e download cacheTool per esaminare GAC e download cache
www.devleap.it
Deployment degli assemblyDeployment degli assembly• XCOPYXCOPY
• Applicazioni ASP.NETApplicazioni ASP.NET
• .CAB.CAB• Applicazioni Windows Forms - Code Applicazioni Windows Forms - Code
DownloadDownload
• .MSI (Windows Installer).MSI (Windows Installer)• Applicazioni Windows FormsApplicazioni Windows Forms• Installazione in GAC di assembly condivisiInstallazione in GAC di assembly condivisi• Configurazione shortcutConfigurazione shortcut
www.devleap.it
Sicurezza e affidabilità del codiceSicurezza e affidabilità del codice• Separazione spazi di memoria in un Separazione spazi di memoria in un
processo con AppDomainprocesso con AppDomain• Controllo del codice e sicurezza dei tipiControllo del codice e sicurezza dei tipi
• Sono impediti cast non sicuri, variabili non Sono impediti cast non sicuri, variabili non inizializzate, accessi ad array oltre i limiti di inizializzate, accessi ad array oltre i limiti di allocazioneallocazione
• Garbage Collector per tutti gli Garbage Collector per tutti gli oggetti oggetti .NET.NET
• Gestione delle eccezioniGestione delle eccezioni• Miglioramento della diagnostica di erroreMiglioramento della diagnostica di errore• Integrata con Integrata con Windows SEHWindows SEH
www.devleap.it
Application DomainApplication Domain• Unità di elaborazione in .NETUnità di elaborazione in .NET• Un processo può avere più AppDomainUn processo può avere più AppDomain• Si può scaricare un AppDomain, non un Si può scaricare un AppDomain, non un
assemblyassembly• Relazione thread – AppDomainRelazione thread – AppDomain• Runtime host creano AppDomainRuntime host creano AppDomain
• ASP.NET, Internet Explorer, Shell, …ASP.NET, Internet Explorer, Shell, …
• Gestione diretta degli AppDomainGestione diretta degli AppDomain
www.devleap.it
Assembly in AppDomainAssembly in AppDomain
Processo
AppDomain AppDomain
Assembly Assembly
Shared Assembly Shared Assembly
www.devleap.it
Garbage CollectorGarbage Collector• Gli oggetti vengono distrutti Gli oggetti vengono distrutti
automaticamente quando non sono più automaticamente quando non sono più referenziatireferenziati
• A differenza di COM, non ci si basa sul A differenza di COM, non ci si basa sul Reference CountingReference Counting• Maggiore velocità di allocazioneMaggiore velocità di allocazione• Consentiti i riferimenti circolariConsentiti i riferimenti circolari• Perdita della distruzione deterministicaPerdita della distruzione deterministica
• Algoritmo Mark-and-CompactAlgoritmo Mark-and-Compact
www.devleap.it
Garbage Collector - fase 1: MarkGarbage Collector - fase 1: Mark
NextObjPtrNextObjPtr
Oggetti “vivi”Oggetti “vivi”
Oggetti non raggiungibiliOggetti non raggiungibili
Spazio liberoSpazio libero
Root setRoot set
www.devleap.it
Garbage Collector - fase 2: Garbage Collector - fase 2: CompactCompact
NextObjPtrNextObjPtr
Oggetti “vivi”Oggetti “vivi”
Spazio liberoSpazio libero
Root setRoot set
Spazio recuperatoSpazio recuperato
www.devleap.it
GC e distruzione deterministicaGC e distruzione deterministica• In alcuni casi serve un comportamento In alcuni casi serve un comportamento
di finalizzazione deterministica:di finalizzazione deterministica:• Riferimenti a oggetti non gestitiRiferimenti a oggetti non gestiti• Utilizzo di risorse che devono essere Utilizzo di risorse che devono essere
rilasciate appena termina il loro utilizzorilasciate appena termina il loro utilizzo
• Non si possono usare i finalizzatori, che Non si possono usare i finalizzatori, che non sono richiamabili direttamentenon sono richiamabili direttamente
• Implementare l’interfaccia Implementare l’interfaccia IDisposableIDisposable
www.devleap.it
Piattaforma multi-linguaggioPiattaforma multi-linguaggio• Libertà di scelta del linguaggioLibertà di scelta del linguaggio
• Tutte le funzionalità di Tutte le funzionalità di .NET .NET Framework Framework sono disponibili a tutti i linguaggi .NETsono disponibili a tutti i linguaggi .NET
• I componenti di un’applicazione possono I componenti di un’applicazione possono essere scritti con diversi linguaggiessere scritti con diversi linguaggi
• Impatto sui toolImpatto sui tool• Tool disponibili per tutti i linguaggi:Tool disponibili per tutti i linguaggi:
Debugger, Profiler, Analisi “Code coverage”, Debugger, Profiler, Analisi “Code coverage”, ecc.ecc.
www.devleap.it
CTS: Common Type SystemCTS: Common Type System• Sistema di tipi comuneSistema di tipi comune
• Alla base di tutti i linguaggi .NETAlla base di tutti i linguaggi .NET
• Progettato per linguaggi object-Progettato per linguaggi object-oriented, procedurali e funzionalioriented, procedurali e funzionali• Esaminate caratteristiche di 20 linguaggiEsaminate caratteristiche di 20 linguaggi• Tutte le funzionalità disponibili con ILTutte le funzionalità disponibili con IL• Ogni linguaggio utilizza alcune Ogni linguaggio utilizza alcune
caratteristichecaratteristiche
• Common Language Specification (CLS)Common Language Specification (CLS)• Sottoinsieme di CTSSottoinsieme di CTS• Regole di compatibilità tra linguaggiRegole di compatibilità tra linguaggi
www.devleap.it
Gestione degli erroriGestione degli errori• Uniforme per tutte le classiUniforme per tutte le classi• Gestione strutturata delle eccezioniGestione strutturata delle eccezioni
• Concetto implementato nel CTSConcetto implementato nel CTS• Disponibile in tutti i linguaggi con sintassi Disponibile in tutti i linguaggi con sintassi
diversediverse• Concetti universali:Concetti universali:
• Lanciare un’eccezioneLanciare un’eccezione• Catturare un’eccezioneCatturare un’eccezione• Codice di uscita da un blocco controllato Codice di uscita da un blocco controllato
(finally)(finally)
• Non ha costi elevati (codice/prestazioni)Non ha costi elevati (codice/prestazioni)
www.devleap.it
Gestione strutturata delle Gestione strutturata delle eccezionieccezioni
a()a()
b()b()
TryTry
c()c()
d()d()
Catch e As ExceptionCatch e As Exception
f()f()
End TryEnd Try
g()g()
Sub cSub c
r()r()
s()s()
t()t()
End SubEnd Sub
Sub sSub s
Dim a As MyClassDim a As MyClass
a = nulla = null
a.z()a.z()
a.w()a.w()
a.x()a.x()
End SubEnd Sub
www.devleap.it
Principali servizi del CLRPrincipali servizi del CLR• Garbage collector Garbage collector
• Gestione del ciclo di vita degli oggettiGestione del ciclo di vita degli oggetti• Problema della distruzione deterministicaProblema della distruzione deterministica
• ReflectionReflection• Analisi dei metadati di un assemblyAnalisi dei metadati di un assembly• Generazione di un assembly dinamicoGenerazione di un assembly dinamico
• RemotingRemoting• Chiamata di componenti remoti (.NET)Chiamata di componenti remoti (.NET)
• Interoperabilità Interoperabilità (COM, Platform Invoke)(COM, Platform Invoke)
www.devleap.it
Modello di esecuzioneModello di esecuzione
ClassClassLoaderLoader
IL to nativeIL to nativecode compilercode compiler
CPUCPUSecuritySecuritySystemSystem
CodeCodeManagersManagers
ManagedManagedNativeNativeCodeCode
AssemblyAssembly
Prima Prima chiamatachiamataal metodoal metodo
Primo Primo riferimento riferimento al tipoal tipo
ExecutionExecutionSupportSupport
www.devleap.it
Elaborazione sincrona e asincronaElaborazione sincrona e asincrona
a()a() b()b() c()c() d()d() e()e() f()f() g()g() h()h()
a()a()
b()b()
c()c()
d()d()
e()e()
f()f()
g()g() h()h()ffoorrkk
jjooiinn
TempoTempo
ElaborazioElaborazionene
sincronasincrona
ElaborazioneElaborazioneasincronaasincrona Thread 1Thread 1
Thread 2Thread 2
www.devleap.it
Elaborazione sincrona e asincronaElaborazione sincrona e asincrona• Programmazione asincrona possibile da Programmazione asincrona possibile da
tutti i linguaggitutti i linguaggi• Chiamate asincroneChiamate asincrone• ThreadThread• Thread poolThread pool• Componenti remotiComponenti remoti• A volte è “involontaria”...A volte è “involontaria”...
• Nuovo problema: componenti thread-Nuovo problema: componenti thread-safesafe
• Anche per gli sviluppatori VB!!Anche per gli sviluppatori VB!!
ApprofondimentApprofondimento:o:www.devleap.www.devleap.itit
www.devleap.it
Librerie di classiLibrerie di classi
Base Class Library
Common Language Specification
Common Language Runtime
Data and XML
VB C++ C#V
isual S
tud
io.N
ET
JScript …
WebServices
UserInterface
www.devleap.it
Unico modello di programmazioneUnico modello di programmazione
Windows API
.NET Framework
Disponibilità di API indipendentementedal linguaggio e dal modello di programmazione
ASP
Stateless,Codice incapsulato
in pagine HTML
MFC/ATL
Subclassing,Potenza,
Espressività
VB Forms
RAD,Componenti
www.devleap.it
Estendibilità delle classiEstendibilità delle classi• Il Framework non è una “scatola nera”Il Framework non è una “scatola nera”• Qualsiasi classe Qualsiasi classe .NET .NET può essere estesa può essere estesa
mediante ereditarietàmediante ereditarietà• Diversamente da Diversamente da COM, COM, si usa e si estende la si usa e si estende la
classe stessa, non uno strato intermedio classe stessa, non uno strato intermedio (wrapper)(wrapper)
• L’ereditarietà è L’ereditarietà è cross-languagecross-language
www.devleap.it
Base Class Library
Data Xml
Web Services User Interface
.NET Framework.NET Framework
www.devleap.it
System
System.Data System.Xml
System.Web
Globalization
Diagnostics
Configuration
Collections
Resources
Reflection
IO
Threading
Text
Security
SqlClient
OleDb
SQLTypes
Common
RuntimeInteropServices
Remoting
Serialization
Configuration SessionState
Caching Security
UIHtmlControls
WebControls
System.Drawing
Imaging
Drawing2D
Text
Printing
System.Windows.Forms
Design ComponentModel
.NET Framework.NET Framework
XPath
Xsl
Serialization
Schema
Hosting
Handlers
Compilation
www.devleap.it
Base FrameworkBase Framework
System
Threading
Text
Security
Resources
Reflection
IO
Globalization
Diagnostics
Configuration
Collections
Runtime
Serialization
Remoting
InteropServices
www.devleap.it
Data Data ee XML XML
System.Data
System.Xml
SqlTypes
OleDb
SqlClient
Common
Serialization
Schema
XPath
Xsl
www.devleap.it
Web Forms Web Forms ee Services Services
System.Web
Caching
Configuration
UI
SessionState
HtmlControls
WebControls
Security
Handlers
Hosting
Compilation
www.devleap.it
Windows FormsWindows Forms
System.Drawing
Drawing2D
Imaging
Printing
Text
System.Windows.Forms
Design ComponentModel
www.devleap.it
Linguaggi e ToolLinguaggi e Tool
Base Class Library
Common Language Specification
Common Language Runtime
Data and XML
VB C++ C#V
isual S
tud
io.N
ET
JScript …
WebServices
UserInterface
www.devleap.it
LinguaggiLinguaggi• La piattaforma La piattaforma .NET .NET è neutrale rispetto è neutrale rispetto
al linguaggio (nessuno è favorito)al linguaggio (nessuno è favorito)• Tutti i linguaggi Tutti i linguaggi .NET .NET hanno le stesse hanno le stesse
possibilitàpossibilità• Si possono sfruttare skill già esistentiSi possono sfruttare skill già esistenti
• Common Language SpecificationCommon Language Specification• Consumer: Consumer: Può usarePuò usare .NET Framework .NET Framework• Extender: Extender: Può estenderePuò estendere .NET Framework .NET Framework
www.devleap.it
LinguaggiLinguaggi• Microsoft fornisce:Microsoft fornisce:
• VB, C++, C#, JScriptVB, C++, C#, JScript
• Linguaggi di terze parti:Linguaggi di terze parti:• APL, COBOL, Pascal, Eiffel, Haskell, ML, APL, COBOL, Pascal, Eiffel, Haskell, ML,
Oberon, Perl, Python, Scheme, Smalltalk, …Oberon, Perl, Python, Scheme, Smalltalk, …
www.devleap.it
Visual Studio.NETVisual Studio.NET
Base Class Library
Common Language Specification
Common Language Runtime
Data and XML
VB C++ C#V
isual S
tud
io.N
ET
JScript …
WebServices
UserInterface
www.devleap.it
Visual Studio .NETVisual Studio .NET• Un solo tool per tutti i linguaggiUn solo tool per tutti i linguaggi• Creazione e consumo di servizi WebCreazione e consumo di servizi Web• Modello a oggetti del codice in editorModello a oggetti del codice in editor• Debugger integratoDebugger integrato• ……
www.devleap.it
Considerazioni finaliConsiderazioni finali• Un mondo nuovo per sviluppareUn mondo nuovo per sviluppare• Framework di classi già molto estesoFramework di classi già molto esteso
• Ma soprattutto coerente!Ma soprattutto coerente!
• Quasi tutto completamente estendibileQuasi tutto completamente estendibile• Alta integrabilità con il codice esistenteAlta integrabilità con il codice esistente• Ottima piattaforma perOttima piattaforma per
sviluppare componenti COMsviluppare componenti COM• A prima vista è tutto semplice, ma è A prima vista è tutto semplice, ma è
bene sapere cosa c’è dietro (tanto!!)bene sapere cosa c’è dietro (tanto!!)
www.devleap.it
Altre InformazioniAltre Informazioni• Dove posso ottenere maggiori Dove posso ottenere maggiori
informazioniinformazioni• www.devleap.itwww.devleap.it• www.microsoft.com/msdn/italywww.microsoft.com/msdn/italy• msdn.microsoft.commsdn.microsoft.com• www.gotdotnet.comwww.gotdotnet.com
• Developer resourcesDeveloper resources• Microsoft Visual Studio.NETMicrosoft Visual Studio.NET• Microsoft .NET Framework SDKMicrosoft .NET Framework SDK• Microsoft Developer NetworkMicrosoft Developer Network
www.devleap.it
Introduzione al .NET FrameworkIntroduzione al .NET Framework
I vostri feedback sono importantiI vostri feedback sono importanti•ScriveteciScriveteci
Grazie della partecipazione– A presto
– info@DevLeap.it