2016-07-23 156 views
0

我想使用T4模板中的System.Configuration程序集來獲取項目的App.config中列出的連接字符串。但是,編譯器似乎不接受語句塊中的[]。這是如何完成的?T4模板語句塊中方括號的語法

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

<# 

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

#> 

TIA

+0

你會得到什麼錯誤? – AlexP

+0

可能是[如何使連接字符串可用在一個t4模板](http://stackoverflow.com/questions/25460348/how-to-make-connection-strings-available -in-a-t4-template) – AlexP

+0

@AlexP對不起,需要很長時間才能回覆。通過對tmp文件的研究,發現[]字符串被正確編譯,但配置管理器沒有在項目的App.config中看到連接字符串 - 所以返回「null」。通過遍歷所有連接字符串,僅找到默認的machine.config連接字符串 - 不是控制檯項目特定的連接字符串。 :((VS 2015)感謝您對此的任何指導(我已經在寫這個問題之前應用了您的鏈接,但它沒有工作:()。 –

回答

1

如果你正在運行在設計時T4(CustomTool:TextTemplatingFilePreprocessor),模板代碼被作爲VisualStudio的進程的一部分執行。 VisualStudio加載devenv.exe.config而不是你的項目配置(你可以通過AppDomain.CurrentDomain.SetupInformation.ConfigurationFile來檢查)。

這就是爲什麼你會得到null ref異常 - '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 =「真」。