2014-10-24 14 views
5

Tôi cần tham chiếu một Loại trong một trong các hội đồng được tham chiếu bởi dự án có chứa mẫu Visual Studio T4 của tôi. Tuy nhiên, hội đồng tham chiếu được cài đặt từ gói NuGet. Khi tham chiếu Nuget tiến hóa, thì đường dẫn NuGet sẽ đặt nó vào trong thư mục gói của giải pháp của tôi. Ví dụ, giả sử gói NuGet của tôi là:Đang tải một cụm NuGet trong Mẫu T4

  • Facade.Contract.1.0.1-alpha

Sau đó, đường dẫn tương đối đến nó từ dự án của tôi là:

  • .. \ các gói \ Facade.Contract.1.0.1-alpha \ lib \ net4 \ Facade.Contract.dll

Nếu tiền phát hành được cập nhật thành beta, đường dẫn đó sẽ thay đổi. Khi gói được phát hành, đường dẫn sẽ thay đổi. Và mỗi khi con đường thay đổi, các dây chuyền lắp ráp trong file * .tt của tôi đã quá hạn:

  • < # @ lắp ráp name =" .. \ gói \ Facade.Contract.1.0.1-alpha \ lib \ net4 \ Facade.Contract.dll "#>

Tôi không nghĩ rằng có cách để thực hiện điều này trực tiếp với chỉ thị lắp ráp; tuy nhiên, tôi mở ra một số ý tưởng điên rồ. Tôi có thể tải bản thân lắp ráp vào hiện tại, hoặc một AppDomain cấp dưới hoặc chỉ phản chiếu?

Tôi nghĩ tôi có thể, nhưng tôi không chắc chắn làm thế nào để đi về tự động phát hiện đường dẫn đến hội đồng tham chiếu trong tài liệu tham khảo của dự án sử dụng logic T4.

Bất kỳ ý tưởng nào?

+1

cách bạn thực hiện mẫu T4 của bạn, chúng có chạy trong Visual Studio hoặc trong quá trình xây dựng bằng cách sử dụng msbuild không? – Frank

+0

Nó chạy bên trong Visual Studio (không giống như những gì tôi đã nói trong bản chỉnh sửa của mình ... Tôi sẽ sửa lại càng sớm càng tốt). Vì vậy, tôi nên có quyền truy cập vào toàn bộ DTE. – Trinition

+0

Tôi đang thực hiện một chút tiến bộ bằng cách sử dụng VSLangProj để khám phá các đường dẫn tham chiếu, sau khi được lấy cảm hứng từ bài viết này: http://t4-editor.tangible-engineering.com/blog/add-references-to-visual-studio-project- from-t4-template.html – Trinition

Trả lời

3

Tôi đã tìm thấy một giải pháp sử dụng VSLangProject theo đề nghị của bài viết này: http://t4-editor.tangible-engineering.com/blog/add-references-to-visual-studio-project-from-t4-template.html

Cho một xâu serviceContractReferenceAssembly một để xác định tên của assembly tham chiếu trong dự án chứa của tôi, và serviceContractReferenceType để xác định loại trong hội đồng đó, những điều sau đây đã làm việc:

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

Nhóm Nuget đã có sẵn phần mở rộng cho phép bạn kiểm soát các gói trong một giải pháp/dự án. Vì vậy, nếu bạn có quyền kiểm soát môi trường và có thể chắc chắn rằng mọi người đã cài đặt this, bạn có thể tìm kiếm các gói đã cài đặt và sau đó tự động tải chúng trong khi thực hiện T4. Kể từ khi các hội đồng Nuget đã được tuân thủ và không phải là một phần của giải pháp/dự án của bạn tôi sẽ nghĩ rằng bằng cách sử dụng tiêu chuẩn Assembly.Load sẽ làm việc nhưng bạn sẽ cần phải kiểm tra đó.

Các vấn đề liên quan