2009-08-08 42 views
31

Tôi muốn có thể hiển thị phiên bản hiện tại của ứng dụng .NET mà tôi đã triển khai bằng thuật sĩ xuất bản. Có một tùy chọn tốt để tự động cập nhật số phiên bản mỗi khi tôi xuất bản ứng dụng của mình.Làm cách nào để tải phiên bản đã xuất bản hiện tại trong ứng dụng .NET?

tôi tìm thấy một câu hỏi khác (Automatically update version number) mà có này để có được phiên bản hiện tại:

Assembly.GetExecutingAssembly().GetName().Version 

này giúp bạn phiên bản mà bạn thiết lập trong các thuộc tính dự án, nhưng không phải là phiên bản được tự động tăng lên mỗi thời gian bạn xuất bản.

+1

Bạn có thể đủ điều kiện khẳng định rằng bằng cách nào đó? GetExecutingAssembly() GetName() Phiên bản hoạt động tốt trên các phiên bản phát hành –

+1

Có lẽ tôi muốn xuất bản và không triển khai. Tôi có thể thay đổi điều đó trong câu hỏi. Khi tôi chạy qua trình hướng dẫn xuất bản, nó sẽ tự động cập nhật phiên bản xuất bản. Trong mã nó được gọi là phiên bản đã triển khai. –

Trả lời

43

Tôi đã kết thúc bằng cách sử dụng chút mã này để có được phiên bản được triển khai hiện tại hoặc nếu nó không được triển khai phiên bản lắp ráp hiện tại.

private Version GetRunningVersion() 
{ 
    try 
    { 
    return Application.ApplicationDeployment.CurrentDeployment.CurrentVersion; 
    } 
    catch 
    { 
    return Assembly.GetExecutingAssembly().GetName().Version; 
    } 
} 

Tôi phải thêm tài liệu tham khảo vào System.DeploymentSystem.Reflection.

+5

Bạn không phải sử dụng khối try/catch bị hack đó. Bạn có thể kiểm tra xem ứng dụng của bạn có được triển khai 'ApplicationDeployment.IsNetworkDeployed' –

+1

' ApplicationDeployment.IsNetworkDeployed' ném một ngoại lệ nếu nó không chạy như một ứng dụng ClickOnce và kết quả có thể đóng toàn bộ ứng dụng. Bạn muốn thử bắt - nếu không bạn đang làm hại cho người dùng hiện tại và/hoặc tương lai. –

+0

Sau khi thêm ApplicationDeployment.IsNetworkDeployed, tôi chưa bao giờ thấy ngoại lệ nữa. Chỉ khi truy cập vào lớp CurrentDeployment. –

46

Bạn có thể sử dụng thử nghiệm sau

if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed) { 
    return System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion; 
} 

để tránh sự ngoại lệ (như chi tiết trong this post).

Ngoài ra, tôi không nghĩ bạn có thể tải phiên bản xuất bản hiện tại qua gỡ lỗi Visual Studio vì việc truy cập CurrentDeployment sẽ ném một số InvalidDeploymentException.

+3

Tôi thích phương pháp này hơn câu trả lời được chấp nhận. Câu trả lời được chấp nhận không phân biệt về ngoại lệ mà nó xử lý. Nó thường là thực hành xấu để làm cho xử lý ngoại lệ quét. – Daniel

+1

Tương tự như vậy. Nó cũng không hoàn nguyên tùy ý phiên bản lắp ráp; nó không thể so sánh với phiên bản triển khai, vì vậy nó không nên được sử dụng như một dự phòng. – Ashe

-1
Imports System.Configuration 
Public Function GetAppVersion() As String 
    Dim ass As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly() 
    Dim ver As System.Version = ass.GetName().Version 
    Return ver.Major & "." & ver.Minor & "." & ver.Revision 
End Function 
+2

-1 điều này giống với câu hỏi –

+0

Không chỉ là câu hỏi, nhưng điều quan trọng cần lưu ý là việc này lấy phiên bản ứng dụng KHÔNG phải là phiên bản xuất bản.Tôi có nó thiết lập để tự động gia tăng trên một AddIn Excel, do đó, mỗi xuất bản đi ra 1.0.0.138 hoặc một cái gì đó tương tự trong khi mã trên trả về 1.0.0.0 được thiết lập dưới tab thuộc tính. –

1

Có trụ sở tại câu trả lời từ Jason, tôi đã kết thúc với điều này:

Add Reference để System.Deployment.

string versionDeploy = Application.ProductVersion;    
if (System.Diagnostics.Debugger.IsAttached) 
{ 
    this.lblVersion.Caption = string.Format("Versión {0} DESA", versionDeploy); 
} 
else 
{ 
    if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed) 
    { 
     Version Deploy = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion; 
     versionDeploy = string.Format("{0}.{1}.{2}.{3}", Deploy.Major, Deploy.Minor, Deploy.Build, Deploy.Revision); 
    } 
    this.lblVersion.Caption = string.Format("Versión {0} PROD", versionDeploy); 
} 

Hy vọng điều đó sẽ hữu ích.

2

Tôi đã từng làm theo giải pháp cho vấn đề này, và nó đang làm việc cho tôi:

DataSet ds = new DataSet(); 
ds.ReadXml(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "MyProd.application")); 
DataTable dt = new DataTable(); 
if (ds.Tables.Count > 1) { 
    dt = ds.Tables[1]; 
    MessageBox.Show(dt.Rows[0]["version"].ToString()); 
} 
+0

Upvote vì nó đơn giản và hoạt động nhẹ, trong khi, thậm chí MS cũng không cung cấp cách tốt để truy cập. –

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