【发布时间】: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.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)
社区构建日志中缺少这些内容,但可能存在许多其他差异。
我不确定这是 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