msbuild использует неверное имя сборки - PullRequest
0 голосов
/ 05 сентября 2018

У меня были проблемы со сборкой некоторых проектов 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, самой последней версии, решило проблему. Решение снова строится нормально.

1 Ответ

0 голосов
/ 20 сентября 2018

Обновление - оказывается, что в обновлении Visual Studio произошли серьезные изменения, примерно 15.8.3, которые вызвали проблемы при использовании ранних версий PostSharp - я думаю, что Дрю и я были на 4.x. Обновление PostSharp до последней версии, 6.0.27, решило проблему, приложив усилия, чтобы справиться с несколькими критическими изменениями, которые появились в моих аспектах.

Оригинальный пост ниже.

Та же проблема на этой неделе с проектом, который я не затрагивал уже несколько месяцев. Я клонировал репо во вторник, и NCrunch прекрасно его создает. Вчера я обновил VS2017 до 15.8.4, а NCrunch все еще собирает его. Но ... теперь 4 проекта из 32 дают мне CS0006, когда я нажимаю F5. Глядя на подробный журнал сборки, я вижу это:

1>Target "ResolveAssemblyReferences" in file "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets" from project "D:\Repos\g\Game.Client.Wpf\Game.Client.Wpf_ftfxk2qp_wpftmp.csproj" (target "PostSharp30InspectReferences" depends on it):  
1>Using "ResolveAssemblyReference" task from assembly "Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".  
1>Task "ResolveAssemblyReference"  
1>  TargetFrameworkMoniker:  
1>      .NETFramework,Version=v4.7.2  
1>  TargetFrameworkMonikerDisplayName:  
1>      .NET Framework 4.7.2  
1>  TargetedRuntimeVersion:  
1>      v4.0.30319  
1>  Assemblies:  
1>      System.Core  
1>  AssemblyFiles:  
1>      D:\Repos\g\EntityComponentSystem\bin\Debug\Lafs2.dll  
1>      D:\Repos\g\Framework.Unity\bin\Debug\Lafs2.dll  
1>      D:\Repos\g\Framework\bin\Debug\Lafs2.dll  
1>      D:\Repos\g\Game.Controls.Wpf\bin\Debug\Lafs2.dll  
1>      D:\Repos\g\Game.Messages\bin\Debug\Lafs2.dll  
1>      D:\Repos\g\Logging.Metrics\bin\Debug\Lafs2.dll  
1>      D:\Repos\g\Logging\bin\Debug\Lafs2.dll  
1>      D:\Repos\g\NetCode\bin\Debug\Lafs2.dll  
1>      D:\Repos\g\Universe.Client\bin\Debug\Lafs2.dll  
1>      D:\Repos\g\Universe.Physics\bin\Debug\Lafs2.dll  
1>      D:\Repos\g\Universe\bin\Debug\Lafs2.dll  
1>      C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\mscorlib.dll  

Имя сборки текущего строительного проекта заменило имя файла ВСЕХ элементов в AssemblyFiles. CS0006 говорит, что не может найти D: \ Repos \ g \ Universe \ bin \ Debug \ Lafs2.dll, когда ему нужно искать D: \ Repos \ g \ Universe \ bin \ Debug \ Universe.dll.

...