Làm thế nào tôi có thể có được phiên bản tập tin lắp ráp


727

Trong AssemblyInfođó có hai phiên bản lắp ráp:

  1. AssemblyVersion: Chỉ định phiên bản lắp ráp được quy kết.
  2. AssemblyFileVersion: Hướng dẫn trình biên dịch sử dụng số phiên bản cụ thể cho tài nguyên phiên bản tệp Win32. Phiên bản tệp Win32 không bắt buộc phải giống với số phiên bản của tổ hợp.

Tôi có thể nhận được Assembly Versionvới dòng mã sau đây:

Version version = Assembly.GetEntryAssembly().GetName().Version;

Nhưng làm thế nào tôi có thể nhận được Assembly File Version?


2
Bạn có ý nghĩa gì bởi "phiên bản tập tin lắp ráp" trái ngược với "phiên bản tập hợp"? Bạn có thể đưa ra một ví dụ không?
Xiaofu

7
@Xiaofu - "Phiên bản hội" là những gì .NET sử dụng nội bộ. "Phiên bản tệp hội" là nội dung hiển thị khi bạn nhấp chuột phải vào tệp và chuyển đến "thuộc tính" rồi đến tab "chi tiết". Chúng không giống nhau.
rory.ap

Tôi đã thấy rằng phiên bản lắp ráp là những gì được sử dụng khi xác định vị trí user.config trong AppData.
Kyle Delaney

Câu trả lời:


867

Xem bình luận của tôi ở trên yêu cầu làm rõ về những gì bạn thực sự muốn. Hy vọng rằng đây là nó:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;

4
@Xiaofu: Có cách nào để lấy số phiên bản từ tệp AssociationInfo.cs không?
Markus

56
Một vấn đề với mã này là, nó thực sự sẽ trả về 1.0. *. * Nếu bạn chưa chỉ định số Xây dựng và Sửa đổi. AssociationName.GetAssuggingName (assembly.Location) .Version.ToString (); sẽ giúp bạn có số phiên bản 'được biên dịch' - giống với FileVersion, nếu bạn đặt cả hai phiên bản theo cùng một cách.
Doguhan Uluca

17
@DoguhanUluca Chúng là hai thứ khác nhau. Điều đó sẽ cung cấp cho bạn phiên bản lắp ráp, không phải phiên bản tệp. "Nếu bạn đặt cả hai phiên bản theo cùng một cách" là một cách giải quyết, không phải là một giải pháp.
Nyerguds

1
FileVersionInfochỉ có stringtài sản và không có Versiontài sản?
Kyle Delaney

3
@Yitzchak: Assembly.GetEntryAssembly()trả về NULL chẳng hạn trong ngữ cảnh bổ trợ Office và cả trong nhiều trường hợp khác. Ngoài ra, nếu bạn nghĩ về addins / plugin - EntryAssugging là ứng dụng máy chủ và thông thường bạn muốn có phiên bản YourCode (TM) :) Ngoài ra, cũng đáng để thêm vào câu trả lời này assembly.Locationđược sử dụng trong câu trả lời cũng có thể là null (tức là trường hợp ngẫu nhiên đầu tiên được tách ra: github.com/Azure/azure-fifts-host/issues/1233 ) và điều đó có thể xảy ra thậm chí còn thường xuyên hơn so với việc lắp ráp null.
quetzalcoatl

209

ba phiên bản : lắp ráp , tập tinsản phẩm . Chúng được sử dụng bởi các tính năng khác nhau và đảm nhận các giá trị mặc định khác nhau nếu bạn không chỉ định rõ ràng chúng.

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;

17
Vì khi bài viết trên blog biến mất một ngày nào đó, ở đây nó được ghi lại để tham khảo:string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
JMD

3
Và đối với những người muốn chỉ định các mục này trong tệp [assembly: AssemblyVersion("2.0.*")]AssociationInfo.cs , để sử dụng assemblyVersion (với bất kỳ số nào bạn muốn) === cho fileVersion sử dụng === [assembly: AssemblyFileVersion("2.0.*")]và cho sản phẩmVersion sử dụng === [assembly: AssemblyInformationalVersion("2.0.*")] Cái cuối cùng có thể có hậu tố chuỗi để SemVertương thích:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm

Phụ lục: AssemblyFileVersioncó thể không sử dụng *ký hiệu hậu tố. :( Nó cần tất cả bốn số.[assembly: AssemblyFileVersion("2.0.0.1")]
Jesse Chisholm

66

Khi tôi muốn truy cập phiên bản tệp ứng dụng (những gì được đặt trong Thông tin lắp ráp -> Phiên bản tệp), hãy nói để đặt văn bản của nhãn thành tải trên biểu mẫu để hiển thị phiên bản, tôi vừa sử dụng

versionlabel.Text = "Version " + Application.ProductVersion;

53
Lưu ý rằng điều này yêu cầu tham chiếu đến System.Windows.Forms và do đó có thể không phù hợp với tất cả các ứng dụng.
BradleyDotNET

2
Thật không may, đó là một chuỗi. Không lý tưởng nếu bạn muốn tự định dạng nó thành một loại định dạng "v1,08" đơn giản hơn. Xử lý nhiều hơn nếu bạn thực sự có được đối tượng phiên bản để lấy các thành phần phụ từ dưới dạng số nguyên.
Nyerguds

1
Ngoài ra, điều này nhặt lên
AssociationFileVersion từ AssociationInfo

Người dùng đại diện cao có thể chỉnh sửa câu trả lời này để làm rõ hơn rằng đây chỉ dành cho Windows Forms không?
jrh

Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn câu trả lời!
David Refoua

23

CẬP NHẬT: Như Richard Grimes đã đề cập trong bài đăng được trích dẫn của tôi , @Iain và @Dmitry Lobanov, câu trả lời của tôi là đúng trong lý thuyết nhưng sai trong thực tế.

Như tôi đã nhớ từ vô số sách, v.v., trong khi người ta thiết lập các thuộc tính này bằng cách sử dụng [assembly: XXXAttribute], chúng sẽ được trình biên dịch đánh dấu và đặt vào VERSIONINFOtài nguyên.

Vì lý do trên, bạn cần sử dụng cách tiếp cận trong câu trả lời của @ Xiaofu vì các thuộc tính bị tước sau khi tín hiệu được trích xuất từ ​​chúng.


chuỗi tĩnh công khai Get SẢNtVersion ()
{
  var property = (AssociationVersionAttribution) Hội
    .GetExecutingAssugging ()
    .GetCustomAttribut (typeof (AssociationVersionAttribution), true)
    .Độc thân();
   trả về thuộc tính.InôngalVersion;
}

(Từ http://bytes.com/groups/net/420417-assuggingversionattribution - như đã lưu ý ở đó, nếu bạn đang tìm kiếm một thuộc tính khác, hãy thay thế nó vào phần trên)


Này Ruben, 2 ghi chú. Đầu tiên, câu hỏi được yêu cầu cho hộiFileVersion chứ không phải hội nghị. Thứ hai, hội đồng.GetExecutingAssugging ()
Iain

Điểm đầu tiên, đó là lý do tại sao tôi nói "nếu bạn đang tìm kiếm một thuộc tính khác, hãy thay thế nó ở trên" (IIRC tôi đã không thử nó). Lần thứ hai, điều đó có vẻ hợp lý nhưng không có thời gian để tìm hiểu ...
Ruben Bartelink

Vâng, bạn thực sự không thể có được thuộc tính AssociationVersion thông qua .GetCustomAttribution (), phiên bản lắp ráp chỉ có thể được truy xuất thông qua thuộc AssemblyName.Versiontính. Nhưng với mọi thuộc tính khác, đó là cách đúng đắn để làm điều đó
Dmitrii Lobanov

@DmitryLobanov và Iain Cảm ơn bạn đã nhắc nhở. Tôi hy vọng bản chỉnh sửa bao gồm đủ để đưa ra câu trả lời đáng để giữ thay vì xóa - hãy cho tôi biết!
Ruben Bartelink

1
Tôi đã sử dụng AssemblyInformationalVersionAttributethay vì AssemblyVersionAttributetrên .net core 3.1
Vasya Milovidov

5

Dùng cái này:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

Hoặc này:

new Version(System.Windows.Forms.Application.ProductVersion);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.