Frage

Lassen Sie uns geben ein Szenario dann sehen, ob jemand eine Lösung hat / Work-around.

Ich habe eine Bibliothek (DLL) bekam die nur Klassen enthält. In einer anderen Bibliothek habe ich Schnittstellen bekommt, dass die Klassen in der ersten Bibliothek implementieren. Die Kunden werden immer nur eine Version der Bibliothek verweisen auf die Schnittstellen (immer das späteste) enthält - und nur Ergänzungen werden an diesen Schnittstellen (weitere Schnittstellen / Methoden) erfolgen. Außerdem gibt es eine nur seine Version, die Schnittstellen-Bibliothek - so dass die Kunden nicht brauchen, um Referenzen zu aktualisieren (die Schnittstellen-Bibliothek wird durch Reflexion geladen werden - so die üblichen Sondieren Regeln gelten nicht, wir können nur geladen werden, was der Kunde speziell fragt nach). Die Bibliothek, die Schnittstellen Implementierung wird mehrere Versionen, die verschiedenen Clients zur gleichen Zeit verweisen.

Das Problem tritt auf, wenn eine Client Anordnung eine alte Version der Implementierung Bibliothek verweist. Es schafft ein Objekt aus einer Klassentyp in der Umsetzung Bibliothek - dann übergibt sie an einem anderen Client Montag. Die Client-Montag verwendet die neueste (und einzige) Version der Schnittstellen-Bibliothek und versucht, das Objekt, um es mit dem entsprechenden Interface-Typ übergeben zu werfen. Dieser gegossene ausfällt, mit der Ausnahme ‚System.TypeLoadException: Methode X in Typ Y von der Montage Z keine Implementierung hat‘. Ich diese Ausnahme zu erwarten, da in der neuen Version der Schnittstelle (gleiche Versionsnummer - alte Bibliothek clobbered) wird die Methode X definiert, aber auch wenn die alten Version des Objekts, das übergeben wird, enthält Metadaten, die sagen, dass es die entsprechende Schnittstelle implementiert, die Mapping nicht auf die neuen Interface-Methode X, weil es keine Implementierung hat in dieser Klasse.

Also, meine Frage ist; Gibt es eine Möglichkeit ein Client hat diese Schnittstelle verwenden, aber nur eine Ausnahme verursachen, wenn eine Methode, die nicht auf dem referenzierte Objekt implementiert wird aufgerufen wird (und nicht die Ausnahme erzeugt wird, wenn das referenzierte Objekt auf den neueren Schnittstelle Typen umgewandelt wird)?

Übrigens - die späte Bindung ist keine Option, da wir intellisense wollen / kompilieren Prüfzeit Art ... Auch ich weiß, wie dies zu tun mit Funktionszeigern und Wrapper-Klassen - ich habe nur gehofft, für eine bessere Lösung, mehr im Einklang mit regulärem .NET-Typ ist.

Danke - Jede Hilfe wird sehr geschätzt

War es hilfreich?

Lösung

Sie können eine abstrakte (MustInherit) Klasse statt einer Schnittstelle in der Bibliothek verwenden, um die Schnittstellen und stellen Sie die Methoden und Eigenschaften wie Overridable enthält. Auf diese Weise, auch wenn die Methoden warfen nur einen nicht umgesetzt Ausnahme gäbe es immer eine Implementierung für jede Methode in der Interface-Bibliothek sein. Indem die Methoden Overridable anstatt das Mustoverride-Type vermeiden sollte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top