it-swarm.com.de

Wie erzwinge ich, dass .NET eine lokale Kopie einer Assembly verwendet, die sich im GAC befindet

Ich habe eine .NET-Assembly, die (aus Gründen, die außerhalb meines Einflussbereichs liegen) im GAC sein muss. Dieselbe Assembly wird jedoch von einem anderen Programm verwendet, das über eine eigene Kopie einer älteren Version derselben Assembly verfügt. Es muss eine eigene Kopie verwenden und nicht das, was sich im GAC befindet. Die richtige Versionierung ist in diesem Fall wahrscheinlich mehr Aufwand als es wert ist, aus Gründen, auf die ich nicht eingehen möchte. Meine Fragen sind: Gibt es sowieso, um .NET zu sagen: Verwenden Sie DIESE DLL direkt hier in diesem Verzeichnis - ignorieren Sie alles, was Sie in der GAC oder an einem anderen Ort finden .

66
EMP

Stellen Sie sicher, dass die GAC-Assembly und die lokale Assembly unterschiedliche Versionsnummern haben (keine schlechte Idee, um zumindest Ihre Build-Nummer automatisch erhöhen zu lassen, indem Sie Ihre AssemblyVersion in AssemblyInfo mit Wildcard versehen: )]). Umleiten Sie dann Ihre Assembly-Bindung mithilfe der Konfiguration Ihrer App: 

In Ihrem Fall benötigen Sie nicht das Attribut "applyTo" der assemblyBinding-Konfiguration. Sie brauchen nur etwas wie:

<runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="YourAssembly" publicKeyToken="AAAAAAAAAAAA" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.0.8.1"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
44
Corbin March

Wenn sie dieselbe Versionsnummer haben, ist die Antwort nicht möglich. Wenn Sie versuchen, eine Assembly mit demselben vollständigen Assemblynamen (Name, Version, Schlüssel) wie eine GAC-Assembly zu laden, wählt die CLR jedes Mal die GAC-Assembly aus. 

26
JaredPar

Sie können den DEVPATH so einstellen, dass eine Assembly erzwungen wird, siehe Linktext

Dies beantwortet Ihre Frage nicht, da sie nur für die Verwendung in der Entwicklung gedacht war und selbst dann nicht wirklich empfohlen wird, da sie die Verwendung in der Produktion nicht widerspiegelt. Ich dachte jedoch, ich werde es trotzdem weitergeben, da es gut zu wissen ist. 

10
Ying

Ich hatte ein ähnliches Problem. Ich habe das publicKeyToken der Zieldll geändert, indem Sie ildasm und ilasm verwendet haben, um eine neue DLL zu generieren. Ich habe es dann in der Projektreferenz aktualisiert, um auf die neue DLL hinzuweisen. Die Schritte, die ich unternommen habe, sind hier .

Das hat bei mir funktioniert.

1
dasons

Haben Sie Assembly.LoadFromFile () versucht? Dies ist eine manuelle Sache, die Sie tun sollten, aber Sie sollten Ihre Assembly in den Speicher laden, bevor sie benötigt wird. .NET verwendet dann den im Speicher, anstatt danach zu suchen. 

Ein anderer Weg wäre, wenn die lokale Versammlung nicht unterzeichnet wäre, man könnte es auf diese Weise unterscheiden.

Rauben

1
Robert Wagner

Ein Grund dafür, dass die Bindungsumleitung nicht funktioniert, liegt darin, dass der Oracle.ManagedDataAccess-Provider eine andere Suchreihenfolge für DLLs hat als der nicht verwaltete Provider. Der nicht verwaltete Anbieter wird im Anwendungsverzeichnis gestartet, sucht dann im DLL-Pfad in der Registrierung, dann im DLL-Pfad in machine.config und dann im DLL-Pfad in web.config. Gemäß der Oracle-Dokumentation funktioniert die Suchreihenfolge für den verwalteten Anbieter folgendermaßen:

Managed Driver referenziert diese Assemblys anhand der folgenden Suchreihenfolge:

  1. Globaler Assembly-Cache
  2. Das bin-Verzeichnis der Webanwendung oder das EXE-Verzeichnis der Windows-Anwendung 
  3. Das Unterverzeichnis x86 oder x64 basiert darauf, ob die Anwendung in 32-Bit- oder 64-Bit-.NET Framework ausgeführt wird. Wenn die Anwendung mit AnyCPU erstellt wird, verwendet ODP.NET die korrekte Bitweite DLL, solange die Assembly verfügbar ist. Oracle empfiehlt die Verwendung dieser Methode zum Suchen nach abhängigen Assemblys, wenn Ihre Anwendung AnyCPU ist. 

https://docs.Oracle.com/de/database/Oracle/oracle-database/12.2/odpnt/installODPmd.html#GUID-0E834EC7-21DF-4913-B712-2B0A07FD58FD

Um dieses Problem zu lösen, können Sie die Registrierung der GAC Assembly OR aufheben. Fügen Sie einfach eine andere Version von Oracle.ManagedDataAccess in Ihre bin und web.config ein, als wenn Sie die GAC Assembly deinstallieren können.

0
Charles Owen