Вопрос по проекту C # - PullRequest
16 голосов
/ 18 февраля 2010

У меня есть решение ac # и оно состоит из многочисленных проектов.

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

Я добавил ссылку dll в свои базовые сборки, однако все другие проекты не могут ее увидеть.

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

Ответы [ 6 ]

23 голосов
/ 18 февраля 2010

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

10 голосов
/ 18 февраля 2010

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

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

3 голосов
/ 18 февраля 2010

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

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

пример

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

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

0 голосов
/ 23 января 2014

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

0 голосов
/ 06 декабря 2010

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

0 голосов
/ 18 февраля 2010

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

...