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

如何创建.NET Core NuGet包替代exe实现C#类自动生成?

实现.NET Core NuGet包代码生成的两种方案

方案1:封装为.NET工具(最接近原exe调用体验)

把代码生成逻辑做成.NET全局/本地工具,就能像调用exe一样通过命令行触发,完美适配原MSBuild Exec的调用逻辑。

  • 操作步骤:
    1. 新建NET Core控制台应用,把原项目A的HTML解析、C#类生成逻辑完整迁移过来,保持输入输出参数的处理逻辑不变。
    2. 在项目的.csproj里添加工具配置:
      <PackAsTool>true</PackAsTool>
      <ToolCommandName>html2csharp</ToolCommandName> <!-- 自定义工具的命令名 -->
      <PackageOutputPath>./nupkg</PackageOutputPath>
      
    3. 运行dotnet pack生成NuGet包。
    4. 在项目B中使用:
      • 全局安装:执行dotnet tool install --global <你的工具包名>,然后在MSBuild的Exec目标里调用dotnet html2csharp <输入HTML路径> <输出CS路径>。
      • 本地安装:在项目B根目录创建config/dotnet-tools.json,指定工具包版本,运行dotnet tool restore后,用dotnet tool run html2csharp <参数>调用。

方案2:封装为自定义MSBuild任务(更集成化)

直接把代码生成逻辑做成MSBuild任务,嵌入到项目B的构建流程中,不需要单独的命令行调用。

  • 操作步骤:
    1. 新建NET Standard类库,迁移核心生成逻辑,然后写一个继承自Microsoft.Build.Utilities.Task的任务类:
      using Microsoft.Build.Utilities;
      using System.IO;
      
      public class HtmlToCSharpTask : Task
      {
          [Required]
          public string InputHtml { get; set; }
      
          [Required]
          public string OutputCs { get; set; }
      
          public override bool Execute()
          {
              // 原项目A的核心逻辑:读HTML、生成C#代码、写入文件
              var htmlContent = File.ReadAllText(InputHtml);
              var csCode = GenerateCSharpClass(htmlContent);
              File.WriteAllText(OutputCs, csCode);
              return true;
          }
      
          private string GenerateCSharpClass(string html)
          {
              // 这里放你的HTML转C#逻辑
              return "// 自动生成的C#类代码";
          }
      }
      
    2. 在类库的.csproj里添加MSBuild依赖:
      <PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.8.0" PrivateAssets="all" />
      
    3. 配置NuGet打包时包含MSBuild目标文件:
      在.csproj里加:
      <ItemGroup>
        <None Include="build\Html2CSharp.targets" Pack="true" PackagePath="build" />
      </ItemGroup>
      
    4. 创建build\Html2CSharp.targets文件,定义MSBuild目标:
      <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <UsingTask TaskName="HtmlToCSharpTask" AssemblyFile="$(MSBuildThisFileDirectory)..\lib\netstandard2.0\你的类库.dll" />
        <Target Name="GenerateCSharp" BeforeTargets="Compile">
          <HtmlToCSharpTask InputHtml="$(HtmlInputPath)" OutputCs="$(CsOutputPath)" />
        </Target>
      </Project>
      
    5. 项目B安装NuGet包后,直接在.csproj里配置参数即可自动触发生成:
      <PropertyGroup>
        <HtmlInputPath>./Templates/input.html</HtmlInputPath>
        <CsOutputPath>./Generated/MyAutoClass.cs</CsOutputPath>
      </PropertyGroup>
      

临时过渡方案(不推荐用于NuGet分发)

如果只是临时过渡,不想改造成工具或任务,也可以把代码生成逻辑放在控制台项目里,然后在MSBuild的Exec中用dotnet run调用:

<Exec Command="dotnet run --project $(SolutionDir)HtmlGenerator\HtmlGenerator.csproj -- $(InputHtml) $(OutputCs)" />

但这种方式依赖源码路径,不适合做成NuGet包分发。

内容的提问来源于stack exchange,提问作者Satashree Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:55:24