Referenz zwei gleiche Baugruppen, die nur den öffentlichen Schlüssel zu unterscheiden
Mein Visual Studio 2008-Projekt verweist auf zwei (externe) Baugruppen (A+B) beide geschehen zu sein, verweisen auf dieselbe Dritte Baugruppe (C). Allerdings, die Montage Einer erwartet Baugruppe C, um einen öffentlichen Schlüssel, die Verschieden ist von dem, was Baugruppe B es erwartet haben.
Hier ist ein Beispiel für die offensichtliche Ausnahme:
Konnte nicht geladen, Datei oder assembly 'Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=9ad232b50c3e6444' oder eine Ihrer Abhängigkeiten. Die befindet assembly manifest definition entspricht nicht den Assemblyverweis. (Ausnahme von HRESULT: 0x80131040)
Natürlich, ich wäre nicht in der Lage, beide Versionen von C (nur unterschiedlich durch eine public-key) im selben Verzeichnis, deren Dateinamen gleich sind. Zweitens habe ich gefunden, dass die Verwendung von Montage-Bindung aus der Konfigurations-Datei erlaubt nur die version mapping, nicht öffentliche-Schlüssel-mapping.
Ich habe auch versucht es mit einer der Baugruppen C in ein separates Verzeichnis und konfigurieren Sie die CLR, um die Suche in diesem Verzeichnis wird beim laden von Baugruppen. Ich konnte nicht bekommen, dass die Arbeit, leider.
Ich bin mir bewusst, dass eine Neukompilierung des externen Bibliotheken (einer von Ihnen geschieht, werden open-Source -) würde dieses problem beheben, aber ich will nicht hinzufügen, dass die Belastung für meine Wartung zu planen, wenn es nicht absolut notwendig ist.
Also meine Frage ist: wie würde ich mich auf beide 'Versionen' von assembly C, die unterscheiden sich nur durch den öffentlichen Schlüssel?
UPDATE
Stolperte ich über diese Antwort auf eine Verwandte Frage, die einen interessanten Lösung mit ilmerge. Ich habe nicht überprüfte es noch nicht, aber es kann nützlich sein, um jemand zu kämpfen mit diesem problem.
- Ich hatte ähnliches problem und this ist, wie ich es behoben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Frage ich mich, ob
AssemblyResolve
funktionieren würde:Er bist, ich nehme an, Sie haben verwiesen, Ihre bevorzugte version und kann mit dem type -
SomeTypeInReferencedAssembly
um dieAssembly
; Sie können auch verwenden:Ich habe es nicht ausprobiert, aber hier bin ich im wesentlichen sagen, "bereitstellen einer einzigen version der dll, und wenn das system fragt die alte Lüge".
Sollten Sie nie zwei Baugruppen mit den gleiche version aber verschiedenen öffentlichen Schlüsseln, das ist ein Rezept für eine Katastrophe. Wenn die eigentliche Versammlung Versionen unterschiedlich sind, dann ist die absolute einfachste Lösung ist, legen Sie Sie in den global assembly cache (GAC). Dies wird jedoch nicht schön spielen, wenn Sie für den Umgang mit Instanzen von Typen in C und in A und B (zum Beispiel C erklärt
MyType
, und Sie erhalten eine Instanz vonMyType
von B und übergibt es an A. soweit die Laufzeit betrifft, so sind diese beiden Typen haben absolut nichts miteinander zu tun abgesehen von der Freigabe einen Namen).Wenn Sie sich für eine vorübergehende Lösung, dann würde ich mit Marc ' s; es klingt, wie es sollte perfekt funktionieren. That being said, ist jedoch die Tatsache, dass Sie gehen hinunter diese Straße sollte eine riesige rote fahne.