Condividi tramite


Assembly in .NET

Gli assembly sono le unità fondamentali di distribuzione, controllo della versione, riutilizzo, ambito dell'attivazione e autorizzazioni di sicurezza per le applicazioni basate su .NET. Un'assembly è una raccolta di tipi e risorse progettati per lavorare insieme e formare un'unità logica di funzionalità. Gli assembly hanno la forma di file eseguibili (.exe) o libreria di collegamento dinamico (.dll) e sono i blocchi predefiniti delle applicazioni .NET. Forniscono a Common Language Runtime le informazioni necessarie per conoscere le implementazioni dei tipi.

In .NET e .NET Framework è possibile compilare un assembly da uno o più file di codice sorgente. In .NET Framework gli assembly possono contenere uno o più moduli. In questo modo, è possibile pianificare progetti di dimensioni maggiori in modo che diversi sviluppatori possano lavorare su file o moduli di codice sorgente separati, combinati per creare un singolo assembly. Per altre informazioni sui moduli, vedere Procedura: Creare un assembly multifile.

Gli assembly hanno le proprietà seguenti:

  • Gli assembly vengono implementati come file.exe o file.dll.

  • Per le librerie destinate a .NET Framework, è possibile condividere assembly tra applicazioni inserendoli nella Global Assembly Cache (GAC). Per includere gli assembly nella GAC, è necessario che abbiano un nome forte. Per ulteriori informazioni, consultare assembly con nome forte.

  • Gli assembly vengono caricati in memoria solo se necessari. Se non vengono usati, non vengono caricati. Pertanto, gli assembly possono essere un modo efficiente per gestire le risorse in progetti di grandi dimensioni.

  • È possibile ottenere informazioni a livello di codice su un assembly tramite reflection. Per altre informazioni, vedere Reflection (C#) o Reflection (Visual Basic).

  • È possibile caricare un assembly solo per esaminarlo usando la MetadataLoadContext classe in .NET e .NET Framework. MetadataLoadContext sostituisce i Assembly.ReflectionOnlyLoad metodi.

Assembly nel Common Language Runtime

Gli assembly forniscono a Common Language Runtime le informazioni necessarie per conoscere le implementazioni dei tipi. Per il runtime, un tipo non esiste all'esterno del contesto di un assembly.

Un assembly definisce le informazioni seguenti:

  • Codice che viene eseguito dal common language runtime (CLR). Ogni assembly può avere un solo punto di ingresso: DllMain, WinMaino Main.

  • Limite di sicurezza. Un assembly è l'unità in cui vengono richieste e concesse le autorizzazioni. Per altre informazioni sui limiti di sicurezza negli assembly, vedere Considerazioni sulla sicurezza degli assembly.

  • Limite del tipo. L'identità di ogni tipo include il nome dell'assembly in cui risiede. Un tipo denominato MyType caricato nell'ambito di un assembly non è uguale a quello di un tipo denominato MyType caricato nell'ambito di un altro assembly.

  • Limite dell'ambito di riferimento: il manifesto dell'assembly contiene metadati usati per risolvere i tipi e soddisfare le richieste di risorse. Il manifest specifica i tipi e le risorse da esporre fuori dall'assembly ed enumera gli altri assembly da cui dipende. Il codice CIL (Common Intermediate Language) in un file eseguibile portabile (PE) non verrà eseguito a meno che non abbia un manifesto dell'assembly associato.

  • Limite della versione. L'assembly è l'unità con controllo delle versioni più piccola in Common Language Runtime. Tutti i tipi e le risorse nello stesso assembly sono versionati come un'unità. Il manifesto dell'assembly descrive le dipendenze delle versioni specificate per gli assembly dipendenti. Per altre informazioni sul controllo delle versioni, vedere Controllo delle versioni degli assembly.

  • Unità di distribuzione: all'avvio di un'applicazione, devono essere presenti solo gli assembly che l'applicazione chiama inizialmente. È possibile recuperare altri assembly, ad esempio assembly contenenti risorse di localizzazione o classi di utilità, su richiesta. Questo processo consente alle app di essere semplici e sottili al primo download. Per altre informazioni sulla distribuzione di assembly, vedere Distribuire applicazioni.

  • Un'unità di esecuzione side-by-side: per altre informazioni sull'esecuzione di più versioni di un assembly, vedere Assembly ed esecuzione side-by-side.

Creare un assembly

Gli assembly possono essere statici o dinamici. Gli assembly statici vengono archiviati su disco in file eseguibili portatili (PE). Gli assembly statici possono includere interfacce, classi e risorse come bitmap, file JPEG e altri file di risorse. È anche possibile creare assembly dinamici, che vengono eseguiti direttamente dalla memoria e non vengono salvati su disco prima dell'esecuzione. È possibile salvare assembly dinamici su disco dopo l'esecuzione.

Esistono diversi modi per creare assiemi. È possibile usare strumenti di sviluppo, ad esempio Visual Studio, che possono creare .dll o .exe file. È possibile usare gli strumenti in Windows SDK per creare assembly con moduli di altri ambienti di sviluppo. È anche possibile usare le API Common Language Runtime, ad esempio System.Reflection.Emit, per creare assembly dinamici.

Compilare gli assembly creandoli in Visual Studio, creandoli con gli strumenti dell'interfaccia della riga di comando di .NET Core o creando assembly .NET Framework con un compilatore da riga di comando. Per altre informazioni sulla creazione di assembly tramite l'interfaccia della riga di comando di .NET, vedere Panoramica dell'interfaccia della riga di comando di .NET.

Nota

Per compilare un assembly in Visual Studio, scegliere Compila dal menu Compila.

Manifesto dell'assembly

Ogni assembly ha un file manifest dell'assembly. Analogamente a un sommario, il manifesto dell'assembly contiene:

  • Identità dell'assembly (nome e versione).

  • Tabella di file che descrive tutti gli altri file che costituiscono l'assembly, ad esempio altri assembly creati dai quali il file .exe o il file .dll si basa, file bitmap o file Readme.

  • Elenco di riferimenti all'assembly, che è un elenco di tutte le dipendenze esterne, ad esempio .dllo altri file. I riferimenti agli assembly contengono riferimenti a oggetti globali e privati. Gli oggetti globali sono disponibili per tutte le altre applicazioni. In .NET Core gli oggetti globali sono associati a un particolare runtime di .NET Core. In .NET Framework gli oggetti globali risiedono nella Global Assembly Cache (GAC). System.IO.dll è un esempio di assembly nella GAC. Gli oggetti privati devono trovarsi a livello di directory al di sotto della directory in cui è installata l'app.

Gli assembly contengono informazioni su contenuto, controllo delle versioni e dipendenze. Pertanto, le applicazioni che le usano non devono basarsi su origini esterne, ad esempio il Registro di sistema nei sistemi Windows, per funzionare correttamente. Gli assembly riducono i conflitti di.dll e semplificano la distribuzione delle applicazioni. In molti casi, è possibile installare un'applicazione basata su .NET semplicemente copiando i suoi file nel computer di destinazione. Per altre informazioni, vedere Manifesto dell'assembly.

Aggiungere un riferimento a un assembly

Per usare un assembly in un'applicazione, è necessario aggiungervi un riferimento. Quando viene fatto riferimento a un assembly, tutti i tipi, le proprietà, i metodi e gli altri membri degli spazi dei nomi accessibili sono disponibili per l'applicazione come se il codice fosse incluso nel file di origine.

Nota

La maggior parte degli assembly della libreria di classi .NET sono referenziati automaticamente. Se non viene fatto riferimento automaticamente a un assembly di sistema, aggiungere un riferimento in uno dei modi seguenti:

  • Per .NET e .NET Core aggiungere un riferimento al pacchetto NuGet che contiene l'assembly. Usare il Gestione pacchetti NuGet in Visual Studio o aggiungere un <elemento PackageReference> per l'assembly al progetto con estensione ".csproj" o ".vbproj".
  • Per .NET Framework, aggiungere un riferimento all'assembly usando la finestra di dialogo Aggiungi riferimento in Visual Studio o l'opzione della -reference riga di comando per i compilatori C# o Visual Basic .

In C# è possibile usare due versioni dello stesso assembly in una singola applicazione. Per altre informazioni, vedere Alias extern.

Titolo Descrizione
Contenuto dell'assembly Elementi che costituiscono un assemblaggio.
Manifesto dell'assembly Dati nel manifesto dell'assembly e modalità di archiviazione negli assembly.
Global Assembly Cache Modalità di archiviazione e utilizzo degli assembly da parte della GAC.
Assembly con nome sicuro Caratteristiche degli assembly con nome sicuro.
Considerazioni sulla sicurezza degli assembly Funzionamento della sicurezza con gli assembly.
Versionamento dell'assemblaggio Panoramica dei criteri di controllo delle versioni di .NET Framework.
Posizionamento dell'assemblaggio Dove individuare gli assembly.
Assembly ed esecuzione simultanea Usare più versioni del runtime o di un assembly contemporaneamente.
Emettere metodi dinamici e assembly Come creare assembly dinamici.
Come il runtime individua gli assembly Come .NET Framework risolve i riferimenti agli assembly in fase di esecuzione.

Riferimento

System.Reflection.Assembly

Vedere anche