2012-04-23 36 views
13

tôi có phương pháp sau đây cần lấy một danh sách (trong thư mục bin) lắp ráp trong nước được nạp:Không phải tất cả hội đang được nạp vào AppDomain từ thư mục bin

static IEnumerable<Assembly> GetLocalAssemblies() 
    { 
     Assembly callingAssembly = Assembly.GetCallingAssembly(); 
     string path = new Uri(Path.GetDirectoryName(callingAssembly.CodeBase)).AbsolutePath; 

     var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
     return assemblies.Where(x => !x.IsDynamic && new Uri(x.CodeBase).AbsolutePath.Contains(path)).ToList(); 
    } 

Tuy nhiên, danh sách các cụm là mất tích một vài hội chúng tôi cần nó. Các assembly tôi cần được quản lý (C# .net 4), được tham chiếu trong dự án và có mặt trong thư mục bin.

Tại sao các tệp nhị phân có trong thư mục bin KHÔNG bị cuốn vào AppDomain khi ứng dụng bắt đầu?

+0

hết mức tò mò, giá trị của đường dẫn chuỗi là gì? –

+0

Đó là đường dẫn đến thư mục bin cho dự án. –

Trả lời

24

Adil có nó, nhưng cụ thể hơn:

.NET CLR sử dụng trình biên dịch Just-In-Time. Trong số những thứ khác, điều này có nghĩa là nó tải hội đồng vào sử dụng đầu tiên. Vì vậy, mặc dù các assembly được tham chiếu bởi assembly được sử dụng, nếu các tham chiếu chưa được CLR cần để thực thi chương trình, chúng không được nạp và do đó sẽ không xuất hiện trong danh sách các assembly trong AppDomain hiện tại.

Một điều khác có thể hoặc không áp dụng, là nếu bạn có cùng phiên bản của assembly trong GAC, CLR sử dụng GAC ưu tiên hơn các assembly cục bộ, UNLESS đường dẫn tới các assembly đó được chỉ định trong môi trường DEVPATH biến. Nếu đây là trường hợp và CLR đang sử dụng bản sao GAC của bất kỳ hội đồng "thiếu" nào, chúng sẽ có các giá trị CodeBase khác nhau và sẽ không hiển thị trong kết quả truy vấn LINQ của bạn.

Một điều khác: bạn có thể muốn xem xét sử dụng thuộc tính Vị trí thay vì thuộc tính CodeBase. Thuộc tính Location chứa đường dẫn tuyệt đối đến assembly đã được nạp vào thời gian chạy. Thuộc tính CodeBase hơi khác một chút và có thể không giống nhau đối với tất cả các assembly trong một bản dựng đầy đủ của một dự án.

+0

+1 cho thuộc tính vị trí. – Turbot

+1

+1 "nếu các tham chiếu không cần thiết bởi CLR, chúng sẽ không xuất hiện trong danh sách các assembly trong AppDomain hiện tại" <--- Ugh. Đây là vấn đề gốc của một con bọ đang giết tôi. – jwatts1980

4

CurrentDomain.GetAssemblies() chỉ trả về các assembly đã tải không phải tất cả các assembly có sẵn trong thư mục thực thi.

Đây là những gì microsoft nói về nó "phương pháp GetAssemblies để có được một danh sách tất cả các hội đồng đã được tải vào miền ứng dụng." click here

3

Hãy thử khởi tạo bất kỳ lớp nào trong các hội đồng bị thiếu này và sau đó chạy lại mã của bạn .. Các hội đồng được nạp khi cần thiết chỉ với cuộc gọi đầu tiên tới bất kỳ thứ gì liên quan đến hội đồng đó.

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