Question

Laissez-moi vous donner un scénario, puis voir si quelqu'un a une solution / solution de contournement.

J'ai une bibliothèque (DLL) qui ne contient que des classes. Dans une autre bibliothèque, j'ai des interfaces que les classes de la première bibliothèque implémentent. Les clients référenceront toujours une seule version de la bibliothèque contenant les interfaces (toujours la dernière) - et seuls des ajouts seront apportés à ces interfaces (plusieurs interfaces / méthodes). De plus, il n'y aura qu'une seule version de cette bibliothèque d'interfaces - de sorte que les clients n'auront pas besoin de mettre à jour les références (la bibliothèque d'interfaces sera chargée par réflexion - de sorte que les règles de sondage habituelles ne s'appliquent pas, nous ne pouvons charger que le client en question. demander). La bibliothèque implémentant les interfaces aura plusieurs versions que différents clients référencent en même temps.

Le problème se produit lorsqu'un assembly client fait référence à une ancienne version de la bibliothèque d'implémentation. Il crée un objet à partir d'un type de classe dans la bibliothèque d'implémentation, puis le transmet à un autre assemblage client. Cet assemblage client utilise la dernière version (et unique) de la bibliothèque d'interfaces et tente de convertir l'objet qui lui a été transmis avec le type d'interface approprié. Cette conversion échoue avec l'exception 'System.TypeLoadException: la méthode X de type Y de l'assembly Z n'a pas d'implémentation'. Je m'attendais à cette exception car dans la nouvelle version de l'interface (même numéro de version - ancienne bibliothèque obstruée), la méthode X est définie, mais même si l'ancienne version de l'objet transmis contient des métadonnées indiquant qu'elle implémente l'interface correspondante, le mappage échoue sur la nouvelle méthode d'interface X car elle n'a aucune implémentation dans cette classe.

Donc, ma question est la suivante: Existe-t-il un moyen qu'un client utilise cette interface, mais ne provoque une exception que si une méthode non implémentée sur l'objet référencé est appelée (plutôt que l'exception générée lorsque l'objet référencé est transtypé dans le type d'interface le plus récent)?

Soit dit en passant, la liaison tardive n’est pas une option car nous voulons une vérification du type de temps Intellisense / Compile ... De plus, je sais comment faire cela avec les pointeurs de fonction et les classes wrapper - j’espérais une meilleure solution qui est plus en phase avec les types .NET habituels.

Merci - toute aide est grandement appréciée

Était-ce utile?

La solution

Vous pouvez utiliser une classe abstraite (MustInherit) au lieu d’une interface dans la bibliothèque contenant les interfaces et définir les méthodes et les propriétés sur Overridable. Ainsi, même si les méthodes lançaient une exception non implémentée, il y aurait toujours une implémentation pour chaque méthode de la bibliothèque d'interface. En rendant les méthodes Overridable plutôt que MustOverride, il faut éviter l’exception TypeLoadException.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top