.NET DLLからプログラムでバージョン番号を取得することは可能ですか?
はいの場合、どのように?
.NET DLLからプログラムでバージョン番号を取得することは可能ですか?
はいの場合、どのように?
回答:
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;
重要: これは元の質問に対する最良の回答ではないことに注意してください。このページで詳細を読むことを忘れないでください。
Assemblyname.GetAssemblyNameこれらの問題を回避することをお勧めします
beforefieldinit型初期化子の実行などの副作用を引き起こす可能性があり、この場合は不要です。これらの理由は十分に聞こえますか?
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionうまく機能し、アプリケーションにDLLをロードしません。
これは、dllが.netまたはWin32の場合に機能します。リフレクションメソッドは、dllが.netの場合にのみ機能します。また、リフレクションを使用する場合は、dll全体をメモリにロードするオーバーヘッドがあります。以下のメソッドは、アセンブリをメモリにロードしません。
// 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);
送信元:http : //msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.fileversion.aspx
@"C:\MyAssembly.dll"上記)は、使用することができますSystem.Reflection.Assembly.GetExecutingAssembly().Location(またはDLLとしますAssembly.GetAssembly(typeof(AClassInTheDll)).Location)
まず第一に、あなたが興味を持つかもしれない2つの可能な「バージョン」があります:
すべての実行可能ファイルに適用可能なWindowsファイルシステムファイルバージョン
コンパイラによって.NETアセンブリに埋め込まれているアセンブリビルドバージョン(明らかに.NETアセンブリdllおよびexeファイルにのみ適用可能)
前者の場合、ベン・アンダーソンの答えを使用する必要があります。後者の場合、AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Versionアセンブリがコードによって参照されている場合は、またはTataroの回答を使用します。
.Load()/ .LoadFrom()メソッドを使用するすべての回答を無視できることに注意してください。これらは実際に現在のAppDomainにアセンブリをロードします。これは、ツリーを切り捨てて古いものを確認するのに似ています。
以下は、リフレクションを使用して、特定のクラスを含むDLLのバージョンを取得する方法です。
var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;
!Classを置き換えるだけ!バージョンを取得したいDLLで定義されているクラスの名前。
DLLを別のデプロイに移動する場合、ファイルパスを変更する必要がないため、これが私の推奨する方法です。
FileVersionInfo
開始されたアセンブリ(winform、コンソールアプリなど)で取得するには
using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version
クリス、あなたのバージョンは、実際のDLLファイルからアセンブリをロードする必要がある場合(そしてDLLがそこにある場合!) DLL)。
もう1つは、「1.2012.0508.0101」のようなバージョン付けスキームを使用している場合、バージョン文字列を取得すると、実際には「1.2012.518.101」が取得されることです。欠落しているゼロに注意してください。
したがって、DLLのバージョンを取得するためのいくつかの追加関数があります(埋め込みまたは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)
@Benの回答は私にとって役立つことがわかりました。しかし、それは私のソフトウェアで発生する主な増分であり、セマンティックバージョニングに従っていたため、製品バージョンを確認する必要がありました。
myFileVersionInfo.ProductVersion
この方法は私の期待に応えました
更新:プログラムでdllパスを明示的に言及する代わりに(製品版で必要な場合)、アセンブリを使用して製品バージョンを取得できます。
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location);
string ProdVersion= fileVersionInfo.ProductVersion;
元の質問はWebサービスに固有のものではなかったかもしれませんが、Webサービスの非キャッシュ応答とファイルバージョンを表示するために追加できる完全なtestWebServiceを次に示します。バージョンを知りたいので、アセンブリバージョンの代わりにファイルバージョンを使用しますが、すべてのアセンブリバージョン1.0.0.0を使用すると、Webサイトに簡単にパッチを適用できます(署名およびデマンドリンクがまだアクティブです!)。@ Class @を、このサービスが組み込まれているWeb APIコントローラーの名前に置き換えます。これは、Webサービスのgo / nogoとクイックバージョンチェックに適しています。
[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;
}
本当に匿名にするために、構成の下のweb.configに以下を追加する必要があることもわかりました
<location path="api/testwebservice">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>