2010-08-08 29 views
30

Tôi có mã sau trong một lớp thử nghiệm trong hội đồng chính của tôi, PocoGenerator. Hội đồng này được cho là sử dụng một mẫu T4 để tạo ra POCO dựa trên các thực thể L2S trong một assembly tham chiếu (một tham chiếu dự án), DataObjects.Không thể tham khảo một hội đồng trong một mẫu T4

var assemblyName = "DataObjects"; 
var dataObjects = AppDomain.CurrentDomain.Load(new AssemblyName(assemblyName)); 

Hãy thử làm như tôi có thể, tôi không thể lấy T4 để tìm lắp ráp DataObject. Tôi đã thử các hình thức assembly chỉ thị, như:

<#@ assembly name="DataObjects" #> 
<#@ assembly name="DataObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" #> 

vô ích. Mã trên hoạt động trong lớp trình kiểm tra, nhưng không hoạt động trong mẫu. Tôi đang làm gì sai?

thêm: Tôi đã giải quyết vấn đề này bằng cách sử dụng đường dẫn tuyệt đối đến lắp ráp ở những nơi bot Tôi tham khảo nó, chỉ thị cũng như các khối năng lớp, tức là

<#@ assembly name="C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll" #> 

var sourceAssembly = Assembly.LoadFile(@"C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll"); 

Nhưng tôi thực sự không thích điều này, vì tôi muốn sử dụng mẫu này trong các dự án khác nhau và tôi chỉ đơn giản là ghét trùng lặp, đặc biệt là các chuỗi ma thuật.

+0

dự án mẫu của bạn nên có một tài liệu tham khảo dự án để dự án bạn có một sự phụ thuộc vào. Thẻ "assembly" của bạn ở trên trông có vẻ đúng. Và bạn cũng nên có tham chiếu "nhập". Bạn nhận được thông báo lỗi chính xác nào? (và những gì với các công cụ AppDomain? bạn không cần phải làm bất cứ điều gì như thế) –

+0

Các công cụ AppDomain là tp cho phép tôi để lặp tất cả các loại trong một trong những hội đồng được nạp trong AppDomain hiện tại. Nó không liên quan gì đến việc tham chiếu assembly cho chính bản mẫu đó. – ProfK

+0

Vâng, tôi thấy bây giờ. Và bạn nhận được thông báo lỗi chính xác nào? –

Trả lời

54
<#@ assembly name="$(ProjectDir)bin\Debug\ProofOfConcept.dll" #> 

Chúc mừng Mã hóa!

+1

Mặc dù lưu ý đây là tính năng chỉ có VS2010 – GarethJ

+30

Hoặc thậm chí tốt hơn: '<# @ assembly name =" $ (ProjectDir) $ (OutDir) $ (TargetFileName) "#>' –

+13

Đơn giản nhất: '<# @ Assembly name =" $ (TargetPath) "#>' – pylover

1

Tôi gặp sự cố tương tự khi cố gắng bao gồm Less Css for .NET trong dự án Web của mình.

Tôi đã kết thúc với việc sao chép tập hợp trong thư mục gốc của dự án của tôi và bao gồm nó như là một tham chiếu trong chính dự án. Sau đó, tôi đã thêm các dòng sau trong file .tt:

<#@ assembly name="dotless.Core.dll" #> 

<#@ import namespace="dotless.Core" #> 
<#@ import namespace="dotless.Core.configuration" #> 

Tôi chắc chắn rằng một cái gì đó tương tự nên làm việc với hội đồng của bạn cũng ...

0

tôi đã tìm thấy có một số lượng các trường hợp trong việc tạo và sử dụng bộ công cụ và gói gax, nơi xây dựng hoàn toàn hài lòng với cách tham chiếu được cấu trúc nhưng thời gian chạy bị làm phiền vì nó không thể tìm thấy những gì nó đang tìm kiếm - điều này thường xảy ra khi lắp ráp sử dụng các yếu tố gax và sau đó lắp ráp lần lượt tham khảo một hội đồng mà chính không.

hãy thử trực tiếp bao gồm lắp ráp được đề cập trong hội đồng chính của bạn - và xem xét rằng bạn có thể cần phải viết hướng dẫn xây dựng bài đăng để di chuyển đến vị trí 'mong đợi' - trong khi đó không cần phải cố định đường.

YMMV

14

Để tham khảo lắp ráp trong mẫu T4 trong VS2010 bạn có một số lựa chọn:

  1. GAC hội đồng của bạn và sử dụng không gian tên tham chiếu hoặc Loại Fully Qualified Tên
  2. Sử dụng một đường dẫn UNC Fully Qualified mã hóa cứng
  3. Sao chép bản sao vào Visual Studio "Public Assemblies Folder" và sử dụng Không gian tên Tham chiếu hoặc Tên đủ điều kiện.
  4. Sử dụng hoặc xác định môi trường Windows Biến để tạo đường dẫn UNC đủ điều kiện.
  5. Sử dụng Macro của Visual Studio để tạo đường dẫn UNC đủ điều kiện.

tôi sẽ đề nghị bạn nên đặt một assembly được tham chiếu trong công Assemblies thư mục của bạn, khác, có lẽ giải pháp tốt hơn sẽ là cứng mã con đường hội tham chiếu của bạn.

bài Rất đẹp về chủ đề này: T4 Template error - Assembly Directive cannot locate referenced assembly in Visual Studio 2010 project.

Về cơ bản MS đã quyết định thay đổi các phanh, mà các hội đồng dự án tham khảo không được tham chiếu bởi động cơ T4, quá.

Bộ lắp ráp của T4 được tách hoàn toàn khỏi bộ lắp ráp của dự án có chứa để tránh việc lắp ráp sai khi dự án nhắm vào các phiên bản khung trước đó. Các hội đồng dự án không còn được sử dụng để giải quyết các chỉ thị lắp ráp mẫu.

Thông tin thêm về rằng: What's new in T4 in Visual Studio 2010

+0

+1 để tham chiếu dự án không còn được sử dụng nữa, điều đó đã giết chết tôi! – dbones

+0

@Peter Stegnar Tôi hỏi một câu hỏi liên quan ở đây: http://stackoverflow.com/questions/13838142/put-all-methods-in-one-tt-file-and-use-it-in-another-t4-files -in-codetemplates bạn vui lòng kiểm tra xem nó – Saeid

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