Reindirizzamento dell'assembly Binding: come e perché?


127

Questa non è una domanda problematica, ma una domanda di comprensione generale sul funzionamento del reindirizzamento dell'associazione dell'assembly.

Interrogazioni

  1. Perché il reindirizzamento vincolante mostra solo la versione principale e non i numeri secondari, di build e di revisione?
  2. La vecchia e la nuova versione cambiano solo quando c'è un cambiamento nella versione principale?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>

Può essere qualsiasi versione, non solo quella principale. Ad esempio:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Evk

@Evk: tutti gli esempi che ho visto mostrano solo la versione principale.
Nikhil Agrawal

4
Bene, questi sono solo esempi, e non è mai stato affermato che sia l'unico modo possibile.
Evk

Risposte:


166

Perché sono necessari reindirizzamenti vincolanti? Supponiamo di avere l'applicazione A che fa riferimento alla libreria B e anche alla libreria C della versione 1.1.2.5. La libreria B a sua volta fa riferimento anche alla libreria C, ma della versione 1.1.1.0. Ora abbiamo un conflitto, perché non è possibile caricare versioni diverse dello stesso assembly in fase di esecuzione. Per risolvere questo conflitto potresti usare il reindirizzamento del binding, di solito alla nuova versione (ma può essere anche alla vecchia). Puoi farlo aggiungendo quanto segue al file app.config dell'applicazione A, nella configuration > runtime > assemblyBindingsezione (vedi qui per un esempio di file di configurazione completo):

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

Puoi anche specificare un intervallo di versioni da mappare:

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

Ora la libreria B, che è stata compilata con riferimento a C della versione 1.1.1.0, utilizzerà C della versione 1.1.2.5 a runtime. Ovviamente, è meglio assicurarsi che la libreria C sia compatibile con le versioni precedenti o questo potrebbe portare a risultati imprevisti.

Puoi reindirizzare qualsiasi versione delle librerie, non solo quelle principali.


In quale file e in quale sezione vengono inseriti? Qualcuno può fornire un collegamento a una fonte come MSDN o simili per riferimento? Ricorda che le persone atterreranno sui tuoi articoli SO Q / A da tutta la sfera dei motori di ricerca e i riferimenti sono fondamentali. Un collega mi ha detto di "aggiungere un reindirizzamento dell'assembly al tuo file exe" subito prima di andare in vacanza per una settimana e sono atterrato qui e sebbene questa risposta sembri ottima, manca di contesto e riferimento.
partecipazione il

Domande valide @tpartee, ho modificato la risposta (in attesa di revisione tra pari) per includere la sezione di configurazione e un collegamento a docs.microsoft.com/en-us/dotnet/framework/configure-apps/…
Kobus Smit

1
@AlexanderDerck nel file di configurazione dell'applicazione A - non hanno effetto (per quanto ne so) nei file di configurazione delle librerie, tranne forse quando questa libreria è una libreria di unit test ed è "eseguita" in un certo senso da un runner di unit test.
Evk

1
@AlexanderDerck c'era un paio di settimane fa domanda, con molti upvotes e anche di taglie, che stava chiedendo esattamente questo, ma nessuno è stato in grado di fornire risposta convincente - stackoverflow.com/q/48377474/5311735
EVK

1
@CodeEngine publicKeyToken identifica l'assembly C.Solo gli assembly firmati hanno quel token di chiave pubblica che li identifica. Ecco una domanda relativa a come si può scoprire che token dato che si dispone di assemblaggio: stackoverflow.com/q/3045033/5311735
EVK

56

Abbiamo riscontrato un problema con il reindirizzamento vincolante per NewtonSoft.Json. Abbiamo cercato la versione del file nelle proprietà del file win 10 "9.0.1.19813", abbiamo cercato il numero e il reindirizzamento ha continuato a fallire. Ulteriori indagini e hanno scoperto che stavamo esaminando la versione del file e non la versione dell'assembly. Quindi, mi chiedo se le persone confondano la versione del file (che cambia spesso) e la versione dell'assembly (che non puoi vedere in Windows 10 File Explorer). Per vedere la versione Assembly di una dll puoi eseguirlo in PowerShell. Sostituisci il nome dll con quello per cui vuoi trovare la versione.

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

Il risultato di cui sopra è.

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

Vedi riferimenti:

Come posso vedere la versione assembly di un assembly .NET in Windows Vista e versioni successive (Windows 7, 2008)?

https://support.microsoft.com/en-nz/help/556041

inserisci qui la descrizione dell'immagine


12
Voto positivo per aver evidenziato la differenza tra la versione del file e la versione dell'Assembly !!
mrid
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.