You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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环境验证

  1. 确保安装官方C# Dev Kit扩展(属于.NET第一方工具链)
  2. 保存permissions.json后,MSBuild会自动触发设计时目标,执行脚本生成Permissions.g.cs
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:52:28