2009-03-06 9 views
2

Permettez-moi de donner un scénario, puis voir si quelqu'un a une solution/solution de rechange.Interface VB.NET/Liaison tardive Sort

J'ai une bibliothèque (DLL) qui contient seulement 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 plus récente) - et seulement des ajouts seront faits à ces interfaces (plus d'interfaces/méthodes). En outre, il n'y aura qu'une 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 - donc les règles de sondage habituelles ne s'appliquent pas, nous ne pouvons charger que le client demander). La bibliothèque implémentant les interfaces aura plusieurs versions référencées par différents clients 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 assembly client. Cet assembly client utilise la dernière version (et la seule) de la bibliothèque d'interfaces et tente de convertir l'objet qui lui est transmis avec le type d'interface approprié. Cette distribution échoue avec l'exception 'System.TypeLoadException: la méthode X dans le 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 librairie clobée), la méthode X est définie, mais même si l'ancienne version de l'objet passé contient des métadonnées qui impliquent 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 pour qu'un client utilise cette interface, mais provoque uniquement une exception lorsqu'une méthode qui n'est pas 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 converti au type d'interface plus récent)? Par ailleurs - la liaison tardive n'est pas une option parce que nous voulons la vérification du type de temps intellisense/compile ... En outre, je sais comment faire cela avec des pointeurs de fonction et des classes wrapper - j'espérais juste une meilleure solution c'est plus en phase avec les types .NET réguliers.

Merci - Toute aide est grandement appréciée

Répondre

2

Vous pouvez utiliser un résumé (MustInherit) classe au lieu d'une interface dans la bibliothèque contenant les interfaces et définir les méthodes et propriétés que Overridable. De cette façon, même si les méthodes venaient de lancer une exception non implémentée, il y aurait toujours une implémentation pour chaque méthode dans la bibliothèque d'interface. En rendant les méthodes Overridable plutôt que MustOverride devrait éviter l'exception TypeLoadException.

+0

C'est un super - ce n'est pas une interface, mais ça fonctionne parfaitement. Méthodes virtuelles - un peu en colère contre moi-même pour ne pas y penser. Merci de m'avoir aidé à voir la forêt depuis les arbres. – user74502

+0

Heureux d'aider, m'a pris un moment pour penser à une réponse qui serait réalisable. Le problème était intéressant. – bstoney

Questions connexes