Добавление той же ссылки "*.dll" к нескольким проектам в том же решении

У меня есть решение Visual Studio 2008.NET С++/CLI. Мое решение состоит из многих подпроектов. Я определяю настраиваемый каталог buid для каждого проекта, который вызывается Output.

MySoultion

  • MyFirstProject (*.exe)
  • MySecondPrject (*.dll)
  • ...
  • MyNthProject (*.dll)

Каждый из подпроектов использует Log4.net.So создаю каталог (называемый LogBinary) и поместил dll log4.net в эту папку. Затем, чтобы использовать log4net, я добавляю эту dll в качестве ссылки на каждый из моих проектов.., Но когда я пытаюсь скомпилировать мой основной проект (*.exe), я получил тонны предупреждений (более 400...)

Просто пример:

Предупреждение 110 Предупреждение C4945: "AbsoluteTimeDateFormatter": не может импортировать символ из 'somepath\log4net.dll': as 'Log4net:: DateFormatter:: AbsoluteTimeDateFormatter' уже импортирован из другой сборки 'log4net' "somepath\log4net.dll"

Множество предупреждений с помощью

уже импортирован из другой сборки

Почему я получил это предупреждение? Кто-нибудь имеет решение elagant для добавления одной и той же DLL в несколько проектов (за исключением использования GAC)

Лучшие пожелания

Ответ 1

Наконец-то я нашел решение этой проблемы, которая не похожа на хак. Я нашел ответ в ответ от "pyro_serv" на социальном сайте msdn:

Исправление состоит в том, чтобы использовать флаги "Использовать зависимости в сборке" и "Использовать в сборке" на каждой странице проекта VC (через лист свойств VC) и переключать их в соответствии с вашим случаем для устранения этой ошибки.

Итак, для примера OP, который выглядит примерно так:

Solution -> Log4.net
Solution -> Proj1
Solution -> Proj1 -> Log4.net
Solution -> Proj2
Solution -> Proj2 -> Log4.net
...

Чтобы избежать предупреждений, нужно установить Use Dependencies in Build в false для всех ссылок на Proj1,Proj2,..,Projn.

Я только что проверил это с демонстрационным решением, и он отлично работает - я не могу поверить, насколько просто решение и сколько времени я потратил, чтобы найти его!

Ответ 3

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

my_solution -> System.Xaml.dll -> System.dll
my_solution -> System.dll

Когда я удалил ссылку на System.dll(например), она решила предупреждение компилятора.

Ответ 4

У меня было такое же предупреждение в этой ситуации:

Solution:
 |
 |-> Project1 : Outdir = "C:\out"
 |
 |-> Project2 : Outdir = [default Outdir] // Was wrong in this case
 |
 |-> Project3 : Outdir = "C:\out"

Отношения зависимостей были следующими.

Solution -> Project1
Solution -> Project2 -> (Project1)
Solution -> Project3 -> (Project1, Project2)

Фиксация Project2 Outdir на "C:\out" (как и предполагалось, это был недавно созданный проект и забыл изменить его), зафиксировало предупреждение.

Ответ 5

У меня снова была такая же проблема сегодня.
Прежде всего, благодаря Jon Cage и связанной статье в его посте по этой теме, см. Выше (или ниже). +1!!! Он решил мою проблему.

Но поскольку я ненавижу такие вещи, как toggle them as appropriate for your case, что означает ничего, кроме trial and error, я провел несколько тестов, так как у меня есть 2 решения с большим количеством проектов С++/CLI в каждом.

Вот мои советы и объяснения:
Для всех сборщиков с самосозданием (которые имеют "скопировать локальный" в true):

"Общие свойства" → "Структура и ссылки" → "Ссылки" → Выберите ссылку.
В листе свойств справа → "Свойства сборки" → "Использование зависимостей при сборке"
- (скопировано из связанной статьи форума msdn сообщения Джона Кейджа)

Установите этот параметр Use Dependencies In Build на "false", сняв флажок.
Он работает как "эталонная переадресация", см. Пример ниже.

ТЕХНИЧЕСКАЯ СПРАВКА:
- > означает "ссылки"
метод 1:
в моем решении SwCore:
A.1.1 network->tools, A.1.2 network->basics.
A.2.1 tools->basics.
A.3.1 drives->basics, A.3.2 drives->tools, A.3.3 drives->network
A.4.1...
с "Use Dependencies In Build", установленным в true, ссылка A.1.2 может быть опущена, так как она включена в A.2.1.
все файлы создаются в swcore\release\
== проблема:
в решении DDI:
B.1.1 DDI_hardware->DDI_job, B.1.2 DDI_hardware->drives
B.2.1 DDI_job->basics, B.2.2 DDI_job->tools, B.2.3 DDI_job->job
DDI_job создается в DDI\Release\и с "U.D.InBuild" установлен в true, он включает basics.
DDI_hardware создается... и с "U.D.InBuild" установлено значение true, оно включает DDI_job->basics.
DDI_hardware также ссылается на основы от SwCore\Release\
== > двойная ссылка на основы и другие. VS видит 2 файла и не может понять, что это одно и то же содержимое.

метод 2:
A.1.1 network->tools, A.1.2 network->basics.
A.2.1 tools->basics.
с установкой "U.D.InBuild" в FALSE, ссылка A.1.2 НЕ может быть опущена, поскольку она не переадресована из A.2.1.
== работает, потому что никакая сборка не будет содержать другие более глубокие зависимости, поэтому конфликтов не будет.

BTW: Это заставляет вас указывать все необходимые ссылки для каждого проекта, поэтому вы также можете ознакомиться с тем, что вы используете в своем проекте.

Последняя информация: Я не могу точно сказать, если мои объяснения верны. Может быть и так. else может подтвердить.