2012-01-13 23 views
16

Có cách nào để có được tất cả các hội đồng phụ thuộc vào một hội đồng nhất định không?Nhận các hội đồng phụ thuộc?

Pseudo:

Assembly a = GetAssembly(); 
var dependants = a.GetDependants(); 
+0

Bạn có cần nó theo chương trình không? Nếu không, bạn có thể sử dụng MS Depends cho điều đó. –

+0

Lập trình. Tôi cần sử dụng [AddProviderTransparent] (http://msdn.microsoft.com/en-us/library/dd783170.aspx) trên tất cả các loại phụ thuộc. – Shimmy

+4

Bạn sẽ xác định phạm vi như thế nào? Hội có thể biết những gì nó phụ thuộc vào nhưng nó có thể nói những gì phụ thuộc vào nó? 1 cho câu hỏi;) – StaWho

Trả lời

13

Nếu bạn muốn tìm các hội phụ thuộc từ các miền ứng dụng hiện tại, bạn có thể sử dụng một cái gì đó giống như GetDependentAssemblies chức năng định nghĩa dưới đây:

private IEnumerable<Assembly> GetDependentAssemblies(Assembly analyzedAssembly) 
{ 
    return AppDomain.CurrentDomain.GetAssemblies() 
     .Where(a => GetNamesOfAssembliesReferencedBy(a) 
          .Contains(analyzedAssembly.FullName)); 
} 

public IEnumerable<string> GetNamesOfAssembliesReferencedBy(Assembly assembly) 
{ 
    return assembly.GetReferencedAssemblies() 
     .Select(assemblyName => assemblyName.FullName); 
} 

Tham số analyzedAssembly đại diện cho lắp ráp mà bạn muốn tìm tất cả các người phụ thuộc.

+0

Mọi người bao gồm cả tôi là một kẻ ngốc vì không có gì nghĩ về nó. Thẳng và đơn giản. – Shimmy

+1

+1 Tốt. Tôi chưa từng thấy Assembly.GetReferencedAssemblies() trước đây. Hình như nó đã được thêm vào. Net 4. Vâng - bạn học một cái gì đó mỗi ngày. –

6

Programatically, bạn có thể sử dụng Mono.Cecil để làm điều này.

Something như thế này (lưu ý điều này sẽ không hoạt động nếu debugger được gắn - ví dụ như nếu bạn chạy nó từ bên trong VS chính nó):

public static IEnumerable<string> GetDependentAssembly(string assemblyFilePath) 
{ 
    //On my box, once I'd installed Mono, Mono.Cecil could be found at: 
    //C:\Program Files (x86)\Mono-2.10.8\lib\mono\gac\Mono.Cecil\0.9.4.0__0738eb9f132ed756\Mono.Cecil.dll 
    var assembly = AssemblyDefinition.ReadAssembly(assemblyFilePath); 
    return assembly.MainModule.AssemblyReferences.Select(reference => reference.FullName); 
} 

Nếu bạn không cần phải làm điều này programatically, sau đó NDepend hoặc Reflector có thể cung cấp cho bạn thông tin này.

+0

Mã của bạn trả về một danh sách các assembly được tham chiếu bởi một assembly được chỉ bởi 'assemblyFilePath', đúng không? Đây có phải là những gì OP đang hỏi về? Tôi nghĩ (có thể nhầm lẫn) rằng OP muốn ngược lại: đưa ra một hội đồng 'A' tìm tất cả các hội đồng tham khảo nó. Tui bỏ lỡ điều gì vậy? –

+0

ahh - có thể bạn đã đúng - không chắc chắn bây giờ.Nó phụ thuộc nếu bạn đọc tiêu đề (cho thấy những gì tôi đã trả lời ở đây), hoặc mô tả văn bản (cho thấy bạn là đúng)! –

+0

Đồng ý, có một chút khó hiểu. Nhưng nếu tôi đúng, thì OP có lẽ phải trả lời câu hỏi của StaWho trong phần bình luận đầu tiên! Tôi thấy không có cách nào khác để giải quyết vấn đề hơn là tìm kiếm cho mỗi và mọi lắp ráp trong "phạm vi" và thực thi mã của bạn cho mỗi người trong số họ. –

1

Tôi không biết về bất kỳ khả năng tích hợp nào để nhận phụ thuộc vào thời gian chạy. Vì vậy, tôi nghĩ giải pháp đơn giản nhất là xác định phương pháp mở rộng và sử dụng mã từ ứng dụng this. Tôi đã sử dụng ứng dụng một năm trước. Nhưng không mã sử dụng của nó.

Hy vọng điều này sẽ hữu ích.

2

Đầu tiên xác định phạm vi của bạn, ví dụ:

  1. Tất cả hội trong thư mục bin ứng dụng của tôi

  2. Tất cả hội trong thư mục bin ứng dụng của tôi + tất cả các hội đồng trong GAC

  3. Tất cả hội trên bất kỳ máy nào trên thế giới.

Sau đó, chỉ cần (*) lặp qua tất cả các cụm trong phạm vi của bạn và sử dụng phản ánh để kiểm tra xem chúng có phụ thuộc vào hội đồng mục tiêu hay không.

Nếu bạn muốn tham khảo gián tiếp cũng như trực tiếp, bạn sẽ phải rửa và lặp lại cho tất cả các cụm bạn tìm thấy.

(*) Có thể không quá đơn giản nếu phạm vi của bạn là 3 ở trên.

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