2009-06-11 15 views
63

Abbiamo un'applicazione Web distribuita in molti siti Web con solo modifiche al frontend, la parte back-end condivisa ha la DLL nel GAC, quindi è sufficiente aggiornare quella sola DLL e tutti i siti ottengono l'aggiornamento.Dll sia nel cestino che nel gac, quale viene utilizzato?

C'è un modo per sovrascrivere il GAC con una DLL nella cartella/bin per testare nuove funzionalità prima che vengano rilasciate?

risposta

78

Se ha lo stesso numero di versione della DLL di riferimento, viene utilizzato GAC.

Se si incrementa il numero di versione, ricostruire il sito Web facendo riferimento al nuovo numero di versione, inserire la nuova versione nella directory/bin, quindi verrà utilizzata quella DLL.

Se non si desidera modificare il numero di versione, si è praticamente sfortunati.

Quando .NET carica assemblee con nome forte, tenta innanzitutto di decidere quale numero di versione utilizzare. Lo fa prima tramite il riferimento, quindi cerca publisher policies, quindi cerca binding redirects nel file di configurazione.

Dopo aver eseguito questa operazione, cerca l'assembly nella GAC, quindi in qualsiasi codebase specified, quindi esegue la scansione di varie cartelle del file system per la DLL. Se in una di queste fasi trova l'assembly versione corretto, si ferma.

Se non si modifica il numero di versione dell'assembly con nome sicuro, .NET troverà quello originale nel GAC e smetterà di cercare. Si noti che poiché si arresta quando ne trova uno, e poiché la ricerca nel GAC è la prima, specificare una base di codice per l'assembly non andrà bene a meno che non si specifichi anche un nuovo numero di versione.

+1

Ho capito bene? Se la versione 1.0.0.0 si trova nel GAC ma compilo con la versione 1.0.0.1 e inserisco 1.0.0.1 nel mio BIN, GAC viene ignorato e viene utilizzato BIN.Se rimuovo il file .dll dal mio BIN, verrà utilizzato 1.0.0.0 nel GAC anche se ho compilato 1.0.0.1? –

+1

No. Se si compila un assembly con nome sicuro, sarà necessario il numero esatto della versione, a meno che non siano disponibili criteri di pubblicazione o reindirizzamenti di binding. –

+1

I criteri del publisher e i reindirizzamenti del binding consentono il reindirizzamento della versione #, quindi se il programma è compilato su 1.0.0.0 e vi è un reindirizzamento del binding o un criterio del publisher che specifica 1.0.0.1, questa diventa la versione che cerca. –

2

Penso che potrei dire lo stesso pensa come Adam Sills, ma riformulò per mia comprensione. Attraverso mio test, sembra che questo è ciò che accade:

  • Se la vostra applicazione è compilato con la versione 1.0.0.0 e 1.0.0.1 è nel GAC, allora si può omettere la DLL dal proprio/bin.
  • Se la tua app è compilata con la versione 1.0.0.1 e 1.0.0.0 nel GAC, DEVI inserire il file .dll nel tuo/bin per ignorare il GAC. Si verificherà un errore se la versione GAC è precedente alla versione richiesta dell'app, a meno che non includa la versione più recente nel/bin.

Spero che questo è corretto ...

+1

.NET Framework * non * esegue il reindirizzamento della versione degli assembly con nome sicuro automaticamente, almeno a partire da .NET 3.5 (runtime .NET 2.0). Teoricamente, .NET 4 potrebbe cambiare le regole, ma ne dubito. –

+1

Grazie! Ora capisco perché i miei test hanno funzionato con versioni diverse. Pensavo che il nome forte fosse solo la chiave con cui lo registravi. Ma in realtà ho due assembly registrati nel GAC 1.0.0.0 e 1.0.0.1 entrambi con lo stesso token di chiave pubblica. Ho pensato che se avessi usato la stessa chiave, 1.0.0.1 sostituisse 1.0.0.0. Ma non sembra essere il caso.
Grazie @Adam per l'aiuto! –

0

È possibile visualizzare le informazioni vincolanti nel file di registro utilizzando l'Assemblea Binding Log Viewer (Fuslogvw.exe), che è incluso nel Software Development Kit di Windows (SDK).

s

11

sono stato in grado di sovrascrivere il GAC con l'assembly nella cartella \ bin utilizzando il <codebase> Element.

Specificando <codebase version="1.2.3.4" href="/bin/MyAssembly.dll" /> nel mio file web.config, posso dire alla mia applicazione di utilizzare questa versione piuttosto che la versione specificata nel GAC.

Si potrebbe anche voler dare un'occhiata all'elemento <probing> per specificare le posizioni dell'assieme?

+5

dovresti ricontrollare che le tue DLL siano firmate o meno. GAC ha la precedenza su codebase e probe. Una volta trovata la versione firmata in GAC, si interrompe. Ho provato questo con 4.0 e il documento MSDN è accurato, prima BindingRedirect, poi GAC, poi CodeBase, poi Probe for StrongName assemblati – CodeCowboyOrg

Problemi correlati