Вопрос

Позвольте мне дать сценарий, а затем посмотреть, есть ли у кого-нибудь решение / обходной путь.

У меня есть библиотека (DLL), которая содержит только классы. В другой библиотеке у меня есть интерфейсы, которые реализуют классы в первой библиотеке. Клиенты всегда будут ссылаться только на одну версию библиотеки, содержащей интерфейсы (всегда самую последнюю), и в эти интерфейсы будут вноситься только дополнения (больше интерфейсов / методов). Кроме того, будет только одна версия этой библиотеки интерфейсов - так что клиентам не нужно обновлять ссылки (библиотека интерфейсов будет загружена с помощью отражения - поэтому обычные правила проверки не применяются, мы можем только загрузить то, что клиент специально просит). Библиотека, реализующая интерфейсы, будет иметь несколько версий, на которые одновременно ссылаются разные клиенты.

Проблема возникает, когда клиентская сборка ссылается на старую версию библиотеки реализации. Он создает объект из класса в библиотеке реализации, а затем передает его другой клиентской сборке. Эта клиентская сборка использует самую последнюю (и единственную) версию библиотеки интерфейсов и пытается преобразовать переданный ей объект с соответствующим типом интерфейса. Это приведение не выполняется с исключением «System.TypeLoadException: метод X в типе Y из сборки Z не имеет реализации». Я ожидал этого исключения, потому что в новой версии интерфейса (тот же номер версии - старая библиотека закрыта), метод X определен, но даже если старая версия передаваемого объекта содержит метаданные, которые говорят, что он реализует соответствующий интерфейс, сбой сопоставления в новом методе интерфейса X, потому что он не имеет никакой реализации в этом классе.

Итак, мой вопрос таков; Есть ли способ заставить клиента использовать этот интерфейс, но вызвать исключение, только когда вызывается метод, который не реализован в объекте, на который есть ссылка (а не генерируется исключение, когда объект, на который ссылаются, приведен к более новому типу интерфейса)?

Кстати, позднее связывание не является опцией, потому что мы хотим, чтобы проверка типов во времени intellisense / компиляции ... Кроме того, я знаю, как это сделать с помощью указателей на функции и классов-оболочек - я просто надеялся на лучшее решение, которое больше соответствует обычным типам .NET.

Спасибо. Любая помощь очень ценится.

Это было полезно?

Решение

Вы можете использовать абстрактный (MustInherit) класс вместо интерфейса в библиотеке, содержащей интерфейсы, и установить методы и свойства как переопределяемые. Таким образом, даже если методы просто генерируют не реализованное исключение, всегда будет реализация для каждого метода в библиотеке интерфейса. Делая методы Overridable, а не MustOverride, следует избегать исключения TypeLoadException.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top