2009-07-17 32 views
19

Tôi đang thêm một hộp thoại Giới thiệu về ứng dụng .NET của mình và tôi đang truy vấn thuộc tính của assembly để hiển thị thông tin. Khi tôi cố gắng để lấy lắp ráp của tôi AssemblyVersionAttribute sử dụng GetCustomAttribute() nó trả null:GetCustomAttribute() trả về null cho AssemblyVersionAttribute

// Works fine 
AssemblyTitleAttribute title 
    = (AssemblyTitleAttribute)Attribute.GetCustomAttribute(
     someAssembly, typeof(AssemblyTitleAttribute)); 

// Gets null 
AssemblyVersionAttribute version 
    = (AssemblyVersionAttribute)Attribute.GetCustomAttribute(
     someAssembly, typeof(AssemblyVersionAttribute)); 

AssemblyInfo.cs My có vẻ tốt đẹp. Tôi có các thuộc tính này được xác định:

[assembly: AssemblyTitle("Some Application")] 
[assembly: AssemblyVersion("1.0.0.0")] 

Thỏa thuận là gì? Tôi có một cách giải quyết khác, nhưng tôi muốn biết tại sao mã trên không hoạt động.

// Work-around 
string version = someAssembly.GetName().Version.ToString(); 
+0

Nếu bạn đang ở trong WinForms, bạn chỉ có thể sử dụng 'Application.ProductVersion' – nawfal

Trả lời

17

Các AssemblyVersionAttribute không được thêm vào lắp ráp, nhưng được xử lý theo một cách "đặc biệt" bởi trình biên dịch (tức là nó đặt phiên bản lắp ráp)

Bạn có thể lấy thuộc tính AssemblyFileVersion (tức cái này được thêm vào hội đồng)

Có các thuộc tính khác thể hiện cùng một hành vi: AssemblyCultureAttributeAssemblyFlagsAttribute cũng được sử dụng để thiết lập thuộc tính lắp ráp và không được thêm vào lắp ráp làm thuộc tính tùy chỉnh.

Tất cả các thuộc tính này được liệt kê theo Thuộc tính danh tính hội trong tài liệu. Tài liệu nói về các thuộc tính này:

Ba thuộc tính, cùng với tên mạnh (nếu có), xác định danh tính của một hội đồng: tên, phiên bản và văn hóa.

+1

Dường như nó là được xử lý khác nhau vì nó thực sự được coi là "thuộc tính tùy chỉnh giả", không phải thuộc tính tùy chỉnh thông thường. –

7

Ví dụ của bạn không phải là công việc xung quanh. Đó là chính xác những gì các tài liệu MSDN tiểu bang bạn nên làm, dẫn tôi tin rằng mã là by-thiết kế.
http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx

Để có được tên [sic] của một assembly bạn đã nạp, gọi GetName về lắp ráp để có được một AssemblyName, và sau đó nhận được Version tài sản. Để lấy tên của một hội đồng mà bạn chưa tải, hãy gọi GetAssemblyName từ ứng dụng khách của bạn để kiểm tra phiên bản lắp ráp mà ứng dụng của bạn sử dụng.

5

Không chắc chắn lý do tại sao nó hoạt động theo cách này. Thay vì đi sau khi AssemblyVersionAttribute chúng tôi làm điều này:

Version AssemblyVersion = someAssembly.GetName().Version; 

Đối AssemblyFileVersion chúng tôi sử dụng:

Version fileVersion = new Version("0.0.0.0"); 
AssemblyFileVersionAttribute[] fileVersionAttributes = (AssemblyFileVersionAttribute[])assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true); 
if (fileVersionAttributes != null && fileVersionAttributes.Length > 0) { 
    fileVersion = new Version(fileVersionAttributes[0].Version); 
}