プログラムでDLLのバージョン番号を取得する


151

.NET DLLからプログラムでバージョン番号を取得することは可能ですか?

はいの場合、どのように?


10
これは6分前に尋ねられたとは信じられない、ちょうど同じように尋ねようとしていた!
tpower 2009年

2
-自動インクリメントバージョンのため、あまりにも、このリンクをチェックアウトblog.mbcharbonneau.com/2007/03/13/...
JL。

回答:


119
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;

重要: これは元の質問に対する最良の回答ではないことに注意してください。このページで詳細を読むことを忘れないでください。


28
これにより、実行中のAppDomainにMyAssembly.dllが読み込まれます。
staafl 2013年

12
Assemblyname.GetAssemblyNameこれらの問題を回避することをお勧めします
staafl 2013年

7
appdomainへのアセンブリの読み込みは遅く、元に戻せません(ドメインを削除せずにアンロードすることはできません)。権限が必要であり、beforefieldinit型初期化子の実行などの副作用を引き起こす可能性があり、この場合は不要です。これらの理由は十分に聞こえますか?
staafl 2013年

7
@staafl:はい。私だけでなく、将来このページを読んでいる他のすべての人にも。
クリス

6
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionうまく機能し、アプリケーションにDLLをロードしません。
Jack

181

これは、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

元のソース


5
私はこれが好き。あなたが本当にやりたいことがこれだけであるのに、なぜあなたはdllをロードする必要があり、そしてバージョンを取得するためにリフレクションを使用するのですか?
aggieNick02 2013

@benさん、投稿を編集していただけませんか?投票を追加することで-1人の担当者を失ったことがわかりました。投稿を編集しない限り、変更できません。乾杯!
ルークダッドリッジ2014

9
代わりに(静的ファイル名の:あなたはあなたが実行可能/ DLL実際に現在使用されている得ることを確認したい場合は@"C:\MyAssembly.dll"上記)は、使用することができますSystem.Reflection.Assembly.GetExecutingAssembly().Location(またはDLLとしますAssembly.GetAssembly(typeof(AClassInTheDll)).Location
コンラッド

4
これは、AssemblyVersion属性とAssemblyFileVersion属性の違いです。AssemblyFileVersionは、Windows APIが値を取得できるような方法でスタンプされます。AssemblyVersionは厳密な名前の一部であり、必ずしもAssemblyFileVersionと同じであるとは限りません。
daughey 2017

51

まず第一に、あなたが興味を持つかもしれない2つの可能な「バージョン」があります:

  • すべての実行可能ファイルに適用可能なWindowsファイルシステムファイルバージョン

  • コンパイラによって.NETアセンブリに埋め込まれているアセンブリビルドバージョン(明らかに.NETアセンブリdllおよびexeファイルにのみ適用可能)

前者の場合、ベン・アンダーソンの答えを使用する必要があります。後者の場合、AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Versionアセンブリがコードによって参照されている場合は、またはTataroの回答を使用します。

.Load()/ .LoadFrom()メソッドを使用するすべての回答を無視できることに注意してください。これらは実際に現在のAppDomainにアセンブリをロードします。これは、ツリーを切り捨てて古いものを確認するのに似ています。


32

以下は、リフレクションを使用して、特定のクラスを含むDLLのバージョンを取得する方法です。

var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;

!Classを置き換えるだけ!バージョンを取得したいDLLで定義されているクラスの名前。

DLLを別のデプロイに移動する場合、ファイルパスを変更する必要がないため、これが私の推奨する方法です。


3
これは、問題のアセンブリが現在のアセンブリによって静的に参照されている場合にのみ機能することに注意してください。
staafl 2013年

2
DLLは必ずしもアセンブリも、アセンブリ、これはから呼び出されていないエントリではありませんので、これが最善の答えです
CADのやつ

1
さまざまなタイプのバージョン情報を取得するには、stackoverflow.com / a / 909583/492を参照してください。例FileVersionInfo
CADが2017年

22

開始されたアセンブリ(winform、コンソールアプリなど)で取得するには

using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version

6
GetExecutingAssembly()も役立つ場合があります。
Bolt Thunder

10

クリス、あなたのバージョンは、実際の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)

2
var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName);

2

@Benの回答は私にとって役立つことがわかりました。しかし、それは私のソフトウェアで発生する主な増分であり、セマンティックバージョニングに従っていたため、製品バージョンを確認する必要がありました。

myFileVersionInfo.ProductVersion

この方法は私の期待に応えました

更新:プログラムでdllパスを明示的に言及する代わりに(製品版で必要な場合)、アセンブリを使用して製品バージョンを取得できます。

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location); 
string ProdVersion= fileVersionInfo.ProductVersion;

注:バージョンに自動インクリメント値のアスタリスクが含まれている場合、このメソッドは実際に生成された数値の代わりにアスタリスクを返します(つまり、アセンブリ情報に1.0。*を入れた場合は機能しません)。
Ronen Ness

はい!ただし、バージョンアップグレードにJeniks自動化を選択したため、アセンブリは常にdllバージョンの完全な組み合わせを持っています。
Prasan Dutt

1

System.Reflection.Assembly.Load *()メソッドを使用して、それらのAssemblyInfoを取得できます。


0

元の質問は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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.