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


169

Tôi đang cố gắng để có được phiên bản lắp ráp thực thi trong C # 3.0 bằng mã sau:

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

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

Câu trả lời:


293

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

Assembly.GetExecutingAssembly().GetName().Version

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

Application.ProductVersion

Sử dụng GetExecutingAssemblycho một tài liệu tham khảo lắp ráp không phải luôn luôn là một lựa chọn. Như vậy, cá nhân tôi thấy hữu ích khi tạo một lớp trình trợ giúp tĩnh trong các dự án mà tôi có thể cần tham chiếu phiên bản lắp ráp hoặc lắp ráp 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 chiếu sạch CoreAssembly.Versiontrong mã của mình theo yêu cầu.


7
Nếu nó được triển khai với ClickOnce, bạn cần kiểm traSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan

Điều gì sẽ thú vị: Bạn cần chỉ định phiên bản thực tế ở đâu? Tôi đã chỉ định Hội đồngVersion và Hội đồng hội thảo trong Hội nghị 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

@Zainodis Nếu bạn đang đề cập đến ClickOncephiên bản được đề cập bởi @Justin, thì nó được chỉ định trên Publishtab trong các thuộc tính của dự án (nghĩa là không liên quan đến AssociationVersion hoặc hộiFileVersion ).
Chris Baxter

@CachearyCoder cảm ơn vì đã phản hồi, tôi không biết ClickOnce là gì, nhưng nó đã bật ra khi chỉnh sửa tập tin hội đồng thông qua VS sau đó nó đột nhiên hoạt động oO. Chỉnh sửa lắp ráp thủ công trong trình soạn thảo văn bản làm cho tất cả các trường trở nên trống rỗng. Dù bằng cách nào, nó đã được giải quyết ngay bây giờ :)
AgentKnopf

7
Điều đáng nói là nó không hoạt động trong các ứng dụng ASP.NET MVC, vì bối cảnh khởi chạy. Một cách giải quyết là tham chiếu một Loại đã biết trong tập hợp trang web của bạn, ví dụ như MVC phổ biến HomeController, do đó, trong Dao cạo:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack

38

Trong MSDN, Phương thức Association.GetExecutingAssugging, nhận xét về phương thức "getexecutingassugging", vì lý do hiệu suất, bạn chỉ nên gọi phương thức này khi bạn không biết tại thời điểm thiết kế nào đang thực hiện lắp ráp.

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

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 rất giống với câu trả lời với lớp trình trợ giúp "lớp tĩnh công khai CoreAssugging", nhưng, nếu bạn biết ít nhất một loại thực thi lắp ráp, thì không bắt buộc phải tạo lớp trình trợ giúp và nó tiết kiệm thời gian của bạn.


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

Nhận xét từ MSDN http://msdn.microsoft.com/en-us/l Library / system.reflection.assinstall.getentryassugging% 28v = vs.110% 29.aspx :

Các GetEntryAssemblyphương pháp có thể trở lại nullkhi một quản lý lắp ráp đã đượ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 thể hiện của thành phần COM được viết bằng C #, thì một cuộc gọi đến GetEntryAssemblyphương thức từ thành phần C # trả về null, bởi vì điểm vào cho quy trình là mã không được quản lý thay vì lắp ráp được quản lý.


2
+1. GetEntryAssembly(vs GetCallingAssemblyhoặc GetExecutingAssembly) dường như là thứ duy nhất hoạt động khi được gọi từ trong thư viện tham chiếu.
drzaus

6

Điều này nên làm:

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

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

1

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

Có nguồn gốc từ sự kết hợp của nhiều nơi:

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

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


1

Product Version có thể được ưu tiên nếu bạn đang sử dụng phiên bản thông qua GitVersion hoặc phần mềm tạo phiên bản khác.

Để có được điều này từ trong thư viện lớp của bạn, bạn có thể gọi System.Diagnostics.FileVersionInfo.ProductVersion:

using System.Diagnostics;
using System.Reflection;

//...

var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion

nhập mô tả hình ảnh ở đây

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.