Sürüm numarasını programlı olarak herhangi bir .NET DLL'den almak mümkün mü?
Evet ise, nasıl?
Sürüm numarasını programlı olarak herhangi bir .NET DLL'den almak mümkün mü?
Evet ise, nasıl?
Yanıtlar:
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;
Önemli: Bunun orijinal sorunun en iyi cevabı olmadığı belirtilmelidir. Bu sayfada daha fazlasını okumayı unutmayın.
Assemblyname.GetAssemblyNameBu sorunlardan kaçınmanızı öneririm
beforefieldinittür başlatıcıları yürütme gibi yan etkilere neden olabilir ve bu durumda gerekli değildir. Bu nedenler yeterli mi?
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionişi iyi yapar ve uygulama içine dll yüklemez.
Bu dll .net veya Win32 ise çalışır . Yansıma yöntemleri sadece dll .net ise çalışır. Ayrıca, yansıma kullanırsanız, belleğe tüm dll yükleme yükü var. Aşağıdaki yöntem, düzeneği belleğe yüklemez.
// 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);
Gönderen: http://msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.fileversion.aspx
@"C:\MyAssembly.dll"üzeri), kullanabilirsiniz System.Reflection.Assembly.GetExecutingAssembly().Location(ya da dll eğer: Assembly.GetAssembly(typeof(AClassInTheDll)).Location)
Her şeyden önce, ilginizi çekebilecek iki olası 'sürüm' vardır:
Tüm yürütülebilir dosyalara uygulanabilen Windows dosya sistemi dosya sürümü
Derleyici tarafından bir .NET derlemesine gömülü derleme derleme sürümü (açıkçası yalnızca .NET derlemesi dll ve exe dosyaları için geçerlidir)
Önceki durumda, Ben Anderson'ın cevabını kullanmalısınız; ikinci durumda AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Versionderlemeye kodunuz tarafından başvurulması durumunda kullanın veya Tataro'nun yanıtını kullanın .
.Load()/ .LoadFrom()Yöntemi kullanan tüm yanıtları göz ardı edebileceğinizi unutmayın , çünkü bunlar gerçekte montajı mevcut AppDomain'e yükler - ki bu kaç yaşında olduğunu görmek için bir ağacı kesmeye benzer.
İşte belirli bir sınıfı içeren bir DLL sürümünü almak için biraz yansıma kullanmanın güzel bir yolu:
var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;
Sadece değiştirin! sürümünü almak istediğiniz DLL'de tanımlanan bir sınıfın adı ile.
Bu benim tercih edilen yöntemdir çünkü farklı dağıtımlar için DLL'leri hareket ettirirsem dosya yolunu değiştirmek zorunda değilim.
FileVersionInfo
Başlatılan montajı almak için (winform, konsol uygulaması vb.)
using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version
Kris, sürümün derleme gerçek DLL dosyasından yüklenmesi gerektiğinde harika çalışıyor (ve DLL varsa!), Ancak DLL EMBEDDED ise (yani, bir dosya değil, gömülü ise çok istenmeyen bir hata alırsınız) DLL).
Diğer bir şey, eğer biri " 1.2012.0508.0101 " gibi bir sürümleme şeması kullanırsa , sürüm dizesini aldığında aslında " 1.2012.518.101 " alırsınız ; eksik sıfırlara dikkat edin .
Yani, burada bir DLL (gömülü veya DLL dosyasından) sürümünü almak için birkaç ekstra işlev:
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)
@Ben tarafından verilen cevap benim için yararlı oldu. Ancak yazılımımda meydana gelen ana artış olduğu için ürün sürümünü kontrol etmem gerekiyordu ve anlamsal sürümlemeyi izledim.
myFileVersionInfo.ProductVersion
Bu yöntem beklentilerimi karşıladı
Güncelleme: Programda açıkça dll yolundan bahsetmek yerine (üretim versiyonunda gerektiği gibi), Montaj'ı kullanarak ürün sürümünü alabiliriz.
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location);
string ProdVersion= fileVersionInfo.ProductVersion;
Orijinal soru bir web hizmetine özgü olmayabilir, ancak burada bir web hizmeti önbelleğe alınmamış yanıtı artı dosya sürümünü görüntülemek için ekleyebileceğiniz tam bir testWebService. Bir sürüm bilmek istediğimiz için montaj sürümü yerine dosya sürümünü kullanıyoruz, ancak tüm montaj sürümleri 1.0.0.0 ile web sitesi kolayca yamalanabilir (imzalama ve talep bağlantısı hala etkin!). @ Class @ yerine bu hizmetin katıldığı web api denetleyicisi adı ile değiştirin. Bir web hizmetindeki bir go / nogo ve hızlı sürüm kontrolü için iyidir.
[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;
}
Ben de gerçekten anonim yapmak için yapılandırma altında web.config eklemek için gerekli buldum
<location path="api/testwebservice">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>