PAYATHON 2026

如何以非交互方式将项目转换为 SDK-style 并保留 net48?

数据小陈

可以保留 net48,只转换项目文件格式。对于支持 feature.sdkstyle 操作的 upgrade-assistant CLI,可以先将命令简化为:

upgrade-assistant upgrade "AppStarting.csproj" -o feature.sdkstyle --non-interactive

删除原命令中的 -o Inplace 和 -f net48。SDK-style 转换可以保留目标框架。Microsoft 的功能说明将这种转换与升级 .NET 版本区分开来。官方功能说明

原命令为什么需要调整?

辅助控制台应用实际执行的是:

upgrade-assistant upgrade "..." -o feature.sdkstyle -o Inplace --non-interactive -f net48

这里有两处需要调整:

  • -o 被指定了两次,分别传入 feature.sdkstyle 和 Inplace。只转换项目格式时,单独选择 feature.sdkstyle 即可。重复参数的处理取决于具体版本,不能假设这两个值可以组合使用。
  • -f net48 显式指定了目标框架。保留现有框架的格式转换不需要用这个参数表达,应先移除,以免引入额外的框架参数解析或验证。

日志中的 Unknown target framework. 只能说明这次调用未能识别或接受目标框架,无法据此认定 SDK-style 不支持 net48,也不能确定两个参数问题中哪一个是唯一原因。net48 是 SDK-style 项目可以使用的 .NET Framework TFM。目标框架文档

如何修改控制台应用?

保留现有的项目筛选逻辑,将执行命令的部分改为:

var up = await enter(
    $@"upgrade-assistant upgrade ""{tp.path}""" +
    " -o feature.sdkstyle" +
    " --non-interactive"
);

Microsoft 技术支持人员也公开演示过 feature.sdkstyle 的 CLI 用法,可以参考其参数形式。Microsoft Q&A 中的操作示例

原循环中还有一个调试断点:

Debugger.Break();

无人值守运行前应移除它,否则程序可能在调用转换工具之前暂停,影响自动执行。

如何确认目标框架没有改变?

先选择一个项目试运行,再检查转换差异。对于原本以 .NET Framework 4.8 为目标的项目,转换后通常会使用下面的属性表达目标框架:

<TargetFramework>net48</TargetFramework>

旧格式中的对应配置可能是:

<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>

属性名称和写法的变化不代表框架版本升级。转换成功后,还应检查项目引用、包引用、自定义构建步骤和输出配置,并完成还原、构建及必要的运行验证。

批处理程序最好记录每个项目的退出码和输出。如果 enter 尚未提供这些信息,需要补充相应处理,以免把失败项目当作已完成。

简化命令后仍失败怎么办?

先查看本机安装版本的命令帮助:

upgrade-assistant upgrade --help

确认该版本支持 feature.sdkstyle、-o 和 --non-interactive。如果不支持,应根据该版本的实际能力选择转换方式;不同版本的参数不一定能直接通用。

如果上述选项受支持,但仍然报错,应保留完整日志,进一步检查项目类型和导入的 .props、.targets。原问题没有提供工具版本或完整 .csproj,因此无法保证所有项目都能用同一条命令完成转换。

代码中关于多目标框架“不受支持”的说明也只是原有假设。为这次 net48 排障保留跳过逻辑即可,不应据此写成工具的通用限制。

备注:内容仅供参考。