web-dev-qa-db-ja.com

ファイルパスから.exeファイルのバージョン番号を取得する方法

C#のコードで.Net 3.5/4.0を使用しています。

C:ドライブでexeファイルのバージョン番号を取得しようとしています。

たとえば、パスはc:\ Program\demo.exeです。 demo.exeのバージョン番号が1.0の場合。

このパスを使用してバージョン番号を取得するにはどうすればよいですか?.

62
NoviceMe

FileVersionInfo.ProductVersion を使用して、これをパスから取得できます。

var versionInfo = FileVersionInfo.GetVersionInfo(pathToExe);
string version = versionInfo.ProductVersion; // Will typically return "1.0.0" in your case
124
Reed Copsey

2018を更新および最新化(例:C#6の文字列補間):

受け入れられた答えは部分的に正しくなく(ProductVersionは通常3部バージョンを返しません)、少し誤解を招く可能性があります。

より完全な答えがここにあります。メインテキストを長すぎないようにするために、多くの人にとって「十分な」短い(より短い)要約に分割しました。詳細な第2部を読む義務はないため、tl; drは不要です:-)

概要:

  1. 各ファイルにはさまざまなバージョン(アセンブリバージョン、ファイルバージョン、製品バージョン)がありますが、通常はすべて同じにして「バージョンヘル"既にファイルレベルにあります(十分に早い段階で提供されます)。

  2. ファイルバージョン(エクスプローラーで表示され、セットアップ/インストールで使用されます)は、わざわざ最も重要な名前です。

  3. これを実現するには、以下のようにAssemblyInfo.csファイルのfileversionをコメントアウトします。これにより、1つのファイルの3つの可能な異なるバージョンが同じであることが保証されます!

    [アセンブリ:AssemblyVersion( "1.1.2。")]
    // [アセンブリ:AssemblyFileVersion( "1.1.2。
    ")]

  4. 例えば。セマンティックバージョニングの場合、可能な4つのうち3つのバージョン部分のみを取得します。

すべてのVisual Studioビルドの自動ビルドカウントを使用すると便利です。ただし、このビルドカウントは、社内または社外の顧客に伝えるのに常に役立つとは限りません。したがって、タイトルダイアログでファイルバージョンをWindowsに言及するには、v1.2.3の3つの部分のみを表示することをお勧めします(もちろん、セマンティックバージョニングを使用)。

using System.Diagnostics;
...

var versInfo= FileVersionInfo.GetVersionInfo(pathToVersionedFile); 
string fileVersionFull = versInfo.FileVersion; // No difference here for versinfo.ProductVersion if recommendation in AssemblyInfo.cs is followed
string fileVersionSemantic = $"V{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}";
string fileVersionFull2 =    $"V{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}.{versInfo.FilePrivatePart}";

FileVersionFull2は、FileVersionFullと同じ「V」を含む4つの部分すべてを処理する方法を示しています。

D e t a i l s:

最初は、3つのバージョンを取得および設定する方法に関するチートシートです。

ファイルのバージョン:[アセンブリ:AssemblyFileVersion(..)] => System.Diagnostics.FileVersionInfo.FileVersion

製品バージョン:[アセンブリ:AssemblyInformationalVersion(..)] => System.Diagnostics.FileVersionInfo.ProductVersion

アセンブリバージョン:[アセンブリ:AssemblyVersion(..)] => System.Reflection.Assembly.Version

特にデフォルト設定はわかりにくいかもしれません。推奨SO詳細を理解するためのリンク: FileVersionInfoおよびAssemblyInfo

