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

是否可在命令行版NSwag(nswag.exe)中注入自定义生成器

实现方案

完全可以实现,不需要单独构建部署自定义控制台应用,也能把自定义名称生成器注入NSwag命令行、接入MSBuild生成流程,具体操作如下:

核心逻辑

NSwag官方的命令行工具(nswag.exe)和MSBuild任务原生支持加载外部扩展程序集,不需要修改工具本身,只要把自定义生成逻辑编译成独立类库,让NSwag启动时加载即可,你现有的两个自定义生成器实现几乎不需要改代码就能复用。

操作步骤

  • 整理自定义生成器为独立类库
    把CustomTypeNameGenerator、TClientGenerator两个自定义实现从原有控制台项目中抽离,放到独立的类库项目中。类库建议使用和你当前NSwag版本兼容的目标框架(一般netstandard2.0即可),引用和你所用NSwag版本完全一致的NSwag.CodeGeneration.CSharp、NSwag.Core NuGet包。注意两个生成器类必须标记为public,且提供无参构造函数,方便NSwag通过反射实例化。
    顺带提一句,你原有配置里DateType = "System.DataTime"是笔误,正确写法是System.DateTime,迁移配置的时候记得修正。
  • 配置NSwag加载自定义程序集
    不管是用nswag.exe命令行还是NSwag.MSBuild任务,都可以在nswag.json配置文件的根节点添加extensionPaths配置项,填入你上一步编译出的自定义类库dll的文件路径,NSwag启动时会自动加载该路径下的程序集,识别你写的自定义生成器类型。
  • 迁移原有生成配置到nswag.json
    你原来在控制台代码里写的所有CSharpClientGeneratorSettings配置项,都可以一一对应到nswag.json的CSharp客户端生成节点下,其中两个生成器的配置不需要写实例化代码,直接填类型的完全限定名+程序集名即可,格式为命名空间.类名, 程序集名称,配置示例如下:
    {
      "extensionPaths": ["你的自定义生成器类库dll的相对/绝对路径"],
      "codeGenerators": {
        "openApiToCSharpClient": {
          "className": "{controller}Client",
          "namespace": "你配置的客户端命名空间",
          "classStyle": "Inpc",
          "dateTimeType": "System.DateTime",
          "dateType": "System.DateTime",
          "typeNameGenerator": "你的自定义生成器命名空间.CustomTypeNameGenerator, 你的自定义生成器类库程序集名",
          "jsonLibrary": "SystemTextJson",
          "generateClientInterfaces": true,
          "generateClientClasses": true,
          "operationNameGenerator": "你的自定义生成器命名空间.TClientGenerator, 你的自定义生成器类库程序集名",
          "exceptionClass": "YadaYada.Library.Client.SwaggerException",
          "injectHttpClient": true,
          "serializeTypeInformation": true,
          "disposeHttpClient": true,
          "wrapDtoExceptions": false,
          "generateOptionalParameters": true,
          "exposeJsonSerializerSettings": false,
          "parameterArrayType": "System.Collections.Generic.IList",
          "responseArrayType": "System.Collections.Generic.IList",
          "generateExceptionClasses": false,
          "useBaseUrl": false,
          "generateDtoTypes": false,
          "additionalNamespaceUsages": ["你需要额外引入的命名空间列表"]
        }
      }
    }
    
  • 接入MSBuild流程
    给需要触发代码生成的项目安装NSwag.MSBuild NuGet包,把配置好的nswag.json放到项目目录下,配置编译前触发的生成任务即可,后续项目正常编译的时候就会自动执行代码生成逻辑,不需要单独运行控制台程序。

注意事项

  • 自定义生成器类库引用的所有NSwag相关NuGet包版本,必须和你使用的nswag.exe、NSwag.MSBuild包版本完全一致,否则会出现类型不匹配导致的反射加载失败问题。
  • 如果你的自定义生成器内部有其他依赖,需要在无参构造函数中自行初始化,NSwag加载扩展时不会走依赖注入容器,无法自动注入依赖。
  • 自定义生成器类不要用静态、抽象修饰,否则NSwag无法正常实例化。

内容的提问来源于stack exchange,提问作者Tim Bassett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:57:11