Lập trình lấy số phiên bản của một DLL


151

Có thể lấy số phiên bản theo chương trình từ bất kỳ .NET DLL nào không?

Nếu có, làm thế nào?


10
Không thể tin điều này đã được hỏi 6 phút trước, cũng sắp được hỏi như vậy!
sức mạnh

2
hãy xem liên kết này để biết phiên bản tăng tự động - blog.mbcharbonneau.com/2007/03/13/ mẹo
JL.

Câu trả lời:


119
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;

Quan trọng: Cần lưu ý rằng đây không phải là câu trả lời tốt nhất cho câu hỏi ban đầu. Đừng quên đọc thêm trên trang này.


28
Điều này tải MyAssugging.dll vào AppDomain đang chạy ... ý tưởng tồi.
staafl

12
Tôi khuyên bạn nên Assemblyname.GetAssemblyNametránh những vấn đề này
staafl

7
tải một tập hợp vào tên miền appd chậm, không thể đảo ngược (bạn không thể tải nó mà không giết tên miền), yêu cầu quyền và có thể gây ra tác dụng phụ, chẳng hạn như thực thi beforefieldinitkhởi tạo kiểu, và chỉ không bắt buộc trong trường hợp này. Những lý do này nghe có đủ không?
staafl

7
@staafl: Vâng; không chỉ cho tôi, mà còn cho tất cả những người khác đọc trang này trong tương lai.
Kris

6
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionthực hiện tốt công việc và không tải dll vào ứng dụng.
Jack

181

Điều này hoạt động nếu dll là .net hoặc Win32 . Các phương thức phản xạ chỉ hoạt động nếu dll là .net. Ngoài ra, nếu bạn sử dụng sự phản chiếu, bạn có khả năng tải toàn bộ dll vào bộ nhớ. Phương pháp dưới đây không tải lắp ráp vào bộ nhớ.

// Get the file version.
FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\MyAssembly.dll");

// Print the file name and version number.
Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' +
                  "Version number: " + myFileVersionInfo.FileVersion);

Từ: http://msdn.microsoft.com/en-us/l Library / system.diagnostics.fileversioninfo.fileversion.aspx

nguồn chính thức


5
Tôi thích điều này. Tại sao bạn lại bận tâm tải dll và sau đó sử dụng sự phản chiếu chỉ để có được phiên bản, khi tất cả những gì bạn thực sự muốn là đây ???
aggieNick02

@ben, bạn có thể chỉnh sửa bài viết không? Tôi thấy tôi đã mất -1 rep khi thêm downvote mà tôi không nhớ là đã làm gì. nó sẽ không cho phép tôi thay đổi nó, trừ khi bạn chỉnh sửa bài viết. chúc mừng
Luke Duddridge

9
Nếu bạn muốn chắc chắn rằng bạn nhận được tệp thực thi / dll hiện đang sử dụng: thay vì tên tệp tĩnh ( @"C:\MyAssembly.dll"ở trên), bạn có thể sử dụng System.Reflection.Assembly.GetExecutingAssembly().Location(hoặc nếu là một dll Assembly.GetAssembly(typeof(AClassInTheDll)).Location:)
Conrad

4
Đó là sự khác biệt giữa các thuộc tính AssociationVersion và AssociationFileVersion. Hội đồng hội thảo được đóng dấu theo cách như API Windows có thể nhận được giá trị. Hội đồng hội thảo là một phần của tên mạnh và không nhất thiết phải giống như Hội đồng hội thảo.
daughey 17/2/2017

51

Trước hết, có hai 'phiên bản' có thể bạn có thể quan tâm:

  • Phiên bản tệp hệ thống tệp Windows, áp dụng cho tất cả các tệp thi hành

  • Phiên bản xây dựng hội, được trình biên dịch nhúng vào một trình biên dịch .NET (rõ ràng chỉ áp dụng cho các tập tin dll và exe của tập hợp .NET)

Trong trường hợp trước, bạn nên sử dụng câu trả lời của Ben Anderson; trong trường hợp sau, hãy sử dụng AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Versionhoặc trả lời của Tataro, trong trường hợp lắp ráp được tham chiếu bởi mã của bạn.

Lưu ý rằng bạn có thể bỏ qua tất cả các câu trả lời sử dụng .Load()/ .LoadFrom()phương thức, vì những câu này thực sự tải tập hợp trong AppDomain hiện tại - tương tự như việc chặt cây để xem nó bao nhiêu tuổi.


32

Đây là một cách hay để sử dụng một chút sự phản chiếu để có được một phiên bản của DLL chứa một lớp cụ thể:

var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;

Chỉ cần thay thế! Đẳng cấp! với tên của một lớp được định nghĩa trong DLL mà bạn muốn lấy phiên bản của.

Đây là phương pháp ưa thích của tôi bởi vì nếu tôi di chuyển các DLL xung quanh cho các triển khai khác nhau, tôi không phải thay đổi filepath.


3
Lưu ý rằng điều này chỉ hoạt động nếu lắp ráp trong câu hỏi được tham chiếu tĩnh bởi cái hiện tại.
staafl

2
Đây là câu trả lời tốt nhất vì DLL không nhất thiết là hội đồng nhập cảnh thậm chí không phải là hội đồng này được gọi từ
CAD bloke

1
Xem stackoverflow.com/a/909583/492 để biết các loại thông tin phiên bản khác nhau. ví dụFileVersionInfo
CAD bloke

22

Để có được nó cho hội đồng đã được bắt đầu (winform, ứng dụng bảng điều khiển, v.v ...)

using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version

6
GetExecutingAssugging () cũng có thể giúp đỡ.
Bolt Thunder

10

Kris, phiên bản của bạn hoạt động rất tốt khi cần tải tập hợp từ tệp DLL thực (và nếu DLL ở đó!), Tuy nhiên, người ta sẽ gặp một lỗi không mong muốn nếu DLL là EMBEDDED (nghĩa là không phải tệp mà là nhúng DLL).

Một điều khác là, nếu một người sử dụng sơ đồ tạo phiên bản với cái gì đó như " 1.2012.0508.0101 ", khi một người có chuỗi phiên bản, bạn sẽ thực sự nhận được " 1.2012.518.101 "; lưu ý các số không bị thiếu .

Vì vậy, đây là một vài chức năng bổ sung để có phiên bản của DLL (được nhúng hoặc từ tệp DLL):

    public static System.Reflection.Assembly GetAssembly(string pAssemblyName)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if (string.IsNullOrEmpty(pAssemblyName)) { return tMyAssembly; }
        tMyAssembly = GetAssemblyEmbedded(pAssemblyName);
        if (tMyAssembly == null) { GetAssemblyDLL(pAssemblyName); }

        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)


    public static System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if(string.IsNullOrEmpty(pAssemblyDisplayName)) { return tMyAssembly; }
        try //try #a
        {
            tMyAssembly = System.Reflection.Assembly.Load(pAssemblyDisplayName);
        }// try #a
        catch (Exception ex)
        {
            string m = ex.Message;
        }// try #a
        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)


    public static System.Reflection.Assembly GetAssemblyDLL(string pAssemblyNameDLL)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if (string.IsNullOrEmpty(pAssemblyNameDLL)) { return tMyAssembly; }
        try //try #a
        {
            if (!pAssemblyNameDLL.ToLower().EndsWith(".dll")) { pAssemblyNameDLL += ".dll"; }
            tMyAssembly = System.Reflection.Assembly.LoadFrom(pAssemblyNameDLL);
        }// try #a
        catch (Exception ex)
        {
            string m = ex.Message;
        }// try #a
        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyFile(string pAssemblyNameDLL)


    public static string GetVersionStringFromAssembly(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssembly(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)


    public static string GetVersionString(Version pVersion)
    {
        string tVersion = "Unknown";
        if (pVersion == null) { return tVersion; }
        tVersion = GetVersionString(pVersion.ToString());
        return tVersion;
    }//string GetVersionString(Version pVersion)


    public static string GetVersionString(string pVersionString)
    {
        string tVersion = "Unknown";
        string[] aVersion;

        if (string.IsNullOrEmpty(pVersionString)) { return tVersion; }
        aVersion = pVersionString.Split('.');
        if (aVersion.Length > 0) { tVersion = aVersion[0]; }
        if (aVersion.Length > 1) { tVersion += "." + aVersion[1]; }
        if (aVersion.Length > 2) { tVersion += "." + aVersion[2].PadLeft(4, '0'); }
        if (aVersion.Length > 3) { tVersion += "." + aVersion[3].PadLeft(4, '0'); }

        return tVersion;
    }//string GetVersionString(Version pVersion)


    public static string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssemblyEmbedded(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)


    public static string GetVersionStringFromAssemblyDLL(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssemblyDLL(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)


2

Trả lời bởi @Ben tỏ ra hữu ích cho tôi. Nhưng tôi cần kiểm tra phiên bản sản phẩm vì đó là sự gia tăng chính xảy ra trong phần mềm của tôi và tuân theo phiên bản ngữ nghĩa.

myFileVersionInfo.ProductVersion

Phương pháp này đáp ứng mong đợi của tôi

Cập nhật: Thay vì đề cập rõ ràng đường dẫn dll trong chương trình (khi cần trong phiên bản sản xuất), chúng tôi có thể nhận phiên bản sản phẩm bằng cách sử dụng hội.

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location); 
string ProdVersion= fileVersionInfo.ProductVersion;

Lưu ý: nếu phiên bản chứa dấu hoa thị cho giá trị tăng tự động, phương thức này sẽ trả về dấu hoa thị thay vì số được tạo thực tế (nghĩa là không hoạt động nếu bạn đặt 1.0. * Trong thông tin lắp ráp của bạn).
Ronen Ness

Đúng! Tuy nhiên, tôi đã chọn tự động hóa Jeniks để nâng cấp phiên bản để lắp ráp luôn có sự kết hợp hoàn hảo của phiên bản dll.
Prasan Dutt

1

Bạn có thể sử dụng các phương thức System.Reflection.Ass lanh.Load * () và sau đó lấy hội nghịInInfo của họ.


0

Mặc dù câu hỏi ban đầu có thể không dành riêng cho dịch vụ web, đây là một dịch vụ thử nghiệm hoàn chỉnh mà bạn có thể thêm để hiển thị phản hồi không được lưu trong bộ nhớ cache của dịch vụ web cộng với phiên bản tệp. Chúng tôi sử dụng phiên bản tệp thay vì phiên bản lắp ráp vì chúng tôi muốn biết một phiên bản, nhưng với tất cả các phiên bản lắp ráp 1.0.0.0, trang web có thể dễ dàng được vá (liên kết ký và yêu cầu vẫn hoạt động!). Thay thế @ Class @ bằng tên của trình điều khiển api web, dịch vụ này được nhúng vào. Thật tốt cho việc truy cập / nogo trên dịch vụ web cộng với kiểm tra phiên bản nhanh.

  [Route("api/testWebService")]
  [AllowAnonymous]
  [HttpGet]
  public HttpResponseMessage TestWebService()
  {
      HttpResponseMessage responseMessage = Request.CreateResponse(HttpStatusCode.OK);
      string loc = Assembly.GetAssembly(typeof(@Class@)).Location;
      FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(loc);
      responseMessage.Content = new StringContent($"<h2>The XXXXX web service GET test succeeded.</h2>{DateTime.Now}<br/><br/>File Version: {versionInfo.FileVersion}");
      responseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
      Request.RegisterForDispose(responseMessage);
      return responseMessage;
  }

Tôi thấy cũng cần phải thêm các mục sau vào web.config theo cấu hình để làm cho nó thực sự ẩn danh

<location path="api/testwebservice">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>
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.