Apakah mungkin untuk mendapatkan nomor versi secara terprogram dari. NET DLL?
Jika ya, bagaimana?
Apakah mungkin untuk mendapatkan nomor versi secara terprogram dari. NET DLL?
Jika ya, bagaimana?
Jawaban:
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;
Penting: Perlu dicatat bahwa ini bukan jawaban terbaik untuk pertanyaan awal. Jangan lupa membaca lebih lanjut di halaman ini.
Assemblyname.GetAssemblyNameuntuk menghindari masalah ini
beforefieldinitinisialisasi tipe, dan tidak diperlukan dalam kasus ini. Apakah alasan ini cukup masuk akal?
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionmelakukan pekerjaan dengan baik dan tidak memuat dll ke dalam aplikasi.
Ini berfungsi jika dll adalah .net atau Win32 . Metode refleksi hanya berfungsi jika dll adalah .net. Juga, jika Anda menggunakan refleksi, Anda memiliki overhead untuk memuat seluruh dll ke dalam memori. Metode di bawah ini tidak memuat unit ke dalam memori.
// 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);
Dari: http://msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.fileversion.aspx
@"C:\MyAssembly.dll"di atas), Anda dapat menggunakan System.Reflection.Assembly.GetExecutingAssembly().Location(atau jika dll a: Assembly.GetAssembly(typeof(AClassInTheDll)).Location)
Pertama-tama, ada dua 'versi' yang mungkin Anda minati:
Versi file sistem file Windows, berlaku untuk semua file yang dapat dieksekusi
Versi build assembly, yang tertanam dalam perakitan .NET oleh kompiler (jelas hanya berlaku untuk .NET assembly dll dan file exe)
Dalam kasus sebelumnya, Anda harus menggunakan jawaban Ben Anderson; dalam kasus terakhir, gunakan AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version, atau jawaban Tataro, seandainya majelis dirujuk oleh kode Anda.
Perhatikan bahwa Anda dapat mengabaikan semua jawaban yang menggunakan .Load()/ .LoadFrom()metode, karena ini sebenarnya memuat rakitan di AppDomain saat ini - yang analog dengan menebang pohon untuk melihat berapa umurnya.
Berikut cara yang baik menggunakan sedikit refleksi untuk mendapatkan versi DLL yang berisi kelas tertentu:
var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;
Ganti saja! Kelas! dengan nama kelas yang didefinisikan dalam DLL Anda ingin mendapatkan versi.
Ini adalah metode yang saya sukai karena jika saya memindahkan DLL untuk penyebaran yang berbeda, saya tidak perlu mengubah filepath.
FileVersionInfo
Untuk mendapatkannya untuk perakitan yang dimulai (winform, aplikasi konsol, dll ...)
using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version
Kris, versi Anda berfungsi dengan baik ketika perlu memuat perakitan dari file DLL yang sebenarnya (dan jika DLL ada di sana!), Namun, seseorang akan mendapatkan kesalahan yang tidak diinginkan jika DLL EMBEDDED (yaitu, bukan file tetapi tertanam DLL).
Hal lain adalah, jika seseorang menggunakan skema versi dengan sesuatu seperti " 1.2012.0508.0101 ", ketika seseorang mendapatkan string versi Anda akan benar-benar mendapatkan " 1.2012.518.101 "; perhatikan nol yang hilang .
Jadi, inilah beberapa fungsi tambahan untuk mendapatkan versi DLL (disematkan atau dari file 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);
Jawaban oleh @Ben terbukti bermanfaat bagi saya. Tetapi saya perlu memeriksa versi produk karena itu adalah peningkatan utama yang terjadi dalam perangkat lunak saya dan mengikuti versi semantik.
myFileVersionInfo.ProductVersion
Metode ini memenuhi harapan saya
Pembaruan: Alih-alih secara eksplisit menyebutkan jalur dll dalam program (seperti yang diperlukan dalam versi produksi), kita bisa mendapatkan versi produk menggunakan Assembly.
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location);
string ProdVersion= fileVersionInfo.ProductVersion;
Meskipun pertanyaan awal mungkin tidak spesifik untuk layanan web, berikut ini adalah testWebService lengkap yang dapat Anda tambahkan untuk menampilkan respons layanan non-cache layanan web plus versi file. Kami menggunakan versi file alih-alih versi perakitan karena kami ingin mengetahui versi, tetapi dengan semua versi perakitan 1.0.0.0, situs web dapat dengan mudah ditambal (penandatanganan dan tautan permintaan masih aktif!). Ganti @ Class @ dengan nama pengontrol api web layanan ini tertanam. Baik untuk go / nogo pada layanan web plus versi cek cepat.
[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;
}
Saya merasa perlu juga untuk menambahkan yang berikut ke web.config dalam konfigurasi agar benar-benar anonim
<location path="api/testwebservice">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>