У меня были проблемы со сборкой некоторых проектов C # в решении, с которым у меня никогда не было проблем. Сборка завершается с ошибкой, что файл метаданных отсутствует. Описание ошибки и вывод журнала msbuild на диагностическом уровне показывают некоторые неожиданные события. Один из проектов, с которыми у меня есть эта проблема, называется WpfControlLibrary
. В решении упоминаются следующие проекты:
Helpers
HunAlmex.Kioszk.Common
HunAlmex.Kioszk.Communication.ImportedServiceContracts
HunAlmex.Kioszk.Data
Папка с решением "D:\Entegro\TFS\Volánbusz TVM\Bugfixes 2018-06"
.
Ошибка сбоя сборки:
Error CS0006 Metadata file 'D:\Entegro\TFS\Volánbusz TVM\Bugfixes 2018-06\HunAlmex.Kioszk.Data\bin\Debug\WpfControlLibrary.dll' could not be found (in project WpfControlLibrary; file CSC)
Поэтому, когда я собираю проект WpfControlLibrary
, CSC
ищет dll, который назван в честь проекта в папке bin\debug
одного из проектов, на который ссылается проект WpfControlLibrary
.
Журнал сборки показывает, что это относится ко всем четырем ссылкам проекта выше. Сборка ищет dll с именем WpfControlLibrary.dll
в своей папке bin\debug
после создания этих проектов, казалось бы, правильно (проекты создаются с правильно названными файлами dll и pdb). Ошибка сборки, вероятно, содержит только один отсутствующий dll, потому что он терпит неудачу при первой ошибке.
Однако, если я собираю решение целиком и наблюдаю за папкой bin\debug
проекта Helpers
, я вижу, что проект собран правильно, а затем во время сборки файл Helpers.dll
исчезает, и там появляется файл с именем WpfControlLibrary.dll
(и pdb). В конце концов сборка не удалась, потому что она не находит Helpers.dll
.
Проекты, на которые ссылаются проекты WpfControlLibrary
, не имеют ссылки на WpfControlLibrary
.
Вышеуказанный результат получается с помощью VS Enterprise 2017 version 15.8.2
с msbuild version 15.8.168.64424
. Я недавно обновил VS и вернулся к этому решению, поработав некоторое время над другими, поэтому не могу сказать, сломало ли его обновление.
Я пытался создать проблемные проекты на одном компьютере, используя VS Community 2017 version 15.2
с msbuild version 15.1.1012.6693
, что прекрасно их строит.
Проект также прекрасно работает на других компьютерах с различными другими версиями VS и msbuild.
Я не знаю много о msbuild, но я сравнил журналы сборки Enterprise и Community, и кажется, что имена dll становятся кислыми в первом после следующих строк:
Task Parameter:
1> Properties=
1> Configuration=Debug
1> Platform=AnyCPU (TaskId:12)
1> Global Properties: (TaskId:12)
1> Configuration=Debug (TaskId:12)
1> Platform=AnyCPU (TaskId:12)
1> Removing Properties for project "..\Helpers\Helpers.csproj": (TaskId:12)
1> TargetFramework (TaskId:12)
1> Removing Properties for project "..\HunAlmex.Kioszk.Common\HunAlmex.Kioszk.Common.csproj": (TaskId:12)
1> TargetFramework (TaskId:12)
1> Removing Properties for project "..\HunAlmex.Kioszk.Communication.ImportedServiceContracts\HunAlmex.Kioszk.Communication.ImportedServiceContracts.csproj": (TaskId:12)
1> TargetFramework (TaskId:12)
1> Removing Properties for project "..\HunAlmex.Kioszk.Data\HunAlmex.Kioszk.Data.csproj": (TaskId:12)
1> TargetFramework (TaskId:12)
Они отсутствуют в журнале сборки сообщества, но тогда может быть много других отличий.
Я не уверен, что это вина В.С. Может случиться так, что глобальный файл msbuild процесса сборки получает цели сборки и все остальное испортилось. Я пытался восстановить VS, но это не имело никакого значения.
Я связываю журнал сборки ниже.
У меня есть догадка, что я смогу решить эту проблему, только удалив и переустановив или восстановив установленные версии .NET Framework. Могу ли я сделать это просто из Control Panel / Programs and Features / <.NET Framework version> / Repair
в контекстном меню?
Загрузите сжатый журнал сборки уровня диагностики на https://drive.google.com/file/d/1NqLrzkmQhYSoYQxoja76NQp484gWNTHL/view?usp=sharing
UPDATE
Журнал сборки ссылается на файл Microsoft.Common.CurrentVersion.targets
для каждого проекта. Например:
1>Target "GetTargetPathWithTargetPlatformMoniker: (TargetId:19)" in file "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets" from project "D:\Entegro\TFS\Volánbusz TVM\Bugfixes 2018-06\Helpers\Helpers.csproj" (target "GetTargetPath" depends on it):
1>Added Item(s):
1> TargetPathWithTargetPlatformMoniker=
1> D:\Entegro\TFS\Volánbusz TVM\Bugfixes 2018-06\Helpers\bin\Debug\Helpers.dll
1> CopyUpToDateMarker=D:\Entegro\TFS\Volánbusz TVM\Bugfixes 2018-06\Helpers\obj\Debug\Helpers.csproj.CopyComplete
1> TargetFrameworkIdentifier=.NETFramework
1> TargetFrameworkVersion=4.0
1> TargetPlatformIdentifier=Windows
1> TargetPlatformMoniker=Windows,Version=7.0
1>Done building target "GetTargetPathWithTargetPlatformMoniker" in project "Helpers.csproj".: (TargetId:19)
Если я заменю этот файл файлом, на который ссылается журнал сборки VS Community, и соберу проект, он все равно выдаст ту же ошибку. Однако, если я очищаю проект, а затем собираю, он строит его без ошибок. Для версий VS и msbuild см. Выше. Я связываю два файла ниже. Имя файла показывает, какая у него версия.
Предприятие: https://drive.google.com/open?id=1MPnAVQxMtjTcuy39pzmLJolIroBaDgMt
Сообщество: https://drive.google.com/open?id=19Jn8UkRaJ5oAFXreXI4IpRKmGrnjtGQ8
Я попытаюсь скомпилировать небольшое решение с проектами, которые показывают это поведение.
ОБНОВЛЕНИЕ 2
Я создал решение только с проектом WpfControlLibrary и его зависимостями. Вы можете скачать его по следующей ссылке:
используйте обновленную ссылку под UPDATE 4 ниже
Я просто скопировал папки проекта в новую папку и добавил их в новое решение. Мне пришлось немного проверить файлы csproj, потому что следующий раздел в каждом из них приводил к тому, что стандартные ссылки на проект .NET 4 (System. И т. Д.) Показывались в Solution Explorer как не найденные:
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
Мое решение состояло в том, чтобы закомментировать эту часть, что привело к правильному открытию проектов. Я также удалил и повторно добавил упомянутые пакеты Nuget, на всякий случай.
После восстановления пакетов NuGet сборка решения приводит к следующей ошибке:
Metadata file 'D:\Entegro\VB TVM\Playground\2018-09-04 VS Build Error\BuildFailure\HunAlmex.Kioszk.Data\bin\Debug\WpfControlLibrary.dll could not be found (Project: WpfControlLibrary; File: CSC)
Итак, ошибка, описанная выше, теперь воспроизводится.
Мне удалось избавиться от ошибки сборки, исключив все файлы xaml из проекта WpfControlLibrary
. Я построил решение после повторного добавления их по одному, но не смог прийти к выводу о том, что вызвало ошибку, потому что она менялась. Однажды ошибка сборки исчезла, удалив ссылку на проект HunAlmex.Kioszk.Communication.ImportedServiceContracts.
Я не думаю, что замена файла Microsoft.Common.CurrentVersion.targets
- это достойное решение, поэтому я надеюсь, что кто-то может найти лучший вариант. Заранее спасибо.
ОБНОВЛЕНИЕ 3
VS 15.8.3 только что вышел. После обновления к нему процесс построения примера решения немного меняется. Ошибка сборки следующая:
The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://www.postsharp.net/links/nuget-restore. WpfControlLibrary D:\Entegro\VB TVM\Playground\2018-09-04 VS Build Error\BuildFailure\WpfControlLibrary\WpfControlLibrary.csproj
Ошибка сохраняется в последующих сборках и никогда не исчезает, за исключением случаев, когда я собираю только проект WpfControlLibrary
. Тогда мы вернемся к первоначальной ошибке сборки.
Обновление до VS 15.8.4 также не исправило это.
Поскольку в этих проектах было много версий VS, появившихся и появившихся после VS 2010, у меня есть подозрение, что файлы csproj могут находиться в несовместимом состоянии. Я постараюсь создавать новые проекты и добавлять к ним файлы кода.
ОБНОВЛЕНИЕ 4
Я только что создал новое решение с новыми проектами и добавил к ним файлы кода. К сожалению, сборка заканчивается с той же ошибкой. Вы можете скачать решение здесь:
https://drive.google.com/open?id=1oMtwc8aD0kxE6jmtoF05Z5ROZ7diQzUQ
ОБНОВЛЕНИЕ 5
Эта проблема, вероятно, не имеет ничего общего с файлом Microsoft.Common.CurrentVersion.targets
, потому что я сравнил его с другой установкой VS Enterprise той же версии, и они совпадают.
Попробую удалить и переустановить VS.
ОБНОВЛЕНИЕ 6
В некоторых проектах решения использовался пакет PostSharp
NuGet версии 4.1.23. Обновление до 6.0.27, самой последней версии, решило проблему. Решение снова строится нормально.