T4模板语句块中方括号的语法

时间:2016-07-23 18:06:40

标签: t4 configurationmanager

我想在T4模板中使用System.Configuration程序集来获取项目的App.config中列出的连接字符串。但是,编译器似乎不接受语句块中的[]。这是怎么做到的?

<#@ assembly name="System.Configuration" #>
<#@ import namespace="System.Configuration"#>

<#

   var connectionString = ConfigurationManager.ConnectionStrings["localconnection"].ConnectionString;

#>

TIA

1 个答案:

答案 0 :(得分:1)

如果您在设计时运行T4(CustomTool:TextTemplatingFilePreprocessor),模板代码将作为VisualStudio流程的一部分执行。 VisualStudio正在加载devenv.exe.config而不是您的项目配置(您可以通过AppDomain.CurrentDomain.SetupInformation.ConfigurationFile进行检查)。

这就是为什么你得到空引用异常 - 'localconnection'连接字符串不在devenv.exe.config中。

您可以使用ConfigurationManager.OpenMappedExeConfiguration:

加载项目配置文件
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Configuration" #>
<#@ import namespace="System.Configuration"#>
<#@ import namespace="System.IO" #>

<#
    string configPath = Path.Combine(Host.ResolveAssemblyReference("$(ProjectDir)"), "App.config");
    var configFileMap = new ExeConfigurationFileMap{ExeConfigFilename = configPath};    

    var config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
    string connectionString = config.ConnectionStrings.ConnectionStrings["localconnection"].ConnectionString;

    WriteLine(connectionString);
#>

注意,必须是hostspecific =“true”才能使用Host解析项目文件夹。