2014-10-24 25 views
5

Visual Studio T4 şablonumu içeren proje tarafından başvurulan derlemelerden birinde bir Tür'e başvurmam gerekiyor. Ancak, başvurulan derleme bir NuGet paketinden yüklenir. Bu Nuget referansı geliştikçe, NuGet'in onu çözümümün paketleri klasörüne yerleştirdiği yol da olacaktır. Örneğin, diyelim ki benim Nuget paketidir:T4'de bir NuGet aksamı yükleme Şablon

  • Facade.Contract.1.0.1-alfa

Sonra projemden buna göreli bir yoldur:

  • .. \ paketler \ Facade.Contract.1.0.1-alfa \ lib \ NET4 \ Facade.Contract.dll
  • yayın öncesi beta güncellenmesi halinde

, bu yol değişecektir. Paket serbest bırakıldığında, yol değişecektir. Ve yol değiştiren her zaman, benim * .tt dosyasında montaj hattı güncel değil:

  • < # @ derleme adı =" .. \ paketleri \ Facade.Contract.1.0.1-alfa \ lib \ n \ net4 \ Facade.Contract.dll "#>

Doğrudan montaj yönergesiyle bunu gerçekleştirmenin bir yolu olduğunu sanmıyorum; ancak bazı çılgın fikirlere açığım. Derlemeyi kendim mi yoksa alt bağımlı mı yoksa yalnızca yansıtma etki alanı AppDomain'e yükleyebilir miyim?

Sanırım yapabilirim, ancak T4 mantığını kullanarak projenin başvurularında başvurulan derlemenin yolunu dinamik olarak keşfetmeye nasıl gideceğimi bilmiyorum.

Herhangi bir fikrin var mı?

+1

T4 şablonlarınızı nasıl çalıştırıyorsunuz, Visual Studio'da veya msbuild kullanarak derleme sırasında mı çalışıyorsunuz? – Frank

+0

Visual Studio'nun içinde çalışıyorum (düzenlememde söylediğimden farklı olarak ... bunu en kısa sürede düzeltirim). Bu yüzden tüm DTE'ye erişmem gerekiyor. – Trinition

+0

Bu makaleden ilham alındıktan sonra referans yollarını keşfetmek için VSLangProj kullanarak biraz ilerleme yapıyorum: http://t4-editor.tangible-engineering.com/blog/add-references-to-visual-studio-project- from-t4-template.html – Trinition

cevap

3

bu makalede önerdiği gibi ben VSLangProject kullanarak bir çözüm bulduk: http://t4-editor.tangible-engineering.com/blog/add-references-to-visual-studio-project-from-t4-template.html

bir benim içeren projede referans düzeneğinin adını tanımlamak için bir dize serviceContractReferenceAssembly yola çıkarak ve serviceContractReferenceType tespit etmek Bu derleme içinde, aşağıdaki gibi çalıştı:

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 ekibi, bir çözüm/projedeki paketler üzerinde biraz kontrol sahibi olmanızı sağlayan bir uzantı hazırladı. Dolayısıyla, çevre üzerinde kontrolünüz varsa ve herkesin this yüklü olduğundan emin olabilirseniz, yüklü paketleri arayabilir ve T4 uygulamanız sırasında bunları dinamik olarak yükleyebilirsiniz. Bu Nuget meclisleri zaten uyum sağladığından ve çözümünüzün/projenizin bir parçası olmadığından, Assembly.Load standardını kullanmayı düşünürdüm ama bunu denemeniz gerekecek.