Вопрос

Только что я столкнулся со странной ситуацией с 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 для развертывания зависимых файлов зависимых сборок)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top