【问题标题】:msbuild uses the wrong assembly namemsbuild 使用了错误的程序集名称
【发布时间】:2018-09-05 14:19:41
【问题描述】:

在我从未遇到过问题的解决方案中构建一些 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 正在寻找以 bin\debug 文件夹中的项目命名的 dll,该文件夹是 WpfControlLibrary 项目所引用的项目之一。

构建日志显示上述所有四个项目引用都是这种情况。在构建看似正确的项目之后,构建正在他们的bin\debug 文件夹中寻找一个名为WpfControlLibrary.dll 的dll(这些项目是使用正确命名的dll 和pdb 文件构建的)。构建错误可能只包含一个丢失的 dll,因为它在第一个错误时失败。

但是,如果我构建整个解决方案,并查看 Helpers 项目的 bin\debug 文件夹,我看到项目已正确构建,然后在构建过程中,Helpers.dll 文件消失了,并出现一个名为WpfControlLibrary.dll(和pdb)的文件。最后构建失败,因为它没有找到Helpers.dll

WpfControlLibrary 项目引用的项目没有对WpfControlLibrary 的引用。

上面的结果是由VS Enterprise 2017 version 15.8.2msbuild version 15.8.168.64424产生的。我最近更新了VS,在研究别人一段时间后又回到了这个解决方案,所以我不知道更新是否破坏了它。

我尝试使用VS Community 2017 version 15.2msbuild 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)

社区构建日志中缺少这些内容,但可能存在许多其他差异。

我不确定这是 VS 的错。可能是构建过程获取构建目标的全局 msbuild 文件损坏了。我尝试修复VS,但没有任何区别。

我正在链接下面的构建日志。

我有一种预感,我只能通过删除并重新安装或修复已安装的 .NET Framework 版本来解决此问题。我可以直接从上下文菜单中的Control Panel / Programs and Features / <.NET Framework version> / Repair 执行此操作吗?

https://drive.google.com/file/d/1NqLrzkmQhYSoYQxoja76NQp484gWNTHL/view?usp=sharing下载压缩的诊断级构建日志

更新

构建日志引用每个项目的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 社区构建日志引用的文件替换该文件并构建项目,它仍然会给出相同的错误。但是,如果我清理项目,然后构建,它会构建它而不会出错。对于 VS 和 msbuild 版本,请参见上文。我链接下面的两个文件。文件名显示它们是哪个版本。

企业:https://drive.google.com/open?id=1MPnAVQxMtjTcuy39pzmLJolIroBaDgMt

社区:https://drive.google.com/open?id=19Jn8UkRaJ5oAFXreXI4IpRKmGrnjtGQ8

我将尝试用显示此行为的项目编译一个小型解决方案。

更新 2

我创建了一个仅包含 WpfControlLibrary 项目及其依赖项的解决方案。您可以在以下链接下载它:

使用下面更新 4 下的更新链接

我只是将项目文件夹复制到一个新文件夹中,然后将它们添加到新解决方案中。我不得不稍微修改一下 csproj 文件,因为每个文件中的以下部分导致标准 .NET 4 项目引用(系统等)在解决方案资源管理器中显示为未找到:

<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)

所以上面描述的错误现在被重现了。

通过从WpfControlLibrary 项目中排除所有xaml 文件,我设法摆脱了构建错误。我在一个一个地重新添加它们之后构建了解决方案,但由于它不同,所以无法得出导致错误的结论。有一次,通过删除对 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 2010 以来许多版本的 VS 来来去去,我有一种预感,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 解决了该问题。解决方案再次构建良好。

【问题讨论】:

  • 你能用一个简单的演示重现这个问题吗?您可以与我们分享一个样本来重现此问题,以便我们可以直接面对此问题。仅根据您的描述,很难重现此问题并找出原因。
  • @LeoLiu-MSFT 从上面更新 2 部分下的链接下载示例解决方案。谢谢。
  • 我想知道我是否有同样的问题。我正在尝试将构建过程从使用 devenv 切换到 MSBuild。构建失败,因为它在 CopyFilesToOutputDirectory 步骤将 MySubLibrary 的输出复制到 MyMainLibrary.dll,然后在 IncrementalClean 期间删除 MySubLibrary.dll。之后,依赖 MySubLibrary 的以下项目都失败了。真的很奇怪。这是与 MSBuild 15.8.168.64424 一起使用的,它是我昨天从 Web 安装安装在构建服务器上的。

标签: c# .net msbuild visual-studio-2017 postsharp


【解决方案1】:

更新 - 事实证明,Visual Studio 更新(大约 15.8.3)中存在重大更改,这导致使用 PostSharp 的早期版本出现问题 - 我认为 Drew 和我自己在 4.x 上。将 PostSharp 更新到最新版本 6.0.27 后,在努力处理在我的方面引入的一些重大更改之后,解决了这个问题。

下面是原帖。

这周我几个月没碰过的项目也遇到了同样的问题。我在周二克隆了 repo,NCrunch 构建得很好。昨天,我将 VS2017 更新到 15.8.4 并且 NCrunch 仍在构建它。但是...现在,当我按下 F5 时,32 个项目中有 4 个给了我 CS0006。查看详细的构建日志,我看到了:

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\Universe.dll 时找不到 D:\Repos\g\Universe\bin\Debug\Lafs2.dll。

【讨论】:

  • 未在 15.8.5 中修复,似乎尚未出现在已知问题列表中。 docs.microsoft.com/en-us/visualstudio/releasenotes/…
  • @Drew - 您的项目是否涉及 PostSharp?只是为了从我们的询问中消除它......
  • 两个损坏的项目确实引用了 PostSharp 4.1.23 版。我有点想提它,但我一定忘记了。但请注意,正如我所写的,相同的项目可以在其他机器上的相同版本的 VS 上愉快地构建。我不知道为什么即使我在回复中包含“@playtime222”,SO 也不会提及 playtime222。
  • 向微软报告。使用内置记录器发送问题会话。
  • 该死的。我希望你不会那样说... PostSharp 现在是 6+ 版本,我可能需要在我的方面做一些工作,以将它们从使用 4.2 升级到 6,看看问题是否重复。至于你提到的问题 - 我可能没有足够的声誉或其他一些 SO bollox :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多