85

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

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

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

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

4

8 に答える 8

162

FileVersionInfo.FileVersionを使用して、パスからこれをフェッチできます。

var versionInfo = FileVersionInfo.GetVersionInfo(pathToExe);
string version = versionInfo.FileVersion; // Will typically return "1.0.0.0" in your case
于 2012-07-05T18:07:17.287 に答える
34

2018 年の更新と最新化 (例: C#6 の文字列補間):

受け入れられた回答は部分的に正しくなく (通常、ProductVersion は 3 部構成のバージョンを返しません)、少し誤解を招きます。

これがより完全な答えです。本文が長すぎないように、多くの人にとって「十分」な短い要約に分割しました。詳細な 2 番目の部分を読む義務はありません。

簡単な要約:

  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 つの部分すべてを処理する方法を示しているだけです。

詳細:

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

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

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

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

特にデフォルトは混乱を招く可能性があります。詳細を理解するために推奨される SO リンク: FileVersionInfo および AssemblyInfo

EntryAssembly と ExecutingAssembly 実行中のアプリのバージョンを取得するためのすべてのケースを十分に検討する に
は、別の場所で詳細を検索してください
EntryAssembly または ExecutingAssembly を使用する必要がある場合は混乱します。どちらにも利点と注意点があります。次のコードが .exe と同じアセンブリにない場合 (ヘルパー アセンブリなど)、事態はさらに複雑になります。通常は EntryAssembly を使用して、.exe のバージョンを取得します。
しかし: Visual Studio の単体テストで並列 .exe プロジェクトのルーチンをテストする場合、GetEntryAssembly() は機能しません (私の環境: NUnit、VS2017)。ただし、GetExecutingAssembly() は少なくともクラッシュしません。単体テスト中にのみ、テスト プロジェクトのアセンブリ バージョンを取得します。私には十分です。単純ではない状況があるかもしれません。
必要に応じて、宣言を static として省略して、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 を最大限に区別することをお勧めします。しかし、もちろん、「メイン」アプリのすべてのファイルを区別し、顧客に表示されるすべての「マーケティング」ProductVersion をすべてのファイルに持たせることもできます。しかし、経験上、技術バージョンとマーケティング バージョンを過度に同期させることは、必ずしも必要ではなく、安上がりでもありません。混乱は実際には減少せず、コストが増加します。したがって、ここの最初の部分で説明されているソリューションは、ほとんどの場合それを行う必要があります。

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

于 2014-04-27T15:18:36.437 に答える
23

受け入れられた回答では、「pathToExe」への参照が行われています。

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

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

これにより、誰かが不必要な追加の手順を実行するのを防ぐことができます.

于 2014-06-11T16:04:53.340 に答える
6

Programあなたのクラス名はどこですか:

Console.WriteLine("Version = " + typeof(Program).Assembly.GetName().Version.ToString()) ;
于 2014-07-17T13:52:07.483 に答える
5

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

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

それは言う、

// Get the file version info for the notepad.
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);
于 2012-07-05T18:08:52.217 に答える
2

これを使用してください、それは動作します:

using System.Reflection;

string v = AssemblyName.GetAssemblyName("Path/filename.exe").Version.ToString();
于 2014-01-14T01:24:26.737 に答える