Tôi có một bộ sưu tập các tệp DLL (ví dụ 20). Làm thế nào để tìm ra tất cả các DLL mà một DLL cụ thể (nói DLL A) phụ thuộc vào?Tìm hiểu phụ thuộc của tất cả các tệp DLL?
Trả lời
Nếu bạn muốn lập trình, hãy sử dụng Assembly.GetReferencedAssemblies
.
Bạn có thể sử dụng đệ quy để tìm tất cả các hội đồng bạn cần. (Vì vậy, bạn tìm phụ thuộc của X, sau đó phụ thuộc của các phụ thuộc, vv)
Bạn có thể sử dụng bộ khung phụ thuộc http://www.dependencywalker.com để tìm hiểu điều này. Hãy lưu ý về sự khác biệt giữa x32 và x64 mặc dù.
Dependency Walker là một tiện ích miễn phí có thể quét tất cả 32-bit hoặc 64-bit của Windows mô-đun (exe, dll, ocx, sys, vv) và xây dựng một sơ đồ cây thứ bậc của tất cả các module phụ thuộc.
Vì câu hỏi được gắn thẻ "C#", tôi cho rằng bạn đang nói về các dll được quản lý (hội đồng). Trong trường hợp đó, dependencywalker không hữu ích. Nếu bạn muốn làm điều đó với một chương trình, những cái tốt là dotPeek bởi JetBrians và Reflector bởi RedGate. Hoặc bạn thậm chí có thể sử dụng bộ kiểm tra đối tượng trong Visual Studio.
Tuy nhiên, nó có thể là một quá trình lâu dài và rườm rà quá. Tôi sẽ viết một kịch bản C# ngắn/F # ngắn sử dụng Assembly.GetReferencedAssemblies
, như Jon đã đề cập.
Nếu thay vào đó bạn muốn kiểm tra phụ thuộc DLL gốc với chương trình (mã C#), bạn phải đi kiểm tra tệp PE (định dạng tệp dll và exe) và IAT (bảng địa chỉ nhập). Không dễ dàng, nhưng không phải là không thể ...
Tôi sẽ bắt đầu here on MSDN và here để hiểu phần PE và sử dụng thư viện được quản lý để đọc nó (có rất nhiều, bao gồm một số từ dự án Mono (Tôi đang nghĩ đến Cecil) , cần làm việc với những chương trình có nguồn gốc quá); trong quá khứ tôi đã sử dụng this one từ tốt John Gough
Tất cả tín dụng trả lời đều được chuyển đến các tác giả trước đây để sử dụng Assembly.GetReferencedAssemblies
. Đây chỉ là viết và giả mạo t C# giao diện điều khiển ứng dụng chỉ hoạt động cho các hội đồng .NET. return 0
trên các hội đồng bạn đã có thể kiểm tra và khi thành công, xuất chúng ra STDOUT. Mọi thứ khác sẽ return 1
và in một số loại đầu ra lỗi. Bạn có thể lấy gist here.
using System;
using System.Reflection;
using System.IO;
namespace DotNetInspectorGadget
{
class DotNetInspectorGadget
{
static int Main(string[] args)
{
if(args.GetLength(0) < 1)
{
Console.WriteLine("Add a single parameter that is your" +
" path to the file you want inspected.");
return 1;
}
try {
var assemblies = Assembly.LoadFile(@args[0]).GetReferencedAssemblies();
if (assemblies.GetLength(0) > 0)
{
foreach (var assembly in assemblies)
{
Console.WriteLine(assembly);
}
return 0;
}
}
catch(Exception e) {
Console.WriteLine("An exception occurred: {0}", e.Message);
return 1;
} finally{}
return 1;
}
}
}
Cách sử dụng:
call %cd%\dotnet_inspector_gadget.exe C:\Windows\Microsoft.NET\assembly\GAC_64\Microsoft.ConfigCI.Commands\v4.0_10.0.0.0__31bf3856ad364e35\Microsoft.ConfigCI.Commands.dll
Output:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
- 1. Plugin DLL phụ thuộc vào các tệp DLL khác
- 2. Bao gồm tất cả các phụ thuộc
- 3. Dỡ bỏ một gói và tất cả các phụ thuộc
- 4. Làm thế nào để liệt kê tất cả các thuộc tính phụ thuộc của kiểm soát?
- 5. Tìm phụ thuộc của makefile
- 6. Tìm tất cả các tham chiếu của một dll trong một dự án
- 7. xóa các tệp phụ thuộc
- 8. Không thể tải tệp hoặc lắp ráp '***. Dll' hoặc một trong các phụ thuộc của nó
- 9. Cách viết tệp package.json để tất cả các phụ thuộc được tải xuống bằng "npm install"
- 10. Loại trừ tất cả các tệp thuộc loại trong NuGet
- 11. msvcp90.dll phụ thuộc vào sai msvcr90.dll?
- 12. Phụ thuộc DLL tròn trong .NET
- 13. Quản lý các phụ thuộc DLL với Maven
- 14. Cách tạo biểu đồ phụ thuộc giữa tất cả các mô-đun của dự án Maven?
- 15. Tìm tất cả các lớp có thuộc tính cụ thể
- 16. Tìm tất cả các chuỗi trong các tệp mã python
- 17. Tìm tất cả các bước trong đường dẫn thuộc tính
- 18. Đăng nhập phiên bản của tất cả các tệp DLL đã sử dụng
- 19. Xây dựng JAR bao gồm tất cả các phụ thuộc của nó
- 20. Vấn đề phụ thuộc Dll Maven
- 21. Tiêm phụ thuộc vào mùa xuân: Tiêm tất cả các trường hợp của giao diện
- 22. Tạo tất cả các phụ thuộc của dự án trong một tệp đơn bằng cờ gcc -MM
- 23. C#: Làm thế nào để bao gồm DLL phụ thuộc?
- 24. Tìm tất cả các yếu tố của một phần của thuộc tính id
- 25. Làm thế nào để tìm ra các lọ mà các phụ thuộc trong pom.xml của maven phụ thuộc vào?
- 26. Tìm tất cả các tệp bị khóa trong TFS
- 27. XCode - văn bản tìm kiếm trong tất cả các tệp
- 28. Tìm tệp trong tất cả các thư mục có thể?
- 29. Di chuyển tất cả các DLL và PYD đến một thư mục con với cx_Freeze
- 30. Tránh Phụ thuộc Thông tư của các tệp tiêu đề
bạn sẽ cần phải bao gồm "using System.Reflection;" – greenfeet
@ greenfeet: Không nhất thiết - bạn có thể sử dụng 'var assembly = typeof (Foo) .Assembly.GetReferencedAssemblies();' chẳng hạn. Nói chung, nó không đáng để thêm tất cả các không gian tên được sử dụng bởi tất cả các kiểu được tham chiếu trong các câu trả lời - đặc biệt không phải khi có các liên kết đến các kiểu được đề cập đến.Tôi giả định rằng độc giả hiểu đủ về ngôn ngữ C# để biết khi nào nên thêm chỉ thị 'using'. –
Bạn có thể tránh việc thêm 'using System.Reflection' cho các phụ thuộc của các phụ thuộc không? Bạn sẽ không phải gọi Assembly.LoadWithPartialName (hoặc một cái gì đó tương tự) tại một số điểm? – theoski