Perché la mia applicazione utilizza sempre la versione più recente GAC anziché la versione di riferimento?
-
13-12-2019 - |
Domanda
Context
Ho 2 diverse versioni di un assembly installato in GAC, versione 1.0 e versione 2.0. Ho fatto un'applicazione che si riferisce a 1.0 come versione specifica.
Edizione
Quando eseguo la mia applicazione, caricherà sempre la versione 2.0 mentre l'applicazione è specificamente referendando la versione 1.0.
Domanda
Perché è questo accadendo? Come posso forzare la mia applicazione per caricare la versione in cui è stato compilato?
Non mi sembra che questo abbia qualcosa a che fare con un reindirizzamento vincolante poiché la mia applicazione non era nemmeno a conoscenza della versione 2.0 quando l'ho costruito e che la "versione specifica" di riferimento è impostata su TRUE. Grazie.
.
Modifica:
L'assembly I AM Darencing è in realtà Oracle.DataAccess dal pacchetto ODAC. Ho notato che altre assemblee denominate policy.x.xxx.oracle.DataAccess dove pubblicato in GAC.
.
Modifica 2:
Dopo aver esaminato la politica Oracle.DataAccess ho trovato la configurazione che definisce il reindirizzamento vincolante:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="4.112.0.0-4.112.3.0" newVersion="4.112.3.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
.
Anche se ho aggiunto il reindirizzamento obbligatorio invertito nella mia configurazione dell'applicazione, la politica in GAC sembra avere la priorità. Ho trovato un MSDN Articolo trattando il soggetto e suggerire di ignorare la politica con questa configurazione: Ma ancora non funziona ...
.
Modifica 3:
Ho provato a rimuovere la politica dal GAC e riavviato la mia macchina. Finalmente ha funzionato. Non si sente come uno sviluppo confortevole della soluzione, ma questa politica ha rotto una delle mie applicazioni che significa disabilitare la politica è la cosa giusta da fare nel mio caso.
.
Modifica finale:
Igor mi ha dato la risposta giusta. Tutto quello che dovevo fare al punto di soluzione di soluzionare quelle politiche per utilizzare l'impostazione publisherPolicy
nella sezione giusta configrazione:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<publisherPolicy apply="no"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
. Soluzione
Dopo aver modificato la tua domanda diventa chiaro che questo è il file di politica che influisce sul legame del gruppo.
In caso di Oracle c'è un file chiamato policy.x.y.oracle.dataaccess.config con i contenuti simili a questo:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="10.1.0.000-10.2.0.100" newVersion="10.2.0.100"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
.
La politica è installata da Oracle Installer e reindirizza Oracle.DataAccess.dll
alla versione più recente, poiché Oracle ritiene che la Biblioteca sia compatibile.
Modifica: se non si desidera che il criterio dell'editore venga applicato per un particolare assembly , inserire l'elemento nell'elemento:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly" publicKeyToken="..." culture="en-us" />
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
.