2010-04-06 33 views
6

Tôi muốn ghi nhật ký các phiên bản của tất cả các tệp DLL mà ứng dụng .NET của tôi sử dụng. Nó không quan trọng nếu log-đầu ra được tạo ra khi khởi động hoặc lần đầu tiên sử dụng mỗi DLL.Đăng nhập phiên bản của tất cả các tệp DLL đã sử dụng

Giải pháp đầu tiên xuất hiện trong đầu tôi là lặp lại tất cả các tệp DLL nằm trong cùng thư mục với assembly của tôi. Nhưng đây có phải là lựa chọn tốt nhất mà tôi có không? Có cách nào tốt hơn để làm điều này không? Điều quan trọng là giải pháp cũng nên hoạt động trên .NET-Compact-Framework.

+1

Theo câu trả lời cho câu hỏi này, dường như không tồn tại một giải pháp đơn giản, http://stackoverflow.com/questions/940885 –

Trả lời

6

Chỉnh sửa: Tôi đã kiểm tra và xác minh rằng tính năng này hoạt động trên .NET Compact Framework.

Bạn có thể thực hiện việc này bằng cách sử dụng Mono.Cecil, một công cụ mạnh mẽ cho phép bạn mở và kiểm tra các hội đồng .NET ở cấp IL mà không cần tải chúng vào một AppDomain.

string path = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; 

// If using Mono.Cecil 0.6.9.0: 
AssemblyDefinition myAssembly = AssemblyFactory.GetAssembly(path); 

// If using Mono.Cecil 0.9.1.0: 
AssemblyDefinition myAssembly = AssemblyDefinition.ReadAssembly(path); 

// from there, you can inspect the assembly's references 
foreach (ModuleDefinition module in myAssembly.Modules) 
{ 
    foreach (AssemblyNameReference assemblyReference in module.AssemblyReferences) 
    { 
     // do something with the reference e.g get name, version, etc 
     string fullName = assemblyReference.FullName; 
     Version version = assemblyReference.Version; 
    } 
} 
+0

Làm thế nào mà thậm chí từ xa hữu ích cho khung công tác COmpact? – ctacke

+1

@ctacke: Mono.Cecil không phải là thư viện cụ thể của Mono; bạn triển khai nó với ứng dụng của bạn. Tôi đã xác minh rằng nó thực sự hoạt động trên CF. –

+0

thì đó chỉ là lật mát! – ctacke

0

Tôi không chắc chắn liệu nó có sẵn trên CF hay không, nhưng trong NET bình thường, tôi chỉ đơn giản là sử dụng AppDomain.GetAssemblies().

Bạn có thể sử dụng sự kiện AppDomain.AssemblyLoad để thông báo cho bạn khi lắp ráp được tải.

+1

Thật không may cả phương pháp và sự kiện không có sẵn trên CF. – Bob

0

Bạn có thể sử dụng Dependency Walker và chỉ sử dụng các tùy chọn dòng lệnh để thực thi nó dưới dạng tiến trình con. Theo các câu hỏi thường gặp, nó hoạt động với các mô-đun Windows CE, mặc dù nó không chạy trên các thiết bị CE, do đó có thể không phù hợp với nhu cầu của bạn.

0

Sử dụng sự kiện AppDomain.AssemblyLoad.

ví dụ:

AppDomain.CurrentDomain.AssemblyLoad+=(s, e) => 
    Console.WriteLine("loaded: "+e.LoadedAssembly.FullName); 
+1

Thật không may là AssemblyLoad-Event không có sẵn trên Compact Framework. – Bob

0
public void LogAssemblies() 
{ 
    foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
    AssemblyName assemblyName = asm.GetName(); 
    string simpleName = assemblyName.Name; 
    string version = assemblyName.Version.ToString(); 
    // do something with these 
    } 
} 

EDIT: Woops, trông giống như AppDomain.GetAssemblies() không phải là trong khuôn khổ nhỏ gọn.

0

Tôi đoán một thuật toán thú vị sẽ được sắp xếp theo thứ tự các hội bạn đang sử dụng, sau đó, khi khởi động, bạn deserialize cấu hình của bạn và so sánh với phiên bản bạn có của mỗi DLL. Sau đó, khi cập nhật phiên bản, bạn tuần tự hóa một phiên bản mới của cấu hình của bạn và đăng nhập tên và phiên bản lắp ráp của bạn vào logfile của bạn.

Hãy nhớ rằng điều quan trọng nhất cần cân nhắc là có được những gì bạn cần làm. Không có gì khác quan trọng. Một khi nó làm công việc bạn yêu cầu, có lẽ có chỗ để cải thiện. Nhưng trước tiên, làm cho nó hoạt động! Bạn sẽ chỉ cần xem những gì cần phải được cải thiện sau đó.

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