2016-07-23 2 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

[how-to-make-connection-strings-t4-template에서 사용할 수있는] 복제본 (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 참조 예외가 발생합니다. '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); 
#> 

참고, 그것은 당신의 프로젝트 폴더를 해결하기 위해 호스트를 사용하려면 = "true"를 hostspecific해야합니다.