netstandard2.0环境下T4模板读取appsetting.json配置的解决方案咨询
你当前的ConfigurationManager返回null的核心原因是:T4模板执行时的运行上下文与你的项目上下文隔离,默认读取的是T4执行引擎的宿主配置(比如Visual Studio的devenv.exe配置、dotnet t4命令的运行时配置),不会自动加载你项目目录下的app.config、appsettings.json等配置文件。
方案1:手动加载项目配置文件(适配netstandard2.0)
该方案无需修改模板调用逻辑,直接在模板内加载项目下的配置文件,同时支持流水线直接替换配置文件内容。
首先需要在你的项目中提前安装两个适配netstandard2.0的NuGet包:
System.Configuration.ConfigurationManager(适配传统.config格式配置文件)Microsoft.Extensions.Configuration.Json(适配json格式配置文件,更推荐)
修改后的T4模板示例如下:
<#@ template debug="false" hostspecific="true" language="C#" #> <#@ output extension=".cs" #> <#@ assembly name="netstandard" #> <#@ assembly name="System.Configuration.ConfigurationManager" #> <#@ assembly name="Microsoft.Extensions.Configuration" #> <#@ assembly name="Microsoft.Extensions.Configuration.Json" #> <#@ import namespace="System.IO" #> <#@ import namespace="Microsoft.Extensions.Configuration" #> <# // 拿到当前模板所在的项目根目录 var templateDir = Host.ResolvePath("."); // 定位项目下的appsettings.json文件,可根据实际路径调整 var configPath = Path.Combine(templateDir, "appsettings.json"); // 加载配置 var config = new ConfigurationBuilder() .AddJsonFile(configPath, optional: false, reloadOnChange: false) .Build(); // 读取连接字符串 var connString = config.GetConnectionString("YourConnStringKey"); // 读取自定义配置节点 var myVariable = config["MyConfigSetting"]; #> // 后续接你的代码生成逻辑
方案2:Runtime模板外部传参(更适合流水线场景)
Runtime Templates生成的类是partial类,你可以直接扩展类添加参数,把连接字符串从外部传入,完全不需要在模板内部读取配置,流水线执行时可以直接读取流水线变量传入,避免配置文件读取的兼容性问题。
操作步骤如下:
- 模板无需引入配置相关的程序集,直接定义公共属性接收参数:
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".cs" #> <#+ // 定义公共属性接收外部传入的配置值 public string ConnectionString { get; set; } public string MyConfigSetting { get; set; } #> // 生成代码时直接调用上述属性即可 <# var connString = this.ConnectionString; var myVariable = this.MyConfigSetting; #>
- 调用模板生成代码的地方直接传参即可:
var template = new YourTemplateGeneratedClassName(); // 此处可读取流水线变量、项目配置等任意来源的配置值传入 template.ConnectionString = "你的数据库连接字符串"; template.MyConfigSetting = "其他自定义配置值"; // 执行生成逻辑 string generatedCode = template.TransformText(); // 把生成的代码写入目标.cs文件即可
流水线替换适配说明
- 如果使用方案1,直接使用流水线的配置文件替换任务,替换appsettings.json里对应的连接字符串节点即可,和普通.NET项目的配置替换逻辑完全一致。
- 如果使用方案2,直接在流水线执行模板生成的步骤中,把流水线中存储的连接字符串敏感变量作为参数传入即可,不需要修改任何文件内容,安全性更高。
内容的提问来源于stack exchange,提问作者Marcos Varela Alonso
相关产品推荐
相关产品推荐

