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?
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?
Câu trả lời:
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.
Assemblyname.GetAssemblyName
tránh những vấn đề này
beforefieldinit
khở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?
FileVersionInfo.GetVersionInfo("foo.dll").FileVersion
thực hiện tốt công việc và không tải dll vào ứng dụng.
Đ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
@"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
:)
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").Version
hoặ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.
Đâ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.
FileVersionInfo
Để 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
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)
var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName);
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;
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>