visual-studio - see - visual studio references




MSBuild не копирует ссылки(файлы DLL) при использовании зависимостей проекта в решении (12)

Взгляни на:

Этот раздел форума MSBuild, который я начал

Вы найдете мое временное решение / обходное решение!

(MyBaseProject нуждается в некотором коде, который ссылается на некоторые классы (независимо) от elmah.dll для копирования elmah.dll в bin MyWebProject1!)

У меня есть четыре проекта в моем решении Visual Studio (каждый из них нацелен на .NET 3.5) - для моей проблемы важны только эти два:

  1. MyBaseProject <- эта библиотека классов ссылается на сторонний DLL-файл (elmah.dll)
  2. MyWebProject1 <- этот проект веб-приложения имеет ссылку на MyBaseProject

Я добавил ссылку elmah.dll на MyBaseProject в Visual Studio 2008, нажав «Добавить ссылку ...» → вкладку «Обзор» → выбрав «elmah.dll».

Свойства ссылки Elmah следующие:

  • Псевдонимы - глобальные
  • Копировать локальный - true
  • Культура -
  • Описание - Модули регистрации ошибок и обработчики (ELMAH) для ASP.NET
  • Тип файла - сборка
  • Путь - D: \ webs \ otherfolder \ _myPath \ __ tools \ elmah \ Elmah.dll
  • Решено - правда
  • Версия исполнения - v2.0.50727
  • Указанная версия - false
  • Сильное имя - ложное
  • Версия - 1.0.11211.0

В MyWebProject1 я добавил ссылку на Project MyBaseProject: «Добавить ссылку ...» → вкладка «Проекты» → выберите «MyBaseProject». Свойства этой ссылки одинаковы, кроме следующих элементов:

  • Описание -
  • Путь - D: \ webs \ CMS \ MyBaseProject \ bin \ Debug \ MyBaseProject.dll
  • Версия 1.0.0.0

Если я запустил сборку в Visual Studio, файл elmah.dll будет скопирован в мой каталог bin MyWebProject1 вместе с MyBaseProject.dll!

Однако, если я очищаю и запускаю MSBuild для решения (через D: \ webs \ CMS> C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / t: ReBuild / p: Configuration = Debug MyProject.sln ) elmah.dll отсутствует в каталоге bin в MyWebProject1 - хотя сама сборка не содержит никаких предупреждений или ошибок!

Я уже убедился, что .csproj MyBaseProject содержит частный элемент со значением «true» (это должен быть псевдоним для « copy local » в Visual Studio):

<Reference Include="Elmah, Version=1.0.11211.0, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\mypath\__tools\elmah\Elmah.dll</HintPath>
    **<Private>true</Private>**
</Reference>

(Частный тег по умолчанию не отображался в xls .csproj, хотя Visual Studio сказал «скопировать локальный» true. Я переключил «скопировать локальный» на false - сохранен - ​​и снова вернул его в true - сохраните!)

Что случилось с MSBuild? Как получить ссылку (elmah.dll), скопированную в bin MyWebProject1?

Я НЕ хочу добавлять действие копии postbuild в команду postbuild каждого проекта! (Представьте, что у меня было бы много проектов, зависящих от MyBaseProject!)


Включение всех ссылок DLL-файлов из ваших проектов в проект веб-сайта не всегда является хорошей идеей, особенно когда вы используете инъекцию зависимостей : ваш веб-проект просто хочет добавить ссылку на файл / проект DLL-интерфейса, а не какую-то конкретную DLL-реализацию файл.

Потому что, если вы добавите ссылку непосредственно к DLL-файлу / проекту реализации, вы не сможете запретить разработчику вызывать «новый» на конкретных классах DLL-файла / проекта реализации, а не через интерфейс. Кроме того, вы указали «жесткий код» на своем веб-сайте, чтобы использовать реализацию.


Если вы не используете сборку непосредственно в коде, тогда Visual Studio, пытаясь быть полезной, обнаруживает, что она не используется и не включает ее в вывод. Я не уверен, почему вы видите различное поведение между Visual Studio и MSBuild. Вы можете попытаться настроить вывод сборки на диагностику для обоих и сравнить результаты, увидеть, где они расходятся.

Что касается вашей справки elmah.dll, если вы не ссылаетесь на нее непосредственно в коде, вы можете добавить ее в качестве элемента в свой проект и установить для параметра «Действие для Content и «Копировать в выходной каталог» Always .


Изменение целевой структуры из .NET Client 4 Client Profile в .NET Framework 4 устранило эту проблему для меня.

Итак, в вашем примере: установите целевую структуру в MyWebProject1 на .NET Framework 4


Как заметил Алекс Бурцев в комментарии, который используется только в словаре ресурсов XAML, или в моем случае, все, что используется только в XAML, а не в коде, не считается «используемым» MSBuild.

Таким образом, простое добавление фиктивной ссылки на класс / компонент в сборке в некотором коде позади было достаточно убедить MSBuild, что сборка была фактически использована.


Проблема, с которой я столкнулся, - это проект, который зависит от проекта библиотеки. Чтобы построить, я выполнял следующие шаги:

msbuild.exe myproject.vbproj /T:Rebuild
msbuild.exe myproject.vbproj /T:Package

Это, конечно, означало, что я отсутствовал в библиотеке DLL-файлов в bin и, самое главное, в zip-файле пакета. Я нашел, что это работает отлично:

msbuild.exe myproject.vbproj /T:Rebuild;Package

Я понятия не имею, почему эта работа или почему она не была в первую очередь. Но надеюсь, что это поможет.


Ссылка на сборки, которые не используются во время сборки, не является правильной практикой. Вы должны увеличить свой файл сборки, чтобы скопировать дополнительные файлы. Либо используйте событие post build, либо обновляя группу свойств.

Некоторые примеры можно найти в других сообщениях


У меня была та же проблема, и dll была динамически загруженной ссылкой. Чтобы решить проблему, я добавил «использование» с пространством имен DLL. Теперь dll копируется в выходной папке.


У меня такая же проблема.

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

В моем случае мой клиент был скомпилирован с использованием «Framework 4 Client», а DLL - в «Framework 4».


Это требует добавления файла .targets в ваш проект и установки его для включения в раздел включений проекта.

См. Мой ответ здесь для процедуры.


Я просто разбираюсь в этом так. Перейдите к свойствам своей справки и сделайте следующее:

Set "Copy local = false"
Save
Set "Copy local = true"
Save

и это все.

Visual Studio 2010 изначально не помещает: <private>True</private> в ссылочный тег и установка «copy local» на false приводит к созданию тега. Впоследствии он установит значение true и false соответственно.


Я просто столкнулся с очень похожим вопросом. При компиляции с использованием Visual Studio 2010 DLL-файл был включен в папку bin . Но при компиляции с использованием MSBuild сторонний DLL-файл не был включен.

Очень расстраивает. То, как я решил, это включить ссылку NuGet на пакет в мой веб-проект, хотя я не использую его прямо там.







project