2010-11-16 29 views
10

Làm cách nào để có được các đường dẫn của tất cả các hội đồng được tham chiếu bởi hội đồng hiện đang thực hiện? GetReferencedAssmblies() cho tôi số AssemblyName[] s. Làm thế nào để tôi đến nơi họ được tải từ đó?Nhận các đường dẫn của tất cả các hội đồng được tham chiếu

+4

Hãy thử điều này http://stackoverflow.com/questions/1582510/ get-pathes-of-assemblies-sử dụng-in-type –

+0

Rất cám ơn. Điều đó giải quyết nó cho tôi. –

+0

Để biết ví dụ đầy đủ về cách lấy tất cả các hội đồng được tham chiếu, đệ quy, hãy xem http://stackoverflow.com/questions/383686/how-do-you-loop-through-currently-loaded-assemblies/26300241#26300241. – Contango

Trả lời

12

Bạn không thể biết cho đến khi lắp ráp được tải. Thuật toán phân giải lắp ráp phức tạp và bạn không thể đoán trước được nó sẽ làm gì. Gọi số ghi đè Assembly.Load(AssemblyName) sẽ giúp bạn tham chiếu đến hội đồng và thuộc tính Vị trí của nó cho bạn biết những gì bạn cần.

Tuy nhiên, bạn thực sự không muốn tải cụm lên phía trước, trước trình biên dịch JIT thực hiện điều đó. Đó là không hiệu quả và khả năng của các vấn đề không phải là số không. Ví dụ, bạn có thể kích hoạt sự kiện AppDomain.AssemblyResolve trước khi chương trình sẵn sàng trả lời. Tránh hỏi câu hỏi này.

+0

Rất cám ơn câu trả lời đúng. –

0

Thuộc tính CodeBase phải cung cấp tên đường dẫn đầy đủ.

+0

Bạn đã thử chưa? –

+5

Thật không may, CodeBase trả về null trên mọi assembly được tham chiếu. :-) –

0

Bạn có thể có được vị trí URL của lắp ráp như thế này:

Assembly.GetExecutingAssembly().GetReferencedAssemblies()[0].CodeBase 
+1

CodeBase trả về null. Giải pháp nằm trong bài đăng mà JasonEvans liên kết trong nhận xét của anh ấy với bài đăng gốc. Ngoài ra, Hans Passant cũng có câu trả lời đúng. –

2

Theo dõi câu trả lời của Hans Passant và vì thuộc tính CodeBase luôn chứa null, tôi đã đưa ra điều này. Nó có thể không tìm thấy tất cả các hội đồng vì chúng có thể không phải tất cả đã được tải. Trong trường hợp của tôi, tôi đã phải tìm tất cả các tài liệu tham khảo của một hội đồng được nạp trước đó, vì vậy nó hoạt động tốt:

IEnumerable<string> GetAssemblyFiles(Assembly assembly) 
{ 
    var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
    foreach (var assemblyName in assembly.GetReferencedAssemblies()) 
     yield return loadedAssemblies.SingleOrDefault(a => a.FullName == assemblyName.FullName)?.Location; 
} 

Cách sử dụng:

var assemblyFiles = GetAssemblyFiles(typeof(MyClass).Assembly); 
Các vấn đề liên quan