2013-02-14 11 views
7

tập tin AssemblyInfo.cs có thuộc tính AssemblyVersion, nhưng khi tôi chạy như sau:tại sao tôi không thể tải thuộc tính AssemblyVersion bằng cách sử dụng phản chiếu?

Attribute[] y = Assembly.GetExecutingAssembly().GetCustomAttributes(); 

tôi nhận được:

System.Runtime.InteropServices.ComVisibleAttribute 
System.Runtime.CompilerServices.RuntimeCompatibilityAttribute 
System.Runtime.CompilerServices.CompilationRelaxationsAttribute 
System.Runtime.InteropServices.GuidAttribute 

System.Diagnostics.DebuggableAttribute 

System.Reflection.AssemblyTrademarkAttribute 
System.Reflection.AssemblyCopyrightAttribute 
System.Reflection.AssemblyCompanyAttribute 
System.Reflection.AssemblyConfigurationAttribute 
System.Reflection.AssemblyFileVersionAttribute 
System.Reflection.AssemblyProductAttribute 
System.Reflection.AssemblyDescriptionAttribute 

nhưng tôi đã kiểm tra không biết bao nhiêu lần so với thuộc tính này hiện diện trong tôi mã:

[assembly: AssemblyVersion("5.5.5.5")] 

... và nếu tôi cố gắng truy cập vào nó trực tiếp tôi nhận được một ngoại lệ:

Attribute x = Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyVersionAttribute)); //exception 

Tôi đoán tôi sẽ không thể sử dụng thuộc tính đó, nhưng tại sao .NET không đọc nó?

+0

Bạn đang cố gắng làm gì? 'Assembly' đã có thuộc tính' Version'. – ashes999

+0

bạn có chắc chắn không? Tôi thấy không phải là một tài sản tĩnh hoặc dụ với tên đó –

+1

Bạn sẽ phải sử dụng 'GetName()' ví dụ 'var y = Assembly.GetExecutingAssembly(). GetName(). Version;' –

Trả lời

4

tôi sẽ lặp lại comment Hans passant của:

[AssemblyVersion] là một việc thực sự lớn trong .NET. Trình biên dịch xử lý các thuộc tính đặc biệt, nó sử dụng nó khi nó tạo ra siêu dữ liệu của assembly. Và không thực sự phát ra thuộc tính, điều đó sẽ làm điều đó hai lần. Sử dụng AssemblyName.Version thay vào đó, như được hiển thị.

8

Nếu bạn đang cố gắng để chỉ có được phiên bản lắp ráp, nó khá thẳng về phía trước:

Console.WriteLine("The version of the currently executing assembly is: {0}", Assembly.GetExecutingAssembly().GetName().Version); 

Khách sạn là một loại System.Version, trong đó có Major, Minor, Build, và Revision tài sản.

Ví dụ: một hội đồng các phiên bản 1.2.3.4 có:

  • Major = 1
  • Minor = 2
  • Build = 3
  • Revision = 4
0

(chỉ để khỏa lấp những hương vị nhận được một phiên bản ...)

Nếu bạn đang cố gắng để có được tệp thông tin phiên bản trên một lắp ráp tùy ý (nghĩa là không phải một lần tải/chạy), bạn có thể sử dụng FileVersionInfo - tuy nhiên, lưu ý rằng điều này có thể không giống nhau AssemblyVersion được chỉ định trong siêu dữ liệu:

var filePath = @"c:\path-to-assembly-file"; 
FileVersionInfo info = FileVersionInfo.GetVersionInfo(filePath); 

// the following two statements are roughly equivalent 
Console.WriteLine(info.FileVersion); 
Console.WriteLine(string.Format("{0}.{1}.{2}.{3}", 
     info.FileMajorPart, 
     info.FileMinorPart, 
     info.FileBuildPart, 
     info.FilePrivatePart)); 
+0

Đó là [AssemblyFileVersion]. –

+0

@HansPassant Ah, điểm tốt; có * là * một sự khác biệt tiềm năng giữa phiên bản tập tin và phiên bản "lắp ráp" nhận được thông qua phản ánh ... mặc dù người ta có thể tranh luận rằng họ * nên * giống nhau ... :) – JerKimball

+2

@ JerKimball tôi không đồng ý về họ cần phải giống nhau. Fileversion không gây ra sự khác biệt nào cho assembly, nếu bạn có một assembly đã được ký và cần giữ mọi thứ hoạt động giống nhau, bạn có thể tăng Fileversion của mình và vẫn cho phép các dự án cũ làm việc với assembly "cố định" (với cùng phiên bản) –