Esecuzione side-by-side in .NET FrameworkSide-by-Side Execution in the .NET Framework

L'esecuzione side-by-side consente di eseguire più versioni di un'applicazione o di un componente sullo stesso computer.Side-by-side execution is the ability to run multiple versions of an application or component on the same computer. È possibile disporre contemporaneamente sullo stesso computer di più versioni di Common Language Runtime e di più versioni di applicazioni e componenti che usano una versione runtime.You can have multiple versions of the common language runtime, and multiple versions of applications and components that use a version of the runtime, on the same computer at the same time.

Nella figura riportata di seguito viene illustrato l'uso di due diverse versioni runtime da parte di più applicazioni sullo stesso computer.The following illustration shows several applications using two different versions of the runtime on the same computer. Nelle applicazioni A, B e C viene usata la versione runtime 1.0, mentre nell'applicazione D viene usata la versione runtime 1.1.Applications A, B, and C use runtime version 1.0, while application D uses runtime version 1.1.

Esecuzione side-by-sideSide-by-side execution
Esecuzione side-by-side di due versioni runtimeSide-by-side execution of two versions of the runtime

.NET Framework è costituito dal Common Language Runtime e da una raccolta di assembly contenenti i tipi di API.The .NET Framework consists of the common language runtime and a collection of assemblies that contain the API types. Per il runtime e gli assembly .NET Framework vengono usate versioni distinte.The runtime and the .NET Framework assemblies are versioned separately. La versione runtime 4.0, ad esempio, corrisponde in realtà alla versione 4.0.319, mentre la versione 1.0 degli assembly .NET Framework rappresenta la versione 1.0.3300.0.For example, version 4.0 of the runtime is actually version 4.0.319, while version 1.0 of the .NET Framework assemblies is version 1.0.3300.0.

Nella figura riportata di seguito viene illustrato l'uso di due diverse versioni di un componente da parte di più applicazioni sullo stesso computer.The following illustration shows several applications using two different versions of a component on the same computer. Nelle applicazioni A e B viene usata la versione 1.0 del componente, mentre nell'applicazione C viene usata la versione 2.0 dello stesso componente.Application A and B use version 1.0 of the component while Application C uses version 2.0 of the same component.

Esecuzione side-by-sideSide-by-side execution
Esecuzione side-by-side di due versioni di un componenteSide-by-side execution of two versions of a component

L'esecuzione side-by-side offre un maggiore controllo sulle versioni di un componente a cui viene associata un'applicazione, nonché sulla versione runtime usata da un'applicazione.Side-by-side execution gives you more control over which versions of a component an application binds to, and more control over which version of the runtime an application uses.

Vantaggi dell'esecuzione side-by-sideBenefits of Side-by-Side Execution

Prima del rilascio di Windows XP e .NET Framework si verificavano conflitti tra le DLL poiché le applicazioni non erano in grado di effettuare una distinzione tra versioni incompatibili dello stesso codice.Prior to Windows XP and the .NET Framework, DLL conflicts occurred because applications were unable to distinguish between incompatible versions of the same code. Le informazioni sui tipi contenute in una DLL erano associate solo a un nome file.Type information contained in a DLL was bound only to a file name. Un'applicazione non disponeva di alcuno strumento per verificare se i tipi contenuti in una DLL corrispondevano ai tipi con cui l'applicazione era stata compilata.An application had no way of knowing if the types contained in a DLL were the same types that the application was built with. Di conseguenza, una nuova versione di un componente poteva sovrascrivere una versione precedente pregiudicando l'esecuzione delle applicazioni.As a result, a new version of a component could overwrite an older version and break applications.

Allo scopo di eliminare i conflitti tra DLL, l'esecuzione side-by-side e .NET Framework forniscono le funzionalità illustrate di seguito.Side-by-side execution and the .NET Framework provide the following features to eliminate DLL conflicts:

  • Assembly con nome sicuro.Strong-named assemblies.

    Nell'ambito dell'esecuzione side-by-side vengono usati assembly con nome sicuro per associare le informazioni sui tipi a una specifica versione di un assembly.Side-by-side execution uses strong-named assemblies to bind type information to a specific version of an assembly. In questo modo viene impedita l'associazione di un'applicazione o di un componente a una versione non valida di un assembly.This prevents an application or component from binding to an invalid version of an assembly. Gli assembly con nome sicuro consentono la presenza di più versioni di un file sullo stesso computer e il relativo uso da parte delle applicazioni.Strong-named assemblies also allow multiple versions of a file to exist on the same computer and to be used by applications. Per altre informazioni, vedere Assembly con nomi sicuri.For more information, see Strong-Named Assemblies.

  • Archiviazione del codice con supporto della versione.Version-aware code storage.

    .NET Framework consente l'archiviazione del codice con supporto della versione nella Global Assembly Cache.The .NET Framework provides version-aware code storage in the global assembly cache. La Global Assembly Cache rappresenta una cache di codice a livello di computer presente su tutti i computer su cui è installato .NET Framework.The global assembly cache is a computer-wide code cache present on all computers with the .NET Framework installed. Questa cache, in cui gli assembly vengono archiviati in base alle informazioni sulla versione, sulle impostazioni cultura e sull'editore, supporta più versioni di componenti e applicazioni.It stores assemblies based on version, culture, and publisher information, and supports multiple versions of components and applications. Per altre informazioni, vedere Global Assembly Cache.For more information, see Global Assembly Cache.

  • Isolamento.Isolation.

    Usando .NET Framework, è possibile creare applicazioni e componenti eseguiti in isolamento.Using the .NET Framework, you can create applications and components that execute in isolation. L'isolamento è un componente essenziale dell'esecuzione side-by-side.Isolation is an essential component of side-by-side execution. Per l'isolamento è necessario tenere traccia delle risorse usate e condividere in modo sicuro le risorse tra più versioni di un'applicazione o di un componente.It involves being aware of the resources you are using and sharing resources with confidence among multiple versions of an application or component. L'isolamento comprende inoltre l'archiviazione dei file in base alla versione.Isolation also includes storing files in a version-specific way. Per altre informazioni sull'isolamento, vedere Linee guida per la creazione di applicazioni e componenti per l'esecuzione affiancata di più versioni.For more information about isolation, see Guidelines for Creating Components for Side-by-Side Execution.

Compatibilità tra versioniVersion Compatibility

Le versioni 1.0 e 1.1 di .NET Framework sono state progettate in modo da garantirne la compatibilità.Versions 1.0 and 1.1 of the .NET Framework are designed to be compatible with one another. È previsto che un'applicazione compilata con .NET Framework versione 1.0 possa essere eseguita con la versione 1.1 e che un'applicazione compilata con .NET Framework versione 1.1 possa essere eseguita con la versione 1.0.An application built with the .NET Framework version 1.0 should run on version 1.1, and an application built with the .NET Framework version 1.1 should run on version 1.0. Le funzionalità delle API aggiunte nella versione 1.1 di .NET Framework non possono tuttavia essere usate nella versione 1.0.Note, however, that API features added in version 1.1 of the .NET Framework will not work with version 1.0 of the .NET Framework. Le applicazioni create con la versione 2.0 potranno essere eseguite solo con quella stessa versione.Applications created with version 2.0 will run on version 2.0 only. Pertanto non sarà possibile eseguirle con la versione 1.1 o precedente.Version 2.0 applications will not run on version 1.1 or earlier.

Le versioni di .NET Framework vengono gestite come una singola unità costituita dal runtime e dagli assembly .NET Framework associati, in base a un concetto definito unificazione degli assembly.Versions of the .NET Framework are treated as a single unit consisting of the runtime and its associated .NET Framework assemblies (a concept referred to as assembly unification). È possibile reindirizzare l'associazione di assembly in modo da includere altre versioni degli assembly .NET Framework. L'override dell'associazione di assembly predefinita può tuttavia rivelarsi rischioso e richiede l'esecuzione di test accurati prima della distribuzione.You can redirect assembly binding to include other versions of the .NET Framework assemblies, but overriding the default assembly binding can be risky and must be rigorously tested before deployment.

Individuazione delle informazioni sulla versione runtimeLocating Runtime Version Information

Le informazioni sulla versione runtime con cui è stata compilata un'applicazione o un componente e le versioni runtime richieste per l'esecuzione dall'applicazione sono archiviate in due posizioni.Information on which runtime version an application or component was compiled with and which versions of the runtime the application requires to run are stored in two locations. Quando viene compilata un'applicazione o un componente, le informazioni sulla versione runtime usata per la compilazione vengono archiviate nel file eseguibile gestito.When an application or component is compiled, information on the runtime version used to compile it is stored in the managed executable. Le informazioni sulle versioni di runtime richieste dall'applicazione o dal componente vengono archiviate nel file di configurazione dell'applicazione.Information on the runtime versions the application or component requires is stored in the application configuration file.

Informazioni sulla versione runtime nel file eseguibile gestitoRuntime Version Information in the Managed Executable

L'intestazione del file eseguibile di tipo PE di tutte le applicazioni e componenti gestiti contiene informazioni sulla versione runtime con cui sono stati compilati.The portable executable (PE) file header of each managed application and component contains information about the runtime version it was built with. Common Language Runtime usa queste informazioni per determinare la versione runtime che è più probabile venga eseguita dall'applicazione.The common language runtime uses this information to determine the most likely version of the runtime the application needs to run.

Informazioni sulla versione runtime nel file di configurazione dell'applicazioneRuntime Version Information in the Application Configuration File

Oltre alle informazioni nell'intestazione del file PE, un'applicazione può essere distribuita con un file di configurazione dell'applicazione che fornisce informazioni sulla versione runtime.In addition to the information in the PE file header, an application can be deployed with an application configuration file that provides runtime version information. Il file di configurazione dell'applicazione è un file basato su XML fornito con un'applicazione, che viene creato dallo sviluppatore dell'applicazione.The application configuration file is an XML-based file that is created by the application developer and that ships with an application. L'<elemento della <sezione , se presente in questo file, specifica le versioni di runtime e le versioni di un componente supportate dall'applicazione.The <requiredRuntime> Element of the <startup> section, if it is present in this file, specifies which versions of the runtime and which versions of a component the application supports. Questo file può essere anche usato durante i test per verificare la compatibilità di un'applicazione con diverse versioni di runtime.You can also use this file in testing to test an application's compatibility with different versions of the runtime.

Il codice non gestito, incluse le applicazioni COM e COM+, può disporre di file di configurazione dell'applicazione usate dal runtime per l'interazione con il codice gestito.Unmanaged code, including COM and COM+ applications, can have application configuration files that the runtime uses for interacting with managed code. Il file di configurazione dell'applicazione ha effetto sul codice gestito attivato tramite COM.The application configuration file affects any managed code that you activate through COM. Il file può specificare le versioni di runtime supportate, nonché i reindirizzamenti dell'assembly.The file can specify which runtime versions it supports, as well as assembly redirects. Per impostazione predefinita, la chiamata delle applicazioni di interoperabilità COM al codice gestito usa la versione runtime più recente installata nel computer.By default, COM interop applications calling to managed code use the latest version of the runtime installed on the computer.

Per altre informazioni sui file di configurazione dell'applicazione, vedere Configuring Apps (Configurazione di app).For more information about the application configuration files, see Configuring Apps.

Determinazione della versione runtime da caricareDetermining Which Version of the Runtime to Load

Common Language Runtime usa le informazioni seguenti per determinare la versione runtime da caricare per un'applicazione:The common language runtime uses the following information to determine which version of the runtime to load for an application:

  • Le versioni di runtime disponibili.The runtime versions that are available.

  • Le versioni di runtime supportate da un'applicazione.The runtime versions that an application supports.

Versioni di runtime supportateSupported Runtime Versions

Il runtime usa il file di configurazione dell'applicazione e l'intestazione del file eseguibile di tipo PE per determinare quale versione runtime è supportata da un'applicazione.The runtime uses the application configuration file and the portable executable (PE) file header to determine which version of the runtime an application supports. Se non sono presenti file di configurazione dell'applicazione, il runtime carica la versione runtime specificata nell'intestazione del file PE dell'applicazione, se disponibile.If no application configuration file is present, the runtime loads the runtime version specified in the application's PE file header, if that version is available.

Se è presente un file di configurazione dell'applicazione, il runtime determina la versione runtime appropriata per eseguire il caricamento in base ai risultati del processo riportato di seguito:If an application configuration file is present, the runtime determines the appropriate runtime version to load based on the results of the following process:

  1. Il runtime esamina l'<elemento supportedRuntime> nel file di configurazione dell'applicazione.The runtime examines the <supportedRuntime> Element element in the application configuration file. Se sono presenti una o più versioni runtime supportate specificate nell'elemento <supportedRuntime>, il runtime carica la versione runtime specificata dal primo elemento <supportedRuntime>.If one or more of the supported runtime versions specified in the <supportedRuntime> element are present, the runtime loads the runtime version specified by the first <supportedRuntime> element. Se questa versione non è disponibile, il runtime esamina l'elemento <supportedRuntime> successivo e prova a caricare la versione runtime specificata.If this version is not available, the runtime examines the next <supportedRuntime> element and attempts to load the runtime version specified. Se tale versione runtime non è disponibile, vengono esaminati gli elementi <supportedRuntime> successivi.If this runtime version is not available, subsequent <supportedRuntime> elements are examined. Se non è disponibile alcuna versione runtime supportata, il runtime non riesce a caricare una versione runtime e viene visualizzato un messaggio per l'utente (vedere il passaggio 3).If none of the supported runtime versions are available, the runtime fails to load a runtime version and displays a message to the user (see step 3).

  2. Il runtime legge l'intestazione del file PE del file eseguibile dell'applicazione.The runtime reads the PE file header of the application's executable file. Se la versione runtime specificata dall'intestazione del file PE è disponibile, il runtime carica tale versione.If the runtime version specified by the PE file header is available, the runtime loads that version. Se la versione runtime specificata non è disponibile, il runtime cerca una versione runtime indicata da Microsoft come compatibile con la versione runtime nell'intestazione del file PE.If the runtime version specified is not available, the runtime searches for a runtime version determined by Microsoft to be compatible with the runtime version in the PE header. Se tale versione non viene trovata, il processo procede al passaggio 3.If that version is not found, the process continues to step 3.

  3. Il runtime visualizza un messaggio che informa che non è disponibile la versione runtime supportata dall'applicazione.The runtime displays a message stating that the runtime version supported by the application is unavailable. Il runtime non viene caricato.The runtime is not loaded.

    Nota

    È possibile evitare la visualizzazione del messaggio usando il valore NoGuiFromShim nella chiave del Registro di sistema HKLM\Software\Microsoft\.NETFramework o nella variabile di ambiente COMPLUS_NoGuiFromShim.You can suppress the display of this message by using the NoGuiFromShim value under the registry key HKLM\Software\Microsoft\.NETFramework or using the environment variable COMPLUS_NoGuiFromShim. Ad esempio, è possibile eliminare il messaggio per le applicazioni che in genere non interagiscono con l'utente, ad esempio le installazioni automatiche o i servizi di Windows.For example, you can suppress the message for applications that do not typically interact with the user, such as unattended installations or Windows services. Quando si sceglie di non visualizzare il messaggio, il runtime scrive un messaggio nel log eventi.When this message display is suppressed, the runtime writes a message to the event log. Impostare il valore del Registro di sistema NoGuiFromShim su 1 per impedire la visualizzazione di questo messaggio in tutte le applicazioni di un computer.Set the registry value NoGuiFromShim to 1 to suppress this message for all applications on a computer. In alternativa, impostare la variabile di ambiente COMPLUS_NoGuiFromShim su 1 per eliminare il messaggio nelle applicazioni in esecuzione in uno specifico contesto utente.Alternately, set the COMPLUS_NoGuiFromShim environment variable to 1 to suppress the message for applications running in a particular user context.

Nota

Dopo aver caricato una versione runtime, i reindirizzamenti dell'associazione di assembly possono richiedere il caricamento di una versione diversa di un singolo assembly di .NET Framework.After a runtime version is loaded, assembly binding redirects can specify that a different version of an individual .NET Framework assembly be loaded. Questi reindirizzamenti dell'associazione hanno effetto solo sull'assembly reindirizzato.These binding redirects affect only the specific assembly that is redirected.

Nomi parziali di assembly ed esecuzione side-by-side di più versioniPartially Qualified Assembly Names and Side-by-Side Execution

I riferimenti ad assembly parziali possono essere usati solo per l'associazione ad assembly contenuti in una directory dell'applicazione perché possono causare problemi nell'esecuzione side-by-side.Because they are a potential source of side-by-side problems, partially qualified assembly references can be used only to bind to assemblies within an application directory. Evitare riferimenti ad assembly parziali nel codice.Avoid partially qualified assembly references in your code.

Per limitare l'effetto dei riferimenti ad assembly parziali nel codice, è possibile usare l'elemento <qualifyAssembly> del file di configurazione di un'applicazione per completare i riferimenti ad assembly parziali presenti nel codice.To mitigate partially qualified assembly references in code, you can use the <qualifyAssembly> element in an application configuration file to fully qualify partially qualified assembly references that occur in code. Usare l'elemento <qualifyAssembly> per specificare solo i campi non impostati nel riferimento parziale.Use the <qualifyAssembly> element to specify only fields that were not set in the partial reference. L'identità dell'assembly elencata nell'attributo fullName deve contenere tutte le informazioni necessarie per completare il nome dell'assembly, ovvero nome dell'assembly, chiave pubblica, impostazioni cultura e versione.The assembly identity listed in the fullName attribute must contain all the information needed to fully qualify the assembly name: assembly name, public key, culture, and version.

L'esempio seguente mostra la voce del file di configurazione dell'applicazione che consente di completare un assembly denominato myAssembly.The following example shows the application configuration file entry to fully qualify an assembly called myAssembly.

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">   
<qualifyAssembly partialName="myAssembly"   
fullName="myAssembly,  
      version=1.0.0.0,   
publicKeyToken=...,   
      culture=neutral"/>   
</assemblyBinding>   

Se un'istruzione di caricamento dell'assembly fa riferimento a myAssembly, queste impostazioni del file di configurazione attivano la conversione automatica da parte del runtime del riferimento myAssembly parziale in riferimento completo.Whenever an assembly load statement references myAssembly, these configuration file settings cause the runtime to automatically translate the partially qualified myAssembly reference to a fully qualified reference. Ad esempio, Assembly.Load("myAssembly") diventa Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral").For example, Assembly.Load("myAssembly") becomes Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral").

Nota

È possibile usare il metodo LoadWithPartialName per ignorare la restrizione di Common Language Runtime che impedisce il caricamento degli assembly con riferimento parziale dalla Global Assembly Cache.You can use the LoadWithPartialName method to bypass the common language runtime restriction that prohibits partially referenced assemblies from being loaded from the global assembly cache. Questo metodo deve essere usato solo in scenari remoti perché può causare problemi nell'esecuzione side-by-side.This method should be used only in remoting scenarios as it can easily cause problems in side-by-side execution.

TitoloTitle DescrizioneDescription
Procedura: abilitare e disabilitare il reindirizzamento di associazione automaticoHow to: Enable and Disable Automatic Binding Redirection Viene descritto come associare un'applicazione a una versione specifica di un assembly.Describes how to bind an application to a specific version of an assembly.
Configuring Assembly Binding Redirection (Configurazione del reindirizzamento di associazione di assembly)Configuring Assembly Binding Redirection Viene illustrato come reindirizzare i riferimenti di associazione di assembly a una specifica versione degli assembly di .NET Framework.Explains how to redirect assembly binding references to a specific version of the .NET Framework assemblies.
In-Process Side-by-Side Execution (Esecuzione side-by-side In-Process)In-Process Side-by-Side Execution Viene illustrato come usare l'attivazione dell'host di runtime side-by-side in-process per eseguire più versioni di CLR in un solo processo.Discusses how you can use in-process side-by-side runtime host activation to run multiple versions of the CLR in a single process.
Assembly in Common Language RuntimeAssemblies in the Common Language Runtime Viene fornita una panoramica sui concetti di base relativi agli assembly.Provides a conceptual overview of assemblies.
Domini dell'applicazioneApplication Domains Viene fornita una panoramica sui concetti di base relativi ai domini applicazione.Provides a conceptual overview of application domains.

RiferimentiReference

Elemento <supportedRuntime><supportedRuntime> Element