Come posso forzare .NET a utilizzare una copia locale di un assembly presente nel GAC

Ho un assembly .NET che (per ragioni al di fuori del mio controllo) deve essere nel GAC. Tuttavia, lo stesso assembly viene utilizzato da un altro programma, che ha una propria copia di una versione precedente dello stesso assembly. Deve utilizzare la propria copia e non qualsiasi cosa sia nel GAC. Il corretto controllo delle versioni è probabilmente più problematico di quanto valga in questo caso, per ragioni a cui non entrerò. Le mie domande sono: c’è comunque da dire a .NET: basta usare QUESTA DLL, proprio qui in questa directory – ignorare tutto ciò che si trova nel GAC o in qualsiasi altro luogo .

Assicurati che il GAC Assembly e l’Assemblaggio locale abbiano numeri di versione diversi (non è una ctriggers idea lasciare che il tuo numero di build, almeno, incrementa automaticamente tramite wild card la tua AssemblyVersion in AssemblyInfo: [assembly: AssemblyVersion (“1.0.0. *” )]). Quindi, reindirizza l’associazione dell’assieme utilizzando la configurazione dell’app:

Nel tuo caso, non avrai bisogno dell’attributo “applyTo” della configurazione assemblyBinding. Hai solo bisogno di qualcosa come:

        

Se hanno lo stesso numero di versione, la risposta è imansible. Se si tenta di caricare un assembly con lo stesso nome assembly completo (nome, versione, chiave) come assembly GAC, CLR selezionerà l’assembly GAC ogni volta.

È ansible impostare DEVPATH per forzare il caricamento di un assieme, vedere il testo del collegamento

Questo non risponde alla tua domanda dal momento che ha significato solo per l’utilizzo dello sviluppo e anche se non è realmente consigliato in quanto non rispecchia l’utilizzo della produzione. Tuttavia ho pensato di condividerlo comunque perché è bello sapere.

Hai provato Assembly.LoadFromFile ()? Questa è una cosa manuale da fare, ma dovresti caricare il tuo assembly in memoria prima che sia necessario. .NET utilizzerà quindi quello in memoria invece di cercarlo.

Un altro modo sarebbe se l’assemblea locale non fosse firmata, potreste differenziarla in quel modo.

rapinare

Ho avuto un problema simile. Ho cambiato il publicKeyToken della dll di destinazione usando ildasm e ilasm per generare una nuova dll. L’ho quindi aggiornato nel riferimento del progetto in modo che punti alla nuova DLL. I passi che ho preso sono qui .

Questo ha funzionato per me.