2011-10-14 16 views

Trả lời

53
using System.Reflection.Assembly 
using System.Diagnostics.FileVersionInfo 

// ... 

public string GetInformationalVersion(Assembly assembly) { 
    return FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion; 
} 
+0

Xem http://stackoverflow.com/a/19008850/116895 – lance

+7

Lưu ý rằng mã này không hoạt động nếu assembly không được tải từ tập tin hoặc UNC. Điều này có thể là trường hợp nếu assembly được nhúng vào một assembly khác (thường là khi các obfuscating assemblies) hoặc vì một số lý do khác đã được nạp bằng cách sử dụng 'Assembly.Load (byte [])' – larsmoa

+2

Cũng không hoạt động nếu bạn đã 'mkbundle ''d ứng dụng của bạn cho Mono – Cocowalla

34
var attr = Assembly 
    .GetEntryAssembly() 
    .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false) 
    as AssemblyInformationalVersionAttribute[]; 

Đây là một mảng của AssemblyInformationalVersionAttribute. Nó không bao giờ rỗng ngay cả khi không có thuộc tính của kiểu tìm kiếm.

var attr2 = Attribute 
    .GetCustomAttribute(
     Assembly.GetEntryAssembly(), 
     typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute; 

Điều này có thể không có giá trị nếu thuộc tính không có mặt.

var attr3 = Attribute 
    .GetCustomAttributes(
     Assembly.GetEntryAssembly(), 
     typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute[]; 

Tương tự như trước.

+1

+1; nhưng bạn có thể sử dụng 'GetCustomAttribute' thay vì' GetCustomAttributes' nếu bạn biết rằng sẽ chỉ có một thuộc tính. – vcsjones

+3

@vcsjones Chỉ bằng cách sử dụng phương thức tĩnh của 'Attribute', không sử dụng phương thức instance của' Assembly' – xanatos

+1

Trong một số trường hợp, 'Assembly.GetEntryAssembly()' nên được thay thế bằng 'Assembly.GetExecutingAssembly()' hoặc 'Assembly. GetCallingAssembly() '. Thông thường điều này là cần thiết nếu assembly là một plugin - trong trường hợp này 'GetEntryAssembly()' sẽ trả về assembly ứng dụng host. – larsmoa

7
AssemblyInformationalVersionAttribute attribute = 
    (AssemblyInformationalVersionAttribute)Assembly.GetExecutingAssembly() 
    .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault(); 

if (attribute != null) 
    Console.WriteLine(attribute.InformationalVersion); 
+0

+1 vì điều này cũng hoạt động với Silverlight hoặc Xbox Lakeview! – ahilsend

10

Thậm chí nếu câu hỏi là một chút cũ:

Tôi đề nghị một giải pháp khác nhau mà làm việc cho tôi:

Application.ProductVersion 
+4

Tôi đã có một thời gian khó tìm kiếm nó trong WPF, nó là lớp ứng dụng Winforms. :-) – Wouter

3

Để bổ sung cho câu trả lời lance: Bạn có thể sử dụng Application.ResourceAssembly.Location để tìm ra đường dẫn tập tin của hội đồng của bạn. Với điều này nó có thể để có được những chuỗi AssemblyInformationalVersion chỉ trong một dòng

System.Diagnostics.FileVersionInfo.GetVersionInfo(Application.ResourceAssembly.Location).ProductVersion 
8

Sử dụng một loại gọi trong ứng dụng của bạn, bạn chỉ có thể làm điều này:

using System.Reflection; 

public static readonly string ProductVersion = typeof(MyKnownType).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion; 

Tất nhiên bất kỳ quá trình bạn sử dụng để có được lắp ráp thuộc tính của bạn được áp dụng cho là tốt. Lưu ý rằng điều này không dựa trên System.Diagnostics hoặc đối tượng Application của WinForm.

0

Building tắt của @ câu trả lời Aerthal, nếu bạn muốn có một lót để có được những AssemblyInformationalVersionAttribute từ một MVC Razor View:

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion 
Các vấn đề liên quan