Можно ли удалить зависимость DLL из-за интерфейса? - PullRequest
3 голосов
/ 25 августа 2011

Допустим, у моего библиотечного класса (в сборке A) есть метод GetFoo(), возвращающий тип Foo.Foo реализует несколько интерфейсов, включая IBar в сборке B. Когда клиентский код вызывает GetFoo() (клиентский код не ссылается на сборку B), компилятор выдаст ошибку, потому что IBar "определен всборка, на которую нет ссылки. Вы должны добавить ссылку на сборку B ".Обратите внимание, что мой код должен знать только о Foo, и он не содержит ссылки на интерфейс.

Возможно ли не ссылаться на B?Насколько я знаю, среда выполнения не нуждается в этом.

Ответы [ 3 ]

4 голосов
/ 25 августа 2011

Необходимы интерфейсы во время выполнения и необходима сборка B.

Если вызывающему абоненту на самом деле не нужен интерфейс, вы можете не реализовывать его, и тогда сборка не требуется b.Если вам иногда это нужно, а иногда нет, вы можете использовать директивы #if и флаги компилятора для создания двух версий сборки a, одна из которых использует b, а другая - нет.Это способ перебить IMO, хотя иметь две версии.

3 голосов
/ 25 августа 2011

Этот сценарий работает на родных языках, таких как C ++ с COM, потому что интерфейс просто определяет соглашение, которое проверяется во время компиляции, но не применяется во время выполнения.Однако в .NET CLR обеспечивает безопасность типов во время выполнения и поэтому должен ссылаться на сборку, в которой определен интерфейс.

Если ваша ситуация это позволяет, вы можете разбить интерфейс на отдельную«контрактная» сборка и обе сборки ссылаются на нее.Это будет очень маленькая сборка, и она должна загружаться очень быстро.

1 голос
/ 25 августа 2011

нет, если вы имеете дело с классами, которые реализуют определенные интерфейсы, все эти интерфейсы должны быть доступны в местах, где вы создаете или извлекаете классы.

обычно это решается наоборот, вы работаете с интерфейсами, а не с конкретными классами, тогда вы только добавляете ссылку на сборку интерфейса, а не на классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...