在 VScode 中构建 WPF 应用程序时出现错误 MSB4062

Build a WPF application in VScode gave me error MSB4062

我正在尝试在 Visual Studio 代码中对 WPF (.Net Core 3.1) 执行构建(这次不是 Visual Studio 因为我需要一个更轻量级的编辑器)。通常我所有的项目可以很好地构建,但是这个 WPF 项目给了我以下错误:

C:\Program Files (x86)\dotnet\sdk.1.100\Sdks\Microsoft.NET.Sdk.WindowsDesktop\targets\Microsoft.
WinFX.targets(225,9): error MSB4062: The "Microsoft.Build.Tasks.Windows.MarkupCompilePass1" task could not be loaded from
 the assembly C:\Program Files %28x86%29\dotnet\sdk.1.100\Sdks\Microsoft.NET.Sdk.WindowsDesktop\tools\netcoreapp2.1\PresentationBuildTasks.dll. Could not load file or assembly 'C:\Program Files 
%28x86%29\dotnet\sdk.1.100\Sdks\Microsoft.NET.Sdk.WindowsDesktop\tools\netcoreapp2.1\PresentationBuildTasks.dll'. The system cannot find the path specified.
Confirm that the <UsingTask> declaration is correct, that the assembly and all 
its dependencies are available, and that the task contains a public class that 
implements Microsoft.Build.Framework.ITask. [E:\ui_wpf_test\ui_wpf_test.csproj]

The build failed. Fix the build errors and run again.

我听说它与 MSbuild 有关,但我不知道如何正确解决这个问题

我在 GitHub 上找到了解决方案。您必须替换以下 %ProgramFiles(x86)%\dotnet\sdk.1.100\Sdks\Microsoft.NET.Sdk.WindowsDesktop\targets\Microsoft.WinFx.props 行:

<_PresentationBuildTasksAssembly Condition="'$(_PresentationBuildTasksAssembly)'==''">$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\tools$(_PresentationBuildTasksTfm)\PresentationBuildTasks.dll'))</_PresentationBuildTasksAssembly>

替换为:

<_PresentationBuildTasksAssembly Condition="'$(_PresentationBuildTasksAssembly)'==''">$(MSBuildThisFileDirectory)..\tools$(_PresentationBuildTasksTfm)\PresentationBuildTasks.dll</_PresentationBuildTasksAssembly>

这最终对我有用。

小错误。应该在即将推出的新 3.1.103 而不是现在的 3.1.102 中修复。

问题出在路径 Program Files (x86)' where(x86)is escaped to%28x86%29`,导致找不到路径。

通过转义路径的临时修复:

转到:

C:\Program Files (x86)\dotnet\sdk.1.102\Sdks\Microsoft.NET.Sdk.WindowsDesktop\targets

编辑 Microsoft.WinFx.props 并使用此 _PresentationBuildTaskAssembly,它具有 Unescape 路径:

    <_PresentationBuildTasksAssembly Condition="'$(_PresentationBuildTasksAssembly)'==''">$([MSBuild]::Unescape($([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\tools$(_PresentationBuildTasksTfm)\PresentationBuildTasks.dll'))))</_PresentationBuildTasksAssembly>

您也可以通过在 visual studio 中将构建更改为 x64 而不是 Any CPU/x86 来解决此问题。对于 64 位,这将使用 C:\Program Files\ 而不是 C:\Program Files (x86)\,因此没有 'bad' 个字符。