Distribuzione di componenti con versioni

Per illustrare come è possibile configurare le applicazioni per l'utilizzo di componenti condivisi più recenti o sicuramente compatibili, è necessario installare entrambe le versioni 2.0 di Reverser.dll nella cache assembly. Questa operazione viene eseguita con il file Build.bat che utilizza lo strumento Cache assembly globale (Gacutil.exe):

gacutil.exe /i Reverser.dll

Dopo l'installazione di questi assembly Reverser, sarà possibile esaminare la cache assembly passando alla directory \DirectoryWindows\Assembly e utilizzando l'estensione shell del visualizzatore cache:

A questo punto è possibile compilare il file eseguibile VerClient per il quale verrà specificata la versione 2.0.0.0 del componente Reverser:

csc /reference:Stringer\Stringer.dll; 
...  Reverser_v2.0.0.0\Reverser.dll VerClient.cs

Come indicato in (3) Percorso per i componenti privati e in Criteri di associazione, è possibile controllare l'individuazione e l'associazione di assembly in fase di esecuzione utilizzando un file di configurazione dell'applicazione. È possibile in particolare utilizzare il tag BindingRedirect per reindirizzare il riferimento a una diversa versione di un assembly con nome sicuro, sostituendo la versione nel riferimento originale con questa nuova versione. Con l'opzione seguente si specifica che per un riferimento all'assembly dalla versione 2.0.0.0 alla 2.0.0.9, la versione da utilizzare in fase di esecuzione è la versione 2.0.1.0:

<bindingRedirect
   oldVersion="2.0.0.0-2.0.0.9" newVersion="2.0.1.0"
/>

L'amministratore ha pertanto la possibilità di riconfigurare un'applicazione senza doverla ricompilare.

Nel file di esempio VerClient.exe.config nella sottodirectory 5_Versioned viene fornita una dimostrazione di questa opzione.

Listato 2. File di configurazione per VerClient.exe (VerClient.exe.config)

<configuration>   
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="Stringer"/>
      <publisherPolicy apply="no"/>
      <dependentAssembly>
        <assemblyIdentity name="Reverser" 
            publicKeyToken="0038acc8beadf1e5"
            culture=""/>
        <publisherPolicy apply="no"/>
        <bindingRedirect oldVersion="2.0.0.0"
          newVersion="2.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>  

Poiché un metodo di un tipo nella versione 2.0.1.0 di Reverser.dll è stato volutamente reso non compatibile con lo stesso metodo nella versione 2.0.0.0, il tentativo di chiamata di un client compatibile con la versione 2.0.0.0 a questa revisione successiva non riuscirà. Cambiando:

    newVersion="2.0.0.0"

in:

    newVersion="2.0.1.0"

è possibile dimostrare questo comportamento e verrà restituita un'eccezione MissingMethodException. Questo meccanismo consente di solito a un amministratore di riparare un'applicazione in modo che possa continuare a essere eseguita nel modo corretto qualora dovesse essere danneggiata dalla successiva installazione di un'altra applicazione per la quale è stata utilizzata una diversa versione dello stesso componente condiviso.

Quando infine si rende necessario ripulire l'applicazione, occorrerà rimuovere i file dei componenti condivisi dalla cache assembly:

gacutil /u reverser

Con questo meccanismo vengono rimosse dalla cache assembly tutte le versioni di un componente. Se il componente si trova ancora nel percorso privato dell'applicazione o in una sottodirectory corrispondente al nome del componente, verrà in seguito caricato da quel percorso.

Vedere anche

Riepilogo della distribuzione di package | Appendice A: ulteriori informazioni sulla creazione di package e sulla distribuzione | Appendice B: strumenti per la creazione di package e per la distribuzione