迁移至.NET 6后VS 2022编译遇sgen.exe报错无法禁用XmlSerialization
.NET 6项目迁移到VS 2022 sgen.exe路径过长报错解决方案
该问题出现的核心原因是.NET Core/.NET 5+的SDK风格项目和传统.NET Framework项目的配置逻辑不同,原针对.NET Framework生效的<GenerateSerializationAssemblies>配置默认不会作用于.NET Core及更高版本的项目,因此旧配置会失效。以下是经过验证的可行解决方案:
- 方案1:在项目csproj文件中添加适配.NET Core+的禁用配置
在项目的csproj文件全局PropertyGroup节点下添加以下3项配置,覆盖所有编译场景下的sgen触发逻辑:
如果你的项目针对不同编译环境(Debug/Release、x86/x64/AnyCPU)配置了带条件的PropertyGroup节点,需要保证上述配置要么放在全局无限制的PropertyGroup下,要么每个条件PropertyGroup下都进行配置,避免部分场景下仍触发sgen执行。<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <SGenUseProxyTypes>false</SGenUseProxyTypes> <SGenGenerateSerializationAssembliesMode>None</SGenGenerateSerializationAssembliesMode> - 方案2:用全局配置文件统一禁用整个解决方案的sgen执行
如果单个项目修改不生效,可以在解决方案根目录新建名为Directory.Build.props的文件,写入以下内容,该配置会对整个解决方案下的所有项目自动生效:<Project> <PropertyGroup> <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> <SGenGenerateSerializationAssembliesMode>None</SGenGenerateSerializationAssembliesMode> </PropertyGroup> </Project> - 方案3:启用系统长路径支持(若需要保留序列化程序集生成功能)
如果你的业务确实需要生成XML序列化程序集,无法关闭该功能,可以通过开启系统长路径支持解决:- 按下Win+R输入
regedit打开注册表编辑器,定位到路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem - 找到名为
LongPathsEnabled的DWORD值,若不存在则手动新建,将其数值数据设置为1,基数选择十六进制 - 重启电脑让注册表配置生效
- 额外在项目csproj的PropertyGroup节点添加以下配置,告知编译器支持长路径:
<AppContextSwitchOverrides>Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false</AppContextSwitchOverrides> - 按下Win+R输入
注意:所有配置修改完成后,需要先清理解决方案,手动删除项目根目录下的bin、obj文件夹后再重新编译,避免旧缓存配置干扰结果。
内容的提问来源于stack exchange,提问作者Adamant
相关产品推荐
相关产品推荐

