2014-10-24 4 views
5

Visual Studio T4 템플릿이 포함 된 프로젝트에서 참조하는 어셈블리 중 하나에서 유형을 참조해야합니다. 그러나 참조 된 어셈블리는 NuGet 패키지에서 설치됩니다. NuGet 레퍼런스가 진화하면 NuGet이 내 솔루션의 패키지 폴더에 배치하는 경로도 변경됩니다. 예를 들어, 가정 내 NuGet 패키지는 다음과 같습니다T4 템플릿에 NuGet 어셈블리로드

  • Facade.Contract.1.0.1 알파

그리고 내 프로젝트에서 그것의 상대 경로는 다음과 같습니다

  • .. \ 패키지 \ Facade.Contract.1.0.1-alpha \ lib \ net4 \ Facade.Contract.dll

시험판이 베타 버전으로 업데이트되면 해당 경로가 변경됩니다. 패키지가 해제되면 경로가 변경됩니다. 그리고 경로가 변경 때마다, 내 *의 .TT 파일의 조립 라인은 유효 기간이 경과 :

  • < # @ 어셈블리 이름 = ".. \ 패키지 \ Facade.Contract.1.0.1 알파 \ lib 디렉토리 \ net4 \ Facade.Contract.dll "#>

어셈블리 지시문을 사용하여이를 직접 수행 할 방법이 없다고 생각합니다. 그러나, 나는 미친 아이디어에 열려 있습니다. 어셈블리를 현재 또는 하위 또는 리플렉션 전용 AppDomain에로드 할 수 있습니까?

내가 할 수 있다고 생각하지만 동적으로 T4 논리를 사용하여 프로젝트의 참조에서 참조 된 어셈블리 경로를 탐색하는 방법을 잘 모르겠습니다.

아이디어가 있으십니까?

+1

Visual Studio 내에서 또는 msbuild를 사용하여 빌드하는 동안 T4 템플릿을 어떻게 실행합니까? – Frank

+0

Visual Studio 내에서 실행됩니다 (편집에서 말한 것과 달리 ... 최대한 빨리 수정합니다). 그래서 전 DTE에 접근해야합니다. – Trinition

+0

이 기사에서 영감을 얻은 후 참조 경로를 탐색하기 위해 VSLangProj를 사용하여 약간의 진전을 이루었습니다. http://t4-editor.tangible-engineering.com/blog/add-references-to-visual-studio-project- from-t4-template.html – Trinition

답변

3

이 문서에 의해 제안 나는 VSLangProject를 사용하여 솔루션을 발견했습니다 http://t4-editor.tangible-engineering.com/blog/add-references-to-visual-studio-project-from-t4-template.html

A가 내 포함 된 프로젝트에서 참조 어셈블리의 이름을 식별하는 문자열 serviceContractReferenceAssembly을 감안할 때, 그리고 serviceContractReferenceType은을 식별하는 해당 어셈블리 내에서 다음 형식이 작동합니다.

var templateItem = dte.Solution.FindProjectItem(this.Host.TemplateFile); 
    var project = templateItem.ContainingProject; 
    var vsProject = project.Object as VSLangProj.VSProject; 
    foreach(var referenceObj in vsProject.References) 
    { 
     var reference = (VSLangProj.Reference)referenceObj; 
     if(reference.Name != serviceContractReferenceAssembly) continue; 
     var serviceContractAssembly = Assembly.LoadFile(reference.Path); 
     var serviceContractType = serviceContractAssembly.GetType(serviceContractReferenceType); 
     // Do something with it here 
    } 
2

Nuget 팀에서는 솔루션/프로젝트의 패키지를 일부 제어 할 수있는 확장 기능을 제공합니다. 따라서 환경을 제어하고 모든 사용자가 this을 설치했는지 확인하면 설치된 패키지를 검색 한 다음 T4 실행 중에 동적으로로드 할 수 있습니다. 이러한 Nuget 어셈블리가 이미 준수되었으므로 솔루션/프로젝트의 일부가 아니기 때문에 표준 Assembly.Load을 사용하는 것이 효과적 일 것이라고 생각하지만 테스트해야합니다.

관련 문제