2017-05-01 3 views
0

Ich habe eine Klassenbibliothek, die auf eine bestimmte DLL der dritten Partei verweist. Diese DLL ändert die Versionen sehr oft, ist aber innerhalb der gleichen Hauptversion immer abwärtskompatibel. Meine Klassenbibliothek verwendet bestimmte Typen der DLL und führt verschiedene Methoden aus, die in diesen DLLs der dritten Partei enthalten sind.Runtime-Würfe Methode nicht gefunden - referenzierte Assemblyversion stimmt nicht überein

Ich muss das Design der App hier überdenken, da ich ein aktuelles Problem habe, aber ein größeres Problem haben wird, sobald es mehrere Hauptversionen der DLL der 3. Partei gibt (es wird eine begrenzte Reihe von Hauptversionen geben) , 3 um genau zu sein).

  1. Wie kann ich sicherstellen, dass ich eine andere Version der referenzierten Assembly als die verwenden kann, die ursprünglich während der Kompilierzeit verwendet wurde? Meine Laufzeit wird nun in eine DLL geladen, die eine höhere Nebenversion hat, aber eine 'Method not found' Exception auslöst. Ich habe das Tag entfernt und versucht, Assembly.Load auszuführen, um jedes Verhalten bei der Angabe der neueren DLL zu simulieren, aber beide ergeben dasselbe Ergebnis. Methode nicht gefunden.

  2. Was ist der beste Ansatz, um drei wichtige (!) Versionen von referenzierten DLLs in einer einzigen DLL zu unterstützen? Aufgrund der Art der Verwendung der Klassenbibliothek ist es dem Benutzer nicht möglich, die richtige Version zu wählen oder 3 verschiedene DLLs zu erstellen.

Antwort

1

Wenn es Chancen, Ihren Anbieter ist binary code compatibility brechen und Sie können nicht beeinflussen, was man tut es keine einfache Lösung für dieses Problem ist. Late binding wäre eine der Problemumgehungen in C# mit reflection oder dynamic, aber es wird mit den Kosten für die Laufzeit Leistung und extrem erhöhte Komplexität Ihres Codes kommen.


Wenn Sie eingestellt sind ohnehin diese Integrationsschicht aufbauen, würden Sie für alle drei Versionen Code müssen bekannt Permutationen zwischen ihnen zu decken und Adapter könnte ein gutes Design-Muster sein, in zu Beginn der Suche. Sie würden sicherstellen, dass die Unterschiede und die Entitäten aus der externen Bibliothek nicht aus der Integrationsschicht in Ihre eigene Geschäftslogik verschüttet werden. Daher wäre viel Konvertierungslogik erforderlich, um die fragile Bibliothek vom Rest des Codes zu isolieren. Variationen wie Unterschiede in den Typen, Methoden, Signaturen, Verhalten und Ausnahmen, die geworfen werden, müssten gekapselt und begrenzt werden.

Sie müssten auch Ihre Anwendungs- oder Präsentationsschicht neu entwerfen, je nachdem, was von dieser feindlichen Bibliothek abhängt, um mit den Unterschieden entsprechend umzugehen und sie nur auf Ihre eigenen Wrapper zu verlassen.

Ihre Integrationstests müssten immer gegen alle drei Versionen der Herstellerbibliothek ausgeführt werden, möglicherweise bei jedem Einchecken von Code in das Repository, damit Sie genügend Schutz und Flexibilität haben, um weiter zu gehen. Und da der Anbieter weiterhin an dem Code der Bibliothek arbeitet, müssen Sie genügend Zeit für die ständige Pflege und Unterstützung der Kompatibilitätsschicht reservieren.

Verwandte Themen