EntryAssembly対ExecutingAssembly
実行中のアプリのバージョンを取得するためのすべてのケースを完全に検討するには、詳細について他の場所を検索してください。ここ: アセンブリの場所、GetAssembly()。LocationまたはGetExecutingAssembly()。Locationを取得するのに適しています
特に、EntryAssemblyまたはExecutingAssemblyを使用する必要がある場合、混乱が生じる可能性があります。どちらにも利点と注意事項があります。 .exeと同じアセンブリにない次のコードがある場合:ヘルパーアセンブリでは、事態はさらに複雑になります。通常、EntryAssemblyを使用して、.exeのバージョンを取得します。
しかし、Visual Studioの単体テストで並列.exeプロジェクトのルーチンをテストする場合、GetEntryAssembly()は機能しません(私の環境:NUnit、VS2017)。ただし、GetExecutingAssembly()は少なくともクラッシュせず、ユニットテスト中にテストプロジェクトのアセンブリバージョンを取得します。私には十分です。それほど単純ではない状況もあります。
必要に応じて、静的な宣言を省略して、1つのプログラムで複数の異なるアセンブリのバージョンを取得できるようにすることができます。

public static class AppInfo
{
  public static string FullAssemblyName { get; }
  ..

  static AppInfo()
  {
      Assembly thisAssembly = null;
      try
      {
          thisAssembly = Assembly.GetEntryAssembly();
      }
      finally
      {
          if (thisAssembly is null)
              thisAssembly = Assembly.GetExecutingAssembly();
      }
      FullAssemblyName = thisAssembly.Location;
      var versInfo = FileVersionInfo.GetVersionInfo(FullAssemblyName);
      ..
  }
}

製品バージョンとファイルバージョン:
ファイルのProductVersionもWindowsエクスプローラーに表示されます。最も「顧客に見える」ファイル(主にアプリケーションのメイン.exe)でProductVersionとFileVersionを最大限に区別することをお勧めします。ただし、「メイン」アプリのすべてのファイルを区別し、すべての「マーケティング」製品バージョンを顧客に表示させることができます。しかし、経験から、技術バージョンとマーケティングバージョンの同期を過度にとる必要はなく、安価でもないことが示されています。混乱は実際には減少せず、コストが増加します。したがって、ここの最初の部分で説明した解決策はほとんどそれを行う必要があります。

履歴:アセンブリバージョンとファイルバージョン:バージョンが異なる理由の1つは、1つの.NETアセンブリが元々複数のファイル(モジュール)で構成されていることもあります-理論的に。これはVisual Studioでは使用されず、他の場所ではほとんど使用されません。これはおそらく、これら2つのバージョンを区別する可能性を与える1つの歴史的な理由です。技術的には、アセンブリバージョンはGACおよびサイドバイサイドバージョンとしての.NET関連のバージョニングに関連しています。ファイルバージョンは、従来のセットアップにより関連しています。更新中または共有ファイルの上書き。

28
Philm

受け入れられた回答では、「pathToExe」が参照されます。

このパスは、次のように取得および使用できます。

var Assembly = Assembly.GetExecutingAssembly();
var fvi = FileVersionInfo.GetVersionInfo(Assembly.Location);
var version = fvi.FileVersion; // or fvi.ProductVersion

これにより、誰かがいくつかの不必要な余分な手順を実行するのを防ぐことができます。

19
Sophtware

Programはクラス名です。

Console.WriteLine("Version = " + typeof(Program).Assembly.GetName().Version.ToString()) ;
7
Ralf

これがあなたが探しているものかどうかはわかりませんが、:

http://www.daniweb.com/software-development/csharp/threads/276174/c-code-to-get-dll-version

それは言います

int i;

// Get the file version for the notepad.
FileVersionInfo.GetVersionInfo(Path.Combine(Environment.SystemDirectory, "notepad.exe"));

FileVersionInfo myFileVersionInfo =  FileVersionInfo.GetVersionInfo(Environment.SystemDirectory + "\\notepad.exe");

// Print the file name and version number.
Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' + "Version number: " + myFileVersionInfo.FileVersion);
4
Drakkainen

使用して、動作します:

using System.Reflection;

string v = AssemblyName.GetAssemblyName("Path/filename.exe").Version.ToString();
2
phuc.nx
//Example your file version is 1.0.0.0
//Solution 1
Dim fileVer As FileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.CurrentDirectory + "\yourExe.exe")
yourLabel.Text = fileVer.FileVersion
//Solution 2
//Get File Version Number
yourLabel.Text = Application.ProductVersion
//Both solution will get output 1.0.0.0
0
Tuan Zaidi