Вопрос о проекте С#

У меня есть решение С#, и оно состоит из множества проектов.

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

Я добавил ссылку на dll в своих baseassemblies, но все остальные проекты не видят этого.

Как я могу сделать так, чтобы другие проекты могли видеть DLL, на которую ссылаются базовые элементы? Я не хочу добавлять DLL ко всем проектам, так как это побеждает цель моего проекта baseassemblies.

Ответ 1

Правильный подход заключается в том, что для ваших других сборок НЕ нужна ссылка на эту другую DLL. Как правильно это сделать, не нужно, чтобы ваши базовые сборки отображали какие-либо типы, которые находятся внутри этой DLL. Оберните все функциональные возможности, которые вам нужны в базовых сборках, и убедитесь, что тот, кто потребляет ваши базовые сборки, не нуждается в знаниях о базовых сборках базы данных dll. В противном случае каждый проект, который будет ссылаться на ваши базовые сборки, если им нужно использовать что-то, что содержится в этой DLL, им придется ссылаться на него.

Ответ 2

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

Обратите внимание, что проекту нужно только ссылаться на сборки, из которых он напрямую использует типы. Если A использует B, а B использует C, но A напрямую не использует C, тогда A нужно непосредственно ссылаться на B (загрузчик будет обрабатывать B, ссылающийся на C).

Ответ 3

Короче говоря, вы не можете этого сделать. Вам нужно добавить ссылку на DLL, содержащую код, который вы пытаетесь использовать, иначе он не сможет его увидеть.

Мое предложение было бы создать слой в вашем проекте BaseAssemblies, доступ к которому вы можете получить из своего приложения, которое по существу создает многоуровневую архитектуру.

например

Уровень приложения - использует IDataClass
Business Logic Layer - определяет IDataClass
Уровень доступа к данным - MyRawDataClass (реализует IDataClass)

В примере на прикладном уровне требуется только ссылка на BAL, чтобы иметь возможность взаимодействовать с DAL.

Ответ 4

Вы можете экспортировать интерфейсы BaseAssemblies, которые должны быть реализованы вашей "другой" dll. Кроме того, для ваших классов BaseAssemblies требуется некоторая "класс factory".

Ответ 5

Другие плакаты верны: вы не можете этого сделать. Это, ИМХО, жалко со стороны Visual Studio. "сделать" обработано это чисто, как пирог 20 лет назад...

Ответ 6

Есть случаи, когда ваш проект ссылается на A, который, в свою очередь, ссылается на B, но когда вы строите, B не всегда присутствует в папке BIN, и вы понимаете это только при запуске кода. Существует связанный SO-запрос ЗДЕСЬ. Люди решили это причудливо, но мне особенно понравилось решение Джона Хантера. Этот поток SO также обсуждает решение, в котором вы используете события сборки для достижения желаемых результатов.