2011-01-12 38 views
5

Trong Visual Studio 2010 Tôi có bố trí dự án sau:T4 tham chiếu khối lắp ráp xây dựng

  • Giải pháp
    • dự án A
      • lớp C
      • lớp D
    • dự án B
      • T4 mẫu

Mẫu T4 chứa một tài liệu tham khảo lắp ráp như thế này:

<#@ assembly name="$(SolutionDir)\A\bin\Debug\A.dll" #> 

Mẫu instantiates một thể hiện của lớp C. Khi tôi chạy mẫu T4 bộ vi xử lý tải dll của dự án A và tạo ra đầu ra một cách chính xác. Các lỗi phát sinh khi tôi muốn thay đổi điều gì đó trong dự án A, nói thay đổi một trong hai lớp C hoặc D.

Không thể sao chép tập tin "obj \ Debug \ A.dll" để "bin \ Debug \ A.dll ". Quá trình không thể truy cập tệp 'bin \ Debug \ A.dll' vì nó đang được được sử dụng bởi một quy trình khác.

Cách duy nhất tôi tìm thấy để loại bỏ lỗi này là khởi động lại Visual Studio. Có cách nào khác để buộc việc dỡ bỏ lắp ráp A.dll từ VS?

Trả lời

8

Im sử dụng VS2010 SP1 và vẫn bị chặn trong xây dựng sau khi xây dựng đầu tiên khi chạy một mẫu T4 tùy chỉnh trong các sự kiện POST-BUILD đã truy cập các cá thể của các lớp của cùng một dự án.

Cách thức hoạt động của tôi là sử dụng Reflection để truy cập các lớp từ dll Project.

Tôi vẫn gặp sự cố chặn khi tải tệp dll trực tiếp từ tệp.

LƯU Ý: Bí quyết là tải tệp .dll vào bộ nhớ dưới dạng mảng byte và sau đó tải lắp ráp từ mảng byte thô. Tải DONT từ tệp bằng Assembly.LoadFrom

Mã này là từ tệp mẫu T4 của tôi và đang truy cập một lớp tĩnh "Thông tin" và gọi Phương thức tĩnh "Phiên bản" để trả về giá trị chuỗi.

string assemblyPath = Path.Combine(projectPath, @"bin\SampleProject.dll"); 
byte[] data; 

using (var fs = File.OpenRead(assemblyPath)) 
{ 
    data = new byte[fs.Length]; 
    fs.Read(data, 0, Convert.ToInt32(fs.Length)); 
} 

if (data == null || data.Length == 0) 
{ 
    throw new ApplicationException("Failed to load " + assemblyPath); 
} 

var asm = Assembly.Load(data); 
appVersion = (string) asm.GetType("SampleProject.Information").GetField("Version").GetValue(null); 
+0

Câu trả lời tuyệt vời! Nhưng khi tôi nhận được lắp ráp thông qua một mảng byte vì lý do nào đó tôi mất tất cả các thuộc tính trong các đối tượng trong dll .. bất cứ ai khác chạy vào nó? – Nemmy

2

m0sa Sự cố này đã được khắc phục trong Visual Studio 2010 SP1.

Nếu bạn không thể sử dụng đó, có một chỉ thị VolatileAssembly add-on trong dự án T4 Toolbox trên CodeBox (http://t4toolbox.codeplex.com/)

+0

Tôi đang sử dụng Visual Studio 2010 SP1 nhưng vẫn gặp sự cố tương tự. Để workaround [vấn đề của tôi] (http://stackoverflow.com/questions/5886938/cannot-reference-dependency-assemblies-in-t4-template-when-using-transformonbuild) Tôi đang sử dụng một đường dẫn tuyệt đối trong 'assembly 'chỉ thị.Bất cứ ý tưởng những gì có thể là sai? –

+0

Tôi không sợ - hoặc thử nghiệm trên bản vá lỗi SP1 không hiển thị bất kỳ vấn đề nào. Nếu bạn có thể đưa ra một vấn đề kết nối với một trường hợp reproable chúng ta có thể xem xét nó. – GarethJ

+7

Tôi gặp vấn đề tương tự trong Visual Studio 2013. –

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