MSBuild не получает ссылки на указанный проект
-
02-07-2019 - |
Вопрос
Только что я столкнулся со странной ситуацией с MSBuild.Есть решение, которое состоит из трех проектов:libX, LibY и Exe.Exe ссылается на libX.libX, в свою очередь, ссылается на LibY, имеет некоторые файлы содержимого, а также ссылки на стороннюю библиотеку (несколько готовых сборок, установленных как в GAC, так и в локальной папке lib).Сторонняя библиотека помечена как "Копировать локально" ("private") и отображается в выходных данных проекта libX, как и выходные данные библиотеки LibY и файлы содержимого libX.Теперь выходные данные Exe-проекта содержат выходные данные проекта libX, файлы содержимого проекта libX, выходные данные проекта LibY (исходящие из libX), но НЕ сборки сторонней библиотеки.
Теперь я обошел это, обратившись к сторонней библиотеке непосредственно в Exe project, но я не считаю это "правильным" решением.
У кого-нибудь раньше была такая проблема?
Решение
Да, у меня тоже была такая проблема.Хотя я бы с удовольствием сказал обратное, я считаю, что вы должны включить все транзитивные зависимости в качестве ссылок в свой файл сборки.
Другие советы
Существует разница в поведении при сборке с помощью MSBuild (т. е.командная строка, сборка в TFS и другие инструменты) по сравнению со сборкой с помощью Visual Studio.Вторичные ссылки не включены в переменную references, отправляемую в задачи компиляции MSBuild.
Существует несколько точек расширения, предоставляемых MSBuild для изменения способа разрешения ссылок.Я успешно использовал AfterResolveReference, чтобы исправить эту проблему для некоторых моих проектов - Я разместил более подробную информацию об этом в своем блоге.
Обходной путь заключается в добавлении следующего кода в ваши файлы vbproj или csproj
<Target Name="AfterResolveReferences">
<!-- Redefine referencepath to add dependencyies-->
<ItemGroup>
<ReferencePath Include="@(ReferenceDependencyPaths)">
</ReferencePath>
</ItemGroup>
</Target>
Microsoft заявила, что это не будет исправлено Контакты
Вы действительно можете зайти в Microsoft.Файл CSharp.targets или Microsoft.VisualBasic.targets (обычно находится в каталоге framework C:\Windows\Microsoft.NET\Framework\v3.5) и измените параметры задачи csc или vbc, чтобы включить дополнительные ссылочные зависимости.В файле (VB targets, строка 166;Цели C #, строка 164) изменить:\
References="@(ReferencePath)"
Для
References="@(ReferencePath);@(ReferenceDependencyPaths)"
Это может вызвать другие проблемы в зависимости от того, насколько все сложно, и это может сыграть злую шутку с компилятором Visual Studio inproc, но это единственный способ сделать это в MSBuild, который я нашел.
ответ жозана почти сработал для меня;Я продолжал получать сообщение об ошибке в Visual Studio, когда я пробовал это:
Проблема возникла при попытке установить параметр "References" для встроенного компилятора 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 полностью проигнорировала изменение ссылки, и сборка отлично работает локально и на сервере сборки.
Я объединил усилия Алекса Якунина решение с тем, кто будет также скопируйте собственные библиотеки dll.
Метод AfterResolveReferences завершается с ошибкой, если у вас есть ориентированный граф, а не дерево с ошибкой "попытка развертывания разных копий библиотеки DLL".(ср. Как настроить msbuild / MSVC для развертывания зависимых файлов зависимых сборок)