强制 VS2022 使用 32 位版本的 msbuild
Forcing VS2022 to use 32 bit version of msbuild
我目前正在研究将我们的工具集从 VS2013、15 和 17 迁移到 VS2022,以简化和减少构建我们的解决方案所需的软件数量。 VS2022 拥有我们需要的所有部分,但是我正在努力通过 VS 本身来构建实际的解决方案。
如果我在路径 C:\Program Files\Microsoft Visual Studio22\Community\Msbuild\Current\Bin\MSBuild.exe
上使用随附的 32 位版本的 msbuild,则解决方案完全可以构建。但是 C:\Program Files\Microsoft Visual Studio22\Community\Msbuild\Current\Bin\amd64\MSBuild.exe
版本(我猜 VS22 使用的是什么?)无法构建,并出现与 VS22 相同的错误。
重要的是要注意我们的 solution/projects 主要基于 .net framework 2.0
(不幸的是)并设置为 x86
平台。
我在各种第一方和第三方 dll 上不断循环返回以下错误 SGEN : error : An attempt was made to load an assembly with an incorrect format
。我一直在反复尝试以下组合:
- 在
x86
和 AnyCPU
之间更改项目,但无论项目及其参考配置如何,错误仍然出现
- 在项目上关闭
Generate serialization assembly
,因为我在某处看到人们通过这样做已成功解决了错误。
- 将
ToolsVersion
从 4.0
(我们当前的设置)更改为 Current
和其他版本
我正在有效地寻找一种方法来强制 VS2022 使用 32 位 msbuild(如果可能的话),因为它构建了整个解决方案而根本没有进行任何更改。
我也注意到 VS 输出中的以下内容 window:
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 位版本可以解决我的问题吗?我一直没能真正找到在哪里做这个来尝试。
谢谢!
对我们有用的是在 .csproj 文件中手动覆盖 SGenToolPath
项目 属性
添加以下内容:
<Target Name="SGENBeforeBuild" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<!-- workaround for VS2022 x64 building serialization assemblies for x86 targets
, see -->
<SGenToolPath>$(TargetFrameworkSDKToolsDirectory)</SGenToolPath>
</PropertyGroup>
</Target>
有趣的是,我们不得不对一些 x86 目标项目使用此解决方法,而不是所有项目。
事实上,您可能(我们确实)通过许多 Visual Studio 构建工具步骤 运行 遇到了类似的问题。这是一个 MSDN 页面,其中列出了大多数 Visual Studio (2022) 构建工具的项目属性:
https://docs.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-properties?view=vs-2022
我目前正在研究将我们的工具集从 VS2013、15 和 17 迁移到 VS2022,以简化和减少构建我们的解决方案所需的软件数量。 VS2022 拥有我们需要的所有部分,但是我正在努力通过 VS 本身来构建实际的解决方案。
如果我在路径 C:\Program Files\Microsoft Visual Studio22\Community\Msbuild\Current\Bin\MSBuild.exe
上使用随附的 32 位版本的 msbuild,则解决方案完全可以构建。但是 C:\Program Files\Microsoft Visual Studio22\Community\Msbuild\Current\Bin\amd64\MSBuild.exe
版本(我猜 VS22 使用的是什么?)无法构建,并出现与 VS22 相同的错误。
重要的是要注意我们的 solution/projects 主要基于 .net framework 2.0
(不幸的是)并设置为 x86
平台。
我在各种第一方和第三方 dll 上不断循环返回以下错误 SGEN : error : An attempt was made to load an assembly with an incorrect format
。我一直在反复尝试以下组合:
- 在
x86
和AnyCPU
之间更改项目,但无论项目及其参考配置如何,错误仍然出现 - 在项目上关闭
Generate serialization assembly
,因为我在某处看到人们通过这样做已成功解决了错误。 - 将
ToolsVersion
从4.0
(我们当前的设置)更改为Current
和其他版本
我正在有效地寻找一种方法来强制 VS2022 使用 32 位 msbuild(如果可能的话),因为它构建了整个解决方案而根本没有进行任何更改。
我也注意到 VS 输出中的以下内容 window:
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 位版本可以解决我的问题吗?我一直没能真正找到在哪里做这个来尝试。
谢谢!
对我们有用的是在 .csproj 文件中手动覆盖 SGenToolPath
项目 属性
添加以下内容:
<Target Name="SGENBeforeBuild" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<!-- workaround for VS2022 x64 building serialization assemblies for x86 targets
, see -->
<SGenToolPath>$(TargetFrameworkSDKToolsDirectory)</SGenToolPath>
</PropertyGroup>
</Target>
有趣的是,我们不得不对一些 x86 目标项目使用此解决方法,而不是所有项目。
事实上,您可能(我们确实)通过许多 Visual Studio 构建工具步骤 运行 遇到了类似的问题。这是一个 MSDN 页面,其中列出了大多数 Visual Studio (2022) 构建工具的项目属性:
https://docs.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-properties?view=vs-2022