Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Scenari avanzati di generazione di immagini native

In questo argomento vengono fornite informazioni utili per gli sviluppatori e gli amministratori che creano immagini native manualmente.

Il generatore di immagini native (Ngen.exe) genera le immagini native per il codice oggetto specificato e tutte le relative dipendenze. Le dipendenze vengono determinate dai riferimenti presenti nel manifesto dell'assembly. L'unico scenario in cui è necessario installare separatamente una dipendenza è quando l'applicazione viene caricata tramite reflection (ad esempio chiamando il metodo Assembly.Load ) e la dipendenza non è idonea per la generazione automatica di immagine nativa. Vedere Creazione di immagini native.

Nota importante Importante

Non utilizzare il metodo Assembly.LoadFrom con le immagini native. Un'immagine caricata con questo metodo non può essere utilizzata da altri codici oggetto nel contesto di esecuzione.

Lo strumento Ngen.exe gestisce un conteggio delle dipendenze. Si supponga, ad esempio, che MyAssembly.exe e YourAssembly.exe siano installati nella cache delle immagini native e che entrambi contengano riferimenti a OurDependency.dll. Disinstallare MyAssembly.exe non implica la disinstallazione di OurDependency.dll. La DLL viene rimossa solo quando YourAssembly.exe viene disinstallato.

Se si sta generando un'immagine nativa per un assembly nella Global Assembly Cache, è necessario specificare il relativo nome visualizzato. Vedere Assembly.FullName.

Un'immagine nativa viene chiamata una radice se è stata creata direttamente da un comando di Ngen.exe. Se un'immagine nativa viene creata come risultato di un comando Ngen.exe che ha risolto un altro codice oggetto, non è una radice.

Le immagini native generate da Ngen.exe possono essere condivise tra più domini applicazione. È pertanto possibile utilizzare Ngen.exe in scenari di applicazioni che richiedono la condivisione di codici oggetto tra più domini applicazione. Per specificare l'indipendenza del dominio, effettuare le seguenti operazioni:

  1. Applicare l'attributo LoaderOptimizationAttribute all'applicazione.

  2. Impostare la proprietà AppDomainSetup.LoaderOptimization quando si creano le informazioni di installazione per un nuovo dominio applicazione.

Durante il caricamento dello stesso assembly in più domini applicazione si consiglia di utilizzare sempre un codice indipendente dal dominio. Se un'immagine nativa viene caricata in un dominio applicazione non condiviso dopo essere stata caricata in un dominio condiviso, tale immagine non potrà essere utilizzata.

Nota Nota

Il codice indipendente dal dominio non può essere scaricato e le prestazioni potranno quindi risultare leggermente inferiori, in particolare durante l'accesso ai membri statici.

Una volta generata un'immagine nativa di un assembly, il runtime tenterà automaticamente di individuarla e utilizzarla ogni volta che viene eseguito l'assembly. Possono essere generate più immagini, a seconda degli scenari di utilizzo.

Se ad esempio si esegue un codice oggetto in uno scenario di debug o di profiling, il runtime cercherà un'immagine nativa generata con le opzioni /Debug o /Profile. Se non è possibile individuare un'immagine nativa corrispondente, verrà ripristinata la compilazione JIT standard. L'unico modo per eseguire il debug delle immagini native consiste nel creare un'immagine nativa con l'opzione /Debug.

Poiché l'azione Ngen Uninstall supporta anche gli scenari, è possibile disinstallare tutti gli scenari o solo quelli selezionati.

L'associazione forte consente di migliorare le prestazioni e di ridurre la dimensione del working set per le immagini native. Lo svantaggio consiste nel fatto che tutte le immagini associate in maniera forte a un codice oggetto devono essere caricate al momento del caricamento del codice oggetto, che può causare un aumento significativo del tempo di avvio per un'applicazione di grandi dimensioni.

L'associazione forte è appropriata per le dipendenze che vengono caricate in tutti gli scenari dell'applicazione in cui sono necessarie prestazioni particolarmente elevate. Come accade con qualsiasi altro aspetto relativo all'utilizzo delle immagini native, l'unico modo per determinare se l'associazione forte è in grado di migliorare le prestazioni dell'applicazione consiste in un'attenta valutazione delle prestazioni generali.

Gli attributi DependencyAttribute e DefaultDependencyAttribute consentono di fornire a Ngen.exe alcuni suggerimenti per l'utilizzo dell'associazione forte.

Nota Nota

Questi attributi non sono comandi ma semplici suggerimenti e il loro utilizzo non garantisce che l'associazione forte offra vantaggi all'applicazione. Il significato di questi attributi potrebbe cambiare nelle versioni future.

Hh691759.collapse_all(it-it,VS.110).gifSpecifica di un suggerimento di associazione per una dipendenza

Applicare DependencyAttribute a un assembly per indicare la probabilità che una dipendenza specificata venga caricata. LoadHint.Always indica che l'associazione forte è oppropriata, LoadHint.Default indica che deve essere utilizzato il valore predefinito per la dipendenza e LoadHint.Sometimes indica che l'associazione forte non è appropriata.

Nell'esempio di codice riportato di seguito vengono illustrati gli attributi per un assembly con due dipendenze. La prima dipendenza (Assembly1) è un candidato adatto per l'associazione forte, mentre la seconda dipendenza (Assembly2) non lo è.

using System.Runtime.CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)]
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)]

Il nome dell'assembly non include l'estensione ed è possibile utilizzare i nomi visualizzati.

Hh691759.collapse_all(it-it,VS.110).gifSpecifica di un suggerimento di associazione predefinita per un assembly

I suggerimenti di associazione predefinita sono necessari solo per i codici oggetto che verranno utilizzati immediatamente e di frequente da una qualsiasi applicazione che possiede una dipendenza da tali codici oggetto. Applicare l'attributo DefaultDependencyAttribute con LoadHint.Always a tali assembly per specificare che deve essere utilizzata l'associazione forte.

Nota Nota

Non esiste alcun motivo per applicare DefaultDependencyAttribute agli assembly dll che non rientrano in questa categoria, poiché l'applicazione dell'attributo con un qualsiasi valore diverso da LoadHint.Always non ha alcun effetto.

Microsoft utilizza l'attributo DefaultDependencyAttribute per specificare che l'associazione forte è l'impostazione predefinita per un numero molto piccolo di assembly in .NET Framework, ad esempio mscorlib.dll.

Quando si utilizza Ngen.exe per creare un'immagine nativa di un codice oggetto, l'output dipenderà dalle opzioni specificate alla riga di comando e da determinate impostazioni del computer. tra cui:

  • Versione di .NET Framework.

  • Versione del sistema operativo, se si è passati dalla famiglia Windows 9x alla famiglia Windows NT.

  • Identità esatta del codice oggetto (l'identità cambia ad ogni ricompilazione).

  • Identità esatta di tutti i codici oggetto a cui il codice oggetto fa riferimento (l'identità cambia ad ogni ricompilazione).

  • Fattori di sicurezza.

Quando genera un'immagine nativa, Ngen.exe registra queste informazioni. Quando si esegue un assembly, il runtime cerca l'immagine nativa generata con le opzioni e le impostazioni che corrispondono all'ambiente corrente del computer. Se non viene individuata un'immagine nativa corrispondente, verrà ripristinata la compilazione JIT di un assembly. Le modifiche alle impostazioni e all'ambiente di un computer che rendono non valide le immagini native sono le seguenti:

  • Versione di .NET Framework.

    Se viene eseguito un aggiornamento di .NET Framework, tutte le immagini native create utilizzando Ngen.exe non saranno più valide. Per questo motivo, tutti gli aggiornamenti di .NET Framework eseguono il comando Ngen Update per garantire che tutte le immagini native vengano rigenerate. .NET Framework crea automaticamente nuove immagini native per le librerie di .NET Framework installate.

  • Versione del sistema operativo, se si è passati dalla famiglia Windows 9x alla famiglia Windows NT.

    Se ad esempio la versione del sistema operativo in esecuzione su un computer passa da Windows 98 a Windows XP, tutte le immagini native memorizzate nella cache delle immagini native non saranno più valide. Tuttavia, se si passa da Windows 2000 a Windows XP, le immagini continueranno a essere valide.

  • Identità esatta dell'assembly.

    Se si ricompila un assembly, l'immagine nativa corrispondente diventerà non valida.

  • Identità esatta di tutti gli assembly a cui fa riferimento l'assembly.

    Se si aggiorna un assembly gestito, tutte le immagini native che dipendono direttamente o indirettamente dall'assembly in questione diventano non valide e devono essere rigenerate. Sono inclusi in tal senso i riferimenti ordinari e le dipendenze con associazione forte. Ogni volta che viene applicato un aggiornamento software, il programma di installazione esegue un comando Ngen Update per garantire che tutte le immagini native dipendenti vengano rigenerate.

  • Fattori di sicurezza.

    La modifica dei criteri di sicurezza del computer per limitare le autorizzazioni concesse in precedenza a un assembly può rendere non valida un'immagine nativa compilata in precedenza per l'assembly in questione.

    Per informazioni dettagliate sul modo con cui Common Language Runtime gestisce la sicurezza di accesso al codice e sull'utilizzo delle autorizzazioni, vedere Sicurezza dall'accesso di codice.

Per assicurarsi che le immagini native vengano utilizzate dall'applicazione, è possibile utilizzare il Fuslogvw.exe (Visualizzatore log associazioni assembly). Selezionare Native Images nella casella Log Categories della finestra del visualizzatore log associazione. Questo strumento fornisce informazioni sul motivo del rifiuto di un'immagine nativa.

Se Ngen.exe individua in un assembly metodi che non possono essere generati, li esclude dall'immagine nativa. Quando il runtime eseguirà questo assembly, utilizzerà la compilazione JIT per i metodi che non sono stati inclusi nell'immagine nativa. È possibile utilizzare l'assistente al debug gestito https://msdn.microsoft.com/it-it/library/fw872k46(v=vs.110).aspx per determinare quando il compilatore JIT inizia a compilare una funzione.

Mostra: