msbuild使用错误的程序集名称

时间:2018-09-05 14:19:42

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

我在用从来没有问题的解决方案中构建某些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的{​​{1}}文件夹中寻找一个以该项目命名的dll。项目正在引用。

构建日志显示上述所有四个项目引用均属于这种情况。在看似正确构建那些项目后(该项目使用正确命名的dll和pdb文件构建),该构建正在其WpfControlLibrary文件夹中寻找名为WpfControlLibrary.dll的dll。构建错误可能仅包含一个丢失的dll,因为它在第一个错误时失败。

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

WpfControlLibrary.dll项目引用的项目没有对Helpers.dll的引用。

以上结果是由WpfControlLibraryWpfControlLibrary产生的。我最近更新了VS,在与他人合作一段时间后返回了该解决方案,所以我无法确定更新是否破坏了它。

我尝试使用VS Enterprise 2017 version 15.8.2msbuild version 15.8.168.64424在同一台计算机上构建有问题的项目,这样可以很好地构建它们。

该项目还可以在具有其他各种VS和msbuild版本的其他计算机上很好地构建。

我对msbuild不太了解,但是我比较了Enterprise和Community构建日志,似乎在以下几行之后,dll名称在前者中变酸了:

VS Community 2017 version 15.2

这些在社区构建日志中丢失,但是可能还有很多其他差​​异。

我不确定这是VS的错。可能是全局msbuild文件的构建过程采用了构建目标,而没有破坏。我尝试修复VS,但没什么区别。

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

我有一种直觉,只有删除并重新安装或修复已安装的.NET Framework版本,我才能解决此问题。我可以从上下文菜单中的msbuild version 15.1.1012.6693简单地做到这一点吗?

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

更新

构建日志引用每个项目的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) 文件。例如:

Control Panel / Programs and Features / <.NET Framework version> / Repair

如果我用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项目引用(系统等)在解决方案资源管理器中显示为未找到:

Microsoft.Common.CurrentVersion.targets

我的解决方案是注释掉这部分,从而使项目正确打开。我还删除并重新添加了引用的Nuget软件包,以防万一。

还原NuGet软件包后,构建解决方案将导致以下错误:

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)

因此现在再现了上述错误。

通过从<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> 项目中排除所有xaml文件,我设法摆脱了构建错误。在逐个重新添加它们之后,我构建了解决方案,但由于变化不尽,因此无法得出导致错误的结论。一次,通过删除对HunAlmex.Kioszk.Communication.ImportedServiceContracts项目的引用,消除了构建错误。

我认为替换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) 文件不是一个不错的解决方案,所以我希望有人可以提出更好的解决方案。预先感谢。

更新3

VS 15.8.3刚刚问世。更新后,构建示例解决方案的过程会稍有变化。生成错误如下:

WpfControlLibrary

该错误将保留在后续构建中,并且永远不会消失,除非我仅构建Microsoft.Common.CurrentVersion.targets项目。然后我们回到原始的构建错误。

更新到VS 15.8.4也无法修复。

由于自VS 2010以来,这些项目已经看到了许多版本的VS,所以我预感csproj文件可能处于不一致状态。我将尝试创建新项目并将代码文件添加到其中。

更新4

我刚刚用新项目创建了一个新的解决方案,并将代码文件添加到其中。不幸的是,该构建以相同的错误结束。您可以在此处下载解决方案:

https://drive.google.com/open?id=1oMtwc8aD0kxE6jmtoF05Z5ROZ7diQzUQ

更新5

此问题可能与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 文件无关,因为我将其与另一个相同版本的VS Enterprise安装进行了比较,并且它们匹配。

我将尝试卸载并重新安装VS。

更新6

解决方案中的某些项目使用了WpfControlLibrary NuGet软件包版本4.1.23。将它们更新到最新版本6.0.27已解决了该问题。解决方案再次构建良好。

1 个答案:

答案 0 :(得分:2)

更新-事实证明,Visual Studio更新中有重大更改,大约是15.8.3,使用早期版本的PostSharp引起了问题-我认为Drew和我本人在4.x上。在努力处理在我方面引入的一些重大更改之后,将PostSharp更新到最新版本6.0.27已解决了该问题。

下面的原始帖子。

本周,我一个月没碰到的项目也遇到了同样的问题。我在星期二克隆了仓库,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。