MSBuild не получает ссылки на указанный проект

Я столкнулся с странной ситуацией с MSBuild только сейчас. Там есть решение, в котором есть три проекта: LibX, Liby и Exe. Ссылки Exe LibX. LibX, в свою очередь, ссылается на Liby, имеет некоторые файлы контента, а также ссылки на стороннюю библиотеку (несколько предварительно собранных сборок, установленных как в GAC, так и в локальной папке lib). Сторонняя библиотека помечена как "Копировать локальную" ("private") и появляется на выходе проекта LibX, как это делают файлы Liby и LibX. Теперь выход проекта Exe имеет выход проекта LibX, файлы контента проекта LibX, вывод LibY проекта (из LibX), но нет сборочных сборок сторонних разработчиков.

Теперь я работал со ссылкой на стороннюю библиотеку непосредственно в проекте Exe, но я не считаю, что это "правильное" решение.

У кого-нибудь была эта проблема раньше?

Ответы

Ответ 1

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

Ответ 2

Существует разница в поведении при создании с помощью MSBuild (например, командной строки, TFS Build и других инструментов) по сравнению с построением с помощью Visual Studio. Вторичные ссылки не включены в переменную ссылок, посланную в задачи компиляции MSBuild.

Существует несколько точек расширения, предоставляемых MSBuild, чтобы изменить способ устранения ссылок. Я успешно использовал AfterResolveReference, чтобы исправить эту проблему для некоторых моих проектов - Я разместил больше информации о предыстории моего блога.

Обходной путь заключается в том, чтобы добавить следующий код в файлы vbproj или csproj.

  <Target Name="AfterResolveReferences">
    <!-- Redefine referencepath to add dependencyies-->
    <ItemGroup>
     <ReferencePath Include="@(ReferenceDependencyPaths)">
     </ReferencePath>
    </ItemGroup> 
  </Target>

Microsoft заявила, что это не будет исправлено на Connect

Ответ 3

Фактически вы можете зайти в файл Microsoft.CSharp.targets или Microsoft.VisualBasic.targets(расположенный в каталоге фреймворка, обычно C:\Windows\Microsoft.NET\Framework\v3.5) и изменить csc или vbc параметры задачи включают дополнительные ссылочные зависимости. В файле (цели VB, строка 166, цели С#, строка 164) изменяются:\

References="@(ReferencePath)"

к

References="@(ReferencePath);@(ReferenceDependencyPaths)"

Это может вызвать другие проблемы в зависимости от того, насколько сложны вещи, и может играть трюки с компилятором Visual Studio inproc, но это единственный способ сделать это в MSBuild, который я нашел.

Ответ 4

josant ответ почти сработал у меня; Я все время получал ошибку в Visual Studio, когда я это пробовал:

Возникла проблема при попытке установить параметр "Ссылки" для встроенного компилятора среды IDE. Ошибка HRESULT E_FAIL была возвращена из вызова COM-компонента

Решение моей проблемы состояло в том, чтобы поставить условие на ItemGroup, например:

<Target Name="AfterResolveReferences">
  <!-- Redefine referencepath to add dependencies-->
  <ItemGroup Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">
    <ReferencePath Include="@(ReferenceDependencyPaths)"></ReferencePath>
  </ItemGroup>
</Target>

Это заставило Visual Studio полностью игнорировать изменение ссылки, и сборка работает нормально локально и на сервере сборки.