Зависимости ссылок, не копируемых в выходной каталог

У меня есть библиотека CommonUtils, встроенная в dll, на которую я ссылаюсь в нескольких своих проектах. CommonUtils зависит от log4net.dll, который был установлен как ссылка на файл, и copy-local = true при сборке CommonUtils.dll. log4net.dll и CommonUtils.dll отсутствуют в GAC.

Все работает нормально в MyWorkingProject, где у меня есть только ссылка на файл CommonUtils.dll - log4net.dll отображается в выходном каталоге (поскольку это зависимость CommonUtils.dll, но не упоминается в MyWorkingProject). Однако, если я создаю новый проект для добавления некоторых модульных тестов: MyWorkingProjectTest и ссылку на проект MyWorkingProject, а затем снова ссылку на файл CommonUtils.dll (я хочу использовать некоторые из CommonUtils), а затем при создании log4net.dll, который является зависимостью в обоих проектах ссылка и ссылка на файл также не копируются в выходной каталог.

Кто-нибудь может прояснить, что здесь происходит? Компилятор не знает, какой из файлов log4net.dll ему следует захватить? Что-то я здесь делаю не так? Должен ли я сделать это каким-либо другим способом, чтобы файл log4net.dll копировался явно? Есть ли смысл в том, что я должен явно ссылаться на log4net?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
18
0
7 345
3

Ответы 3

Я считаю, что если вы не добавите log4net в качестве ссылки в свой проект, он не будет скопирован.

Как бы вы добавили log4net в качестве ссылки на проект, поскольку у меня есть только распределенная двоичная dll. Также зачем мне добавлять ссылку на нее, поскольку это просто зависимость одной из моих ссылок. Кто-то заявил, что вам не следует ссылаться на библиотеки, которые вы явно не используете в своем коде.

Fadeproof 18.12.2008 12:26

Я имел в виду не «Ссылку на проект», а скорее «Ссылку» в вашем проекте.

user7116 18.12.2008 21:27

Когда у меня была подобная ситуация в прошлом, я получал предупреждение компилятора в Visual Studio о том, что мне нужно добавить ссылку на зависимую библиотеку.

Получаете ли вы такое предупреждение при компиляции? Если это так, следуйте его советам, и вы обнаружите, что Log4net скопирован в ваш выходной каталог.

Проблема в том, что у меня есть две ссылки, которые имеют зависимости от log4net, и кажется, что в Visual Studio есть встроенная вещь, чтобы не копировать конфликтующую зависимость (несмотря на то, что это одна и та же). Все работает, как ожидалось, если я ссылаюсь только на 1, но не копирую, если я ссылаюсь на оба. ?

Fadeproof 18.12.2008 12:23

Действительно ли обе ссылки относятся к одной и той же сборке? Проверьте свойства каждой ссылки, чтобы убедиться, что путь идентичен.

Bevan 18.12.2008 13:05

Это сделано намеренно. Вам нужно подумать о последствиях, которые может вызвать автоматическое наследование ссылок. Хотя вы можете логически увидеть, какими должны быть ссылки, такого разграничения для компилятора нет. Теоретически вы могли бы в конечном итоге воспроизвести Framework и значительную часть вашей ОС, если бы он прошел по всему дереву зависимостей.

Это определенно неприятно, и я согласен с вами и понимаю ваше разочарование, но я предполагаю, что Microsoft не смогла найти логический способ сделать это иначе.

Не могли бы вы посоветовать, как мне тогда это сделать? Если у меня есть LibA и LibB, которые оба зависят от log4net и находятся в MyProjDir / LibA и MyProjDir / LibB, оба содержат log4net.dll. На какой файл log4net.dll следует сослаться? Является ли copy-local true для log4net.dll не лучшим вариантом при сборке libA и libB?

Fadeproof 19.12.2008 12:50

Я лично добавляю любые общие ссылки на проект верхнего уровня. Например, если обе ваши библиотеки будут использоваться приложением, я бы добавил log4net.dll непосредственно в папку / bin приложения. Это не лучшее решение, но я считаю, что это проще, чем искать ссылку.

Joseph Ferris 19.12.2008 16:56

"by and application" = "by an application". Кроме того, вводить в заблуждение, говоря, что я добавляю ссылки на верхний уровень. Я не добавляю ссылку - я просто добавляю в папку / bin, поскольку она будет в пути поиска библиотек, которые ее ищут.

Joseph Ferris 19.12.2008 16:57

Хорошо, я понимаю, что я мог бы добавить своего рода задачу пост-сборки, чтобы явно скопировать ее, вместо того, чтобы создавать мои CommonUtils со ссылкой log4net, установленной для копирования local = false?

Fadeproof 19.12.2008 19:16

Другие вопросы по теме