Ответ 1
Да, у меня тоже была эта проблема. Хотя я бы хотел сказать иначе, я считаю, что вы должны включать все транзитивные зависимости в качестве ссылок в ваш файл сборки.
Я столкнулся с странной ситуацией с MSBuild только сейчас. Там есть решение, в котором есть три проекта: LibX, Liby и Exe. Ссылки Exe LibX. LibX, в свою очередь, ссылается на Liby, имеет некоторые файлы контента, а также ссылки на стороннюю библиотеку (несколько предварительно собранных сборок, установленных как в GAC, так и в локальной папке lib). Сторонняя библиотека помечена как "Копировать локальную" ("private") и появляется на выходе проекта LibX, как это делают файлы Liby и LibX. Теперь выход проекта Exe имеет выход проекта LibX, файлы контента проекта LibX, вывод LibY проекта (из LibX), но нет сборочных сборок сторонних разработчиков.
Теперь я работал со ссылкой на стороннюю библиотеку непосредственно в проекте Exe, но я не считаю, что это "правильное" решение.
У кого-нибудь была эта проблема раньше?
Да, у меня тоже была эта проблема. Хотя я бы хотел сказать иначе, я считаю, что вы должны включать все транзитивные зависимости в качестве ссылок в ваш файл сборки.
Существует разница в поведении при создании с помощью 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
Фактически вы можете зайти в файл 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, который я нашел.
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 полностью игнорировать изменение ссылки, и сборка работает нормально локально и на сервере сборки.
Я объединил решение Alex Yakunin с тем, которое также скопирует собственные DLL.
Метод AfterResolveReferences завершается с ошибкой, если у вас есть ориентированный граф, а не дерево с ошибкой "попытка развернуть разные копии dll". (см. Как настроить msbuild/MSVC для развертывания зависимых файлов зависимых сборок)