如何强制VS2022使用32位版本的msbuild?

8

目前我正在调查将我们的工具集从VS2013、15和17迁移到只使用VS2022,以便简化并减少构建解决方案所需的软件数量。VS2022具备我们需要的所有部分,但是我无法通过VS本身构建实际的解决方案。

如果我在路径C:\Program Files\Microsoft Visual Studio\2022\Community\Msbuild\Current\Bin\MSBuild.exe中使用相应的32位版本的msbuild,则解决方案完全可以构建。然而,C:\Program Files\Microsoft Visual Studio\2022\Community\Msbuild\Current\Bin\amd64\MSBuild.exe版本(我猜想是VS22使用的版本?)在构建时失败,并出现了与通过VS22相同的错误。

重要的是要注意,我们的解决方案/项目主要基于.net framework 2.0(不幸的是),并设置为x86平台。

我一直困扰于以下错误:SGEN:error:尝试加载格式不正确的程序集,这是针对各种第一方和第三方dll的。我一直在尝试反复更改以下组合:

  • 在项目之间改变x86AnyCPU,但无论项目及其引用的配置如何,错误仍然会出现
  • 关闭项目上的Generate serialization assembly,因为我在某个地方看到有人通过这样做来成功解决错误。
  • 4.0(我们当前的设置)更改到Current和其他版本的ToolsVersion

如果可能的话,我正在寻找一种强制VS2022使用32位msbuild的方法,因为它可以在不进行任何更改的情况下构建整个解决方案。

我还注意到了以下内容:

Task attempted to find "sgen.exe" using the SdkToolsPath value "". Make sure the SdkToolsPath is set to the correct value and the tool exists in the correct processor specific location below it. (TaskId:109)
4>  C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64\sgen.exe

SdkToolsPath 设置为32位版本是否可以解决我的问题?我实际上还没有找到在哪里设置这个选项来尝试。

谢谢!


1
如果你还没有看过的话,可以看一下这里。乍一看,似乎不能强制VS2022使用32位MSBuild(如果不能的话,这似乎是合理的,但我偏离了主题)。也许上述链接中的评论和链接可以帮助你。 - Christian.K
谢谢!我记不清是哪一个评论,但其中一个评论让我发现你可以在csproj文件中将SdkToolsPath设置为TargetFrameworkSDKToolsDirectory。我也对SGenToolPath做了同样的操作,这解决了大部分问题。如果有更好的建议,我会保持开放状态,否则一旦在本地解决了问题,我会在这里更新答案。 - Adam Short
1个回答

6
我们采用手动覆盖 .csproj 文件中的 SGenToolPath 项目属性来解决问题。
请添加以下内容:
<Target Name="SGENBeforeBuild" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <!--  workaround for VS2022 x64 building serialization assemblies for x86 targets
        , see https://dev59.com/l8Pra4cB1Zd3GeqPfWYG -->
    <SGenToolPath>$(TargetFrameworkSDKToolsDirectory)</SGenToolPath>
  </PropertyGroup>
</Target>

有趣的是,我们不得不使用这种解决方法来应对 一些 x86 目标项目,而不是全部。

事实上,你可能(我们也曾经)遇到过类似的问题,与多个 Visual Studio 构建工具步骤有关。这是一个列出了大多数 Visual Studio (2022) 构建工具项目属性的 MSDN 页面:
https://learn.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-properties?view=vs-2022


谢谢,那就是我最终做的,但是我忘记更新帖子了,所以我会选择标记您的回答。 - Adam Short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接