VS Code中如何在设计时无需手动构建从JSON自动生成.cs文件?
实现设计时JSON到C#常量类自动生成(第一方案)
核心方案:使用MSBuild设计时目标(Design-Time Targets)
MSBuild本身支持设计时执行的目标,这是.NET官方第一方机制,无需第三方工具,能在VS Code中生效。
步骤1:配置项目文件(.csproj)
在项目文件中添加以下配置,监听permissions.json变化并触发生成逻辑:
<Project Sdk="Microsoft.NET.Sdk"> <!-- 保留现有项目配置 --> <PropertyGroup> <!-- 指定生成文件的输出路径 --> <PermissionsGenOutputPath>$(MSBuildProjectDirectory)/Permissions.g.cs</PermissionsGenOutputPath> </PropertyGroup> <!-- 定义设计时目标,文件变化时自动执行 --> <Target Name="GeneratePermissionsDesignTime" BeforeTargets="CoreCompile" Inputs="$(MSBuildProjectDirectory)/permissions.json" Outputs="$(PermissionsGenOutputPath)" DesignTime="true"> <Exec Command="dotnet script $(MSBuildProjectDirectory)/GeneratePermissions.csx" /> </Target> <!-- 将生成文件纳入项目编译 --> <ItemGroup> <Compile Include="$(PermissionsGenOutputPath)" /> <AdditionalFiles Include="permissions.json" /> </ItemGroup> </Project>
步骤2:创建C#生成脚本(GeneratePermissions.csx)
编写轻量脚本读取JSON并生成目标C#类,无外部依赖:
using System; using System.IO; using System.Text.Json; var jsonPath = Path.Combine(AppContext.BaseDirectory, "permissions.json"); var outputPath = Path.Combine(AppContext.BaseDirectory, "Permissions.g.cs"); var jsonDoc = JsonDocument.Parse(File.ReadAllText(jsonPath)); var root = jsonDoc.RootElement; var sb = new System.Text.StringBuilder(); sb.AppendLine("public static partial class Permissions"); sb.AppendLine("{"); GenerateClasses(root, sb, indent: 1); sb.AppendLine("}"); File.WriteAllText(outputPath, sb.ToString()); void GenerateClasses(JsonElement element, System.Text.StringBuilder sb, int indent) { var indentStr = new string(' ', indent * 4); foreach (var prop in element.EnumerateObject()) { if (prop.Value.ValueKind == JsonValueKind.Object) { sb.AppendLine($"{indentStr}public static class {prop.Name}"); sb.AppendLine($"{indentStr}{{"); GenerateClasses(prop.Value, sb, indent + 1); sb.AppendLine($"{indentStr}}}"); } else if (prop.Value.ValueKind == JsonValueKind.String) { sb.AppendLine($"{indentStr}public const string {prop.Name} = \"{prop.Value.GetString()}\";"); } } }
步骤3:VS Code环境验证
- 确保安装官方C# Dev Kit扩展(属于.NET第一方工具链)
- 保存
permissions.json后,MSBuild会自动触发设计时目标,执行脚本生成Permissions.g.cs - VS Code的IntelliSense会立即检测到文件更新,无需手动构建
为什么Roslyn增量生成器无法满足需求?
Roslyn增量生成器仅在编译阶段或IDE后台分析周期运行,默认不会在JSON文件保存后即时触发。虽然可调整IDE设置强制后台分析,但无法保证即时性,且依赖IDE特定行为。而MSBuild设计时目标是文件变化驱动,直接在磁盘生成文件,IDE会自动拾取更新。
关键注意事项
- 先安装官方工具
dotnet script:执行dotnet tool install -g dotnet-script - 脚本路径逻辑需适配你的项目结构,避免路径错误
- 若为.NET Framework项目,需将
BeforeTargets改为Compile,并确保脚本运行环境兼容
内容的提问来源于stack exchange,提问作者Prashil Shah
相关产品推荐
相关产品推荐

