2012-12-20 34 views
6

Tôi muốn tham khảo để lắp ráp một dự án trong đó mẫu T4 là. Tôi biết tôi có thể lấy đường dẫn đến dự án, ví dụ Host.ResolveAssemblyReference("$(ProjectDir)") và tôi có thể thêm bin\\debug\\{projectName}.dll vì tên lắp ráp của tôi được đặt tên theo tên dự án, nhưng đó không phải lúc nào cũng vậy và tôi đang tạo mẫu có thể sử dụng lại được dll hoặc tốt nhất là ví dụ Assembly. Tôi cũng tìm thấy cách tham chiếu đến Project như được giải thích here theo phương pháp GetProjectContainingT4File, nhưng sau đó làm gì?Mẫu T4 VS2010 được lắp ráp máy chủ

Có cách nào để tải xuống không?

BTW, tôi cần tham chiếu đó để truy cập các loại cụ thể và tạo một số mã từ chúng.

+0

Một khả năng là tìm tệp .csproj, phân tích cú pháp và trích xuất đường dẫn đầu ra xây dựng. Đó là một tệp xml. – FuleSnabel

+0

hm ... vâng, tôi có thể, điểm tốt. Tôi sẽ thử. – Kosta

Trả lời

9

Ok, tôi quản lý để có được tham chiếu cần thiết để lắp ráp @ FuleSnabel đã cho tôi một gợi ý, mặc dù tôi đã không sử dụng đề xuất của mình.

Dưới đây là một phần của mẫu T4 của tôi:

<#@ template debug="true" hostSpecific="true" #> 
<#@ output extension=".output" #> 
<#@ Assembly Name="System.Core.dll" #> 
<#@ Assembly Name="System.Windows.Forms.dll" #> 
<#@ Assembly Name="System.Xml.Linq.dll" #> 
<#@ Assembly Name="Microsoft.VisualStudio.Shell.Interop.8.0" #> 
<#@ Assembly Name="EnvDTE" #> 
<#@ Assembly Name="EnvDTE80" #> 
<#@ Assembly Name="VSLangProj" #> 

<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Diagnostics" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Xml.Linq" #> 
<#@ import namespace="System.Collections" #> 
<#@ import namespace="System.Reflection" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #> 
<#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #> 
<#@ import namespace="EnvDTE" #> 
<#@ import namespace="EnvDTE80" #> 
<#@ include file="T4Toolbox.tt" #> 
<# 
    Project prj = GetProject(); 
    string fileName = "$(ProjectDir)bin\\debug\\" + prj.Properties.Item("OutputFileName").Value; 
    string path = Host.ResolveAssemblyReference(fileName); 
    Assembly asm = Assembly.LoadFrom(path); 

    // .... 
#> 

// generated code goes here 

<#+ 
    Project GetProject() 
    { 
     var serviceProvider = Host as IServiceProvider; 
     if (serviceProvider == null) 
     { 
      throw new Exception("Visual Studio host not found!"); 
     } 

     DTE dte = serviceProvider.GetService(typeof(SDTE)) as DTE; 

     if (dte == null) 
     { 
      throw new Exception("Visual Studio host not found!"); 
     } 

     ProjectItem projectItem = dte.Solution.FindProjectItem(Host.TemplateFile); 
     if (projectItem.Document == null) { 
      projectItem.Open(Constants.vsViewKindCode); 
     } 

     return projectItem.ContainingProject; 
    } 
#> 

Vì vậy, để tìm con đường đúng đắn để lắp ráp tôi đã phải nhận tài liệu tham khảo cho dự án trong GetProject() phương pháp và sau đó sử dụng tài sản OutputFileName của dự án với prj.Properties.Item("OutputFileName").Value. Vì tôi không thể tìm thấy bất cứ nơi nào dự án bất động sản có, tôi sử dụng liệt kê và một vòng lặp để kiểm tra bộ sưu tập Properties và sau đó tìm thấy những gì tôi cần. Đây là mã vòng lặp:

<# 
// .... 
foreach(Property prop in prj.Properties) 
{ 
    #> 
    <#= prop.Name #> 
    <# 
} 
// .... 
#> 

Tôi hy vọng điều này sẽ giúp một ai đó.

+0

Cảm ơn; điều này chỉ đẩy tôi qua một vết sưng nhỏ ngay từ đầu con đường. – TeaDrivenDev

9

Tiếp theo mã đơn giản làm việc cho tôi (VS 2013):

var path = this.Host.ResolveAssemblyReference("$(TargetPath)"); 
var asm = Assembly.LoadFrom(path); 

Ngoài ra bạn có thể tìm $(...) tài sản trong psot dự án xây dựng biên tập bước.

+0

Ước gì tôi có thể nhân đôi điều này. Cảm ơn! – Mitch