2011-02-09 28 views
132

Tôi cố gắng để có được phiên bản lắp ráp thực hiện trong 3,0 C# sử dụng đoạn mã sau:Làm cách nào để có phiên bản lắp ráp?

var assemblyFullName = Assembly.GetExecutingAssembly().FullName; 
var version = assemblyFullName .Split(',')[1].Split('=')[1]; 

Có một cách khác để thích hợp làm như vậy?

Trả lời

231

Hai tùy chọn ... bất kể loại ứng dụng mà bạn luôn có thể gọi:

Assembly.GetExecutingAssembly().GetName().Version 

Nếu một ứng dụng Windows Forms, bạn luôn có thể truy cập thông qua ứng dụng nếu tìm cách cụ thể cho phiên bản sản phẩm.

Application.ProductVersion 

Sử dụng GetExecutingAssembly để tham chiếu lắp ráp không phải lúc nào cũng là tùy chọn. Như vậy, cá nhân tôi thấy nó hữu ích để tạo ra một lớp helper tĩnh trong các dự án mà tôi có thể cần phải tham khảo các lắp ráp hoặc lắp ráp phiên bản cơ bản:

// A sample assembly reference class that would exist in the `Core` project. 
public static class CoreAssembly 
{ 
    public static readonly Assembly Reference = typeof(CoreAssembly).Assembly; 
    public static readonly Version Version = Reference.GetName().Version; 
} 

Sau đó, tôi có thể tham khảo sạch CoreAssembly.Version trong mã của tôi theo yêu cầu.

+5

Nếu nó được triển khai với ClickOnce, bạn cần phải kiểm tra 'System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion' –

+0

sẽ gì thú vị: Bạn cần chỉ định phiên bản thực tế ở đâu? Tôi đã chỉ định AssemblyVersion và AssemblyFileVersion trong AssemblyInfo.cs của tôi và tất cả những gì tôi nhận được từ cuộc gọi abovemethod là: 0.0.0.0 mặc dù đã chỉ định 1.0.0 – AgentKnopf

+0

@Zainodis Nếu bạn đang tham chiếu đến phiên bản 'ClickOnce' được đề cập bởi @Justin, nó là được xác định trên tab 'Publish' trong thuộc tính dự án (nghĩa là không liên quan đến AssemblyVersion hoặc AssemblyFileVersion). –

5

này nên làm:

Assembly assem = Assembly.GetExecutingAssembly(); 
AssemblyName aName = assem.GetName(); 
return aName.Version.ToString(); 
+4

3 dòng này có thể trở thành 1: return Assembly.GetExecutingAssembly(). GetName(). Version.ToString(); ............. – Alexandre

17
using System.Reflection; 
{ 
    string version = Assembly.GetEntryAssembly().GetName().Version.ToString(); 
} 

Các chú thích từ MSDN http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly%28v=vs.110%29.aspx:

Phương pháp GetEntryAssembly có thể trở lại null khi một hội đồng quản lý đã được tải từ một ứng dụng không được quản lý. Ví dụ, nếu một ứng dụng không được quản lý tạo ra một cá thể của một thành phần COM được viết bằng C#, một cuộc gọi đến phương thức GetEntryAssembly từ thành phần C# trả về null, vì điểm nhập cho quá trình không được quản lý mã thay vì một assembly được quản lý.

+2

+1. 'GetEntryAssembly' (vs' GetCallingAssembly' hoặc 'GetExecutingAssembly') có vẻ là thứ duy nhất hoạt động khi được gọi từ bên trong một thư viện tham chiếu. – drzaus

29

Trong MSDN, Assembly.GetExecutingAssembly Method, là nhận xét về phương pháp "GetExecutingAssembly", rằng vì lý do hiệu suất, bạn nên gọi phương pháp này chỉ khi bạn không biết lúc thiết kế những gì lắp ráp hiện đang thực hiện.

Cách được đề xuất để truy xuất đối tượng Assembly đại diện cho assembly hiện tại là sử dụng thuộc tính Type.Assembly của một loại được tìm thấy trong assembly.

Ví dụ sau minh họa:

using System; 
using System.Reflection; 

public class Example 
{ 
    public static void Main() 
    { 
     Console.WriteLine("The version of the currently executing assembly is: {0}", 
          typeof(Example).Assembly.GetName().Version); 
    } 
} 

/* This example produces output similar to the following: 
    The version of the currently executing assembly is: 1.1.0.0 

Tất nhiên điều này là rất giống với câu trả lời với lớp helper "public class tĩnh CoreAssembly", nhưng, nếu bạn biết ít nhất một loại thực hiện lắp ráp, nó isn không bắt buộc phải tạo lớp trợ giúp và tiết kiệm thời gian của bạn.

+0

Tốt hơn nhiều so với các câu trả lời khác bằng GetExecutingAssembly –

1

Cuối cùng tôi đã giải quyết trên typeof(MyClass).GetTypeInfo().Assembly.GetName().Version cho ứng dụng netstandard1.6. Tất cả các câu trả lời được đề xuất khác trình bày một giải pháp từng phần. Đây là điều duy nhất đã cho tôi chính xác những gì tôi cần.

Có nguồn gốc từ sự kết hợp giữa nơi:

https://msdn.microsoft.com/en-us/library/x4cw969y(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/2exyydhb(v=vs.110).aspx

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