如何创建.NET Core NuGet包替代exe实现C#类自动生成?
实现.NET Core NuGet包代码生成的两种方案
方案1:封装为.NET工具(最接近原exe调用体验)
把代码生成逻辑做成.NET全局/本地工具,就能像调用exe一样通过命令行触发,完美适配原MSBuild Exec的调用逻辑。
- 操作步骤:
- 新建NET Core控制台应用,把原项目A的HTML解析、C#类生成逻辑完整迁移过来,保持输入输出参数的处理逻辑不变。
- 在项目的.csproj里添加工具配置:
<PackAsTool>true</PackAsTool> <ToolCommandName>html2csharp</ToolCommandName> <!-- 自定义工具的命令名 --> <PackageOutputPath>./nupkg</PackageOutputPath> - 运行
dotnet pack生成NuGet包。 - 在项目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的构建流程中,不需要单独的命令行调用。
- 操作步骤:
- 新建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#类代码"; } } - 在类库的.csproj里添加MSBuild依赖:
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.8.0" PrivateAssets="all" /> - 配置NuGet打包时包含MSBuild目标文件:
在.csproj里加:<ItemGroup> <None Include="build\Html2CSharp.targets" Pack="true" PackagePath="build" /> </ItemGroup> - 创建
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> - 项目B安装NuGet包后,直接在.csproj里配置参数即可自动触发生成:
<PropertyGroup> <HtmlInputPath>./Templates/input.html</HtmlInputPath> <CsOutputPath>./Generated/MyAutoClass.cs</CsOutputPath> </PropertyGroup>
- 新建NET Standard类库,迁移核心生成逻辑,然后写一个继承自
临时过渡方案(不推荐用于NuGet分发)
如果只是临时过渡,不想改造成工具或任务,也可以把代码生成逻辑放在控制台项目里,然后在MSBuild的Exec中用dotnet run调用:
<Exec Command="dotnet run --project $(SolutionDir)HtmlGenerator\HtmlGenerator.csproj -- $(InputHtml) $(OutputCs)" />
但这种方式依赖源码路径,不适合做成NuGet包分发。
内容的提问来源于stack exchange,提问作者Satashree Roy
相关产品推荐
相关产品推荐

