アセンブリファイルのバージョンを取得するにはどうすればよいですか


727

AssemblyInfo2つのアセンブリバージョンがあります:

  1. AssemblyVersion:属性を付けるアセンブリのバージョンを指定します。
  2. AssemblyFileVersion:Win32ファイルバージョンリソースに特定のバージョン番号を使用するようにコンパイラーに指示します。Win32ファイルのバージョンは、アセンブリのバージョン番号と同じである必要はありません。

Assembly Version次のコード行でを取得できます。

Version version = Assembly.GetEntryAssembly().GetName().Version;

しかし、どうすれば入手できAssembly File Versionますか?


2
「アセンブリバージョン」ではなく「アセンブリファイルバージョン」とはどういう意味ですか?例を挙げていただけますか?
-Xiaofu

7
@Xiaofu-「アセンブリバージョン」は、.NETが内部的に使用するものです。「Assembly File Version」は、ファイルを右クリックして「プロパティ」、「詳細」タブの順に移動すると表示されます。彼らは同じではありません。
rory.ap

AppDataでuser.configの場所を決定するときに使用されるのはアセンブリバージョンであることがわかりました。
カイルデラニー2017年

回答:


867

上記の私のコメントを参照して、あなたが本当に何を望んでいるかを明確にしてください。うまくいけばこれはそれです:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;

4
@Xiaofu:代わりにAssemblyInfo.csファイルからバージョン番号を取得する方法はありますか?
Markus

56
このコードの1つの問題は、ビルド番号とリビジョン番号を指定していない場合、実際には1.0。*。*を返すことです。AssemblyName.GetAssemblyName(assembly.Location).Version.ToString(); 両方のバージョンを同じ方法で設定している場合は、「コンパイル済み」バージョン番号が取得されます。これは、FileVersionと同じでなければなりません。
Doguhan Uluca

17
@DoguhanUlucaそれらは2つの異なるものです。これにより、ファイルバージョンではなく、アセンブリバージョンが提供されます。「両方のバージョンを同じ方法で設定する場合」は回避策であり、解決策ではありません。
Nyerguds、2015年

1
プロパティはありますFileVersionInfoが、stringプロパティはありませんVersionか?
カイルデラニー2017年

3
@Yitzchak:Assembly.GetEntryAssembly()たとえばOfficeアドインのコンテキストやその他の多くの場合にNULLを返します。また、アドイン/プラグインについて考える場合-EntryAssemblyはホストアプリケーションであり、ほとんどの場合、YourCode(TM)のバージョンが必要です:)それとは別に、回答でassembly.Location使用されているこの回答にnullを追加することもできます。 (つまり、最初のランダムなケースがグーグルアウトされました:github.com/Azure/azure-functions-host/issues/1233)そして、それはおそらくnullエントリアセンブリよりもさらに頻繁に発生します。
ケツァルコアトル2018

209

ある三つのバージョンアセンブリファイル、および製品。それらは異なる機能で使用され、明示的に指定しない場合は異なるデフォルト値を使用します。

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;

17
そのブログ記事はいつか消えるときのために、ここでは参考のために煮詰めている:string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
JMD

3
そして、AssemblyInfo.csファイルでこれらを指定したい場合は、assemblyVersionを使用する場合(任意の番号を[assembly: AssemblyVersion("2.0.*")]使用)=== fileVersionを使用する場合=== [assembly: AssemblyFileVersion("2.0.*")]およびproductVersionを使用する場合=== [assembly: AssemblyInformationalVersion("2.0.*")] 最後のバージョンでは、SemVer互換性のために文字列のサフィックスを使用できます。[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
ジェシーチザム2016

補遺:サフィックス表記をAssemblyFileVersion使用しない場合があります*。:(それはすべての4つの数字を必要とします。[assembly: AssemblyFileVersion("2.0.0.1")]
ジェシー・チザム

66

アプリケーションファイルバージョン(アセンブリ情報->ファイルバージョンで設定されているもの)にアクセスしたい場合、フォームのロード時にラベルのテキストをそれに設定してバージョンを表示すると言ったところ、

versionlabel.Text = "Version " + Application.ProductVersion;

53
これにはSystem.Windows.Formsへの参照が必要なので、すべてのアプリケーションに適しているとは限らないことに注意してください。
BradleyDotNET 2014

2
残念ながら、それは文字列です。自分でより単純な「v1.08」形式にフォーマットする場合は、理想的ではありません。実際にバージョンオブジェクトを取得してサブコンポーネントを整数として取得する場合は、はるかに便利です。
Nyerguds、2015年

1
また、AssemblyVersionではなくAssemblyInfoからAssemblyFileVersionを
取得する

高回答ユーザーがこの回答を編集して、これがWindowsフォーム専用であることをより明確にすることができますか?
jrh

これはまさに私が探していたものです、答えてくれてありがとう!
David Refoua

23

更新:引用された投稿、@ Iainと@Dmitry LobanovでRichard Grimesが述べたように、私の答えは理論的には正しいですが、実際には間違っています。

数え切れないほどの本などから覚えていたはずですが、を使用してこれらのプロパティを設定している間[assembly: XXXAttribute]、それらはコンパイラによってハイジャックされ、VERSIONINFOリソースに配置されます。

上記の理由により、属性が信号から抽出された後に属性が削除されるため、@ Xiaofuの回答でアプローチを使用する必要があります。


パブリック静的文字列GetProductVersion()
{
  var属性=(AssemblyVersionAttribute)Assembly
    .GetExecutingAssembly()
    .GetCustomAttributes(typeof(AssemblyVersionAttribute)、true)
    。シングル();
   return attribute.InformationalVersion;
}

http://bytes.com/groups/net/420417-assemblyversionattributeから-別の属性を探している場合は、上記のように置き換えてください)


ちょっとルーベン、2ノート。まず、AssemblyVersionではなくAssemblyFileVersionを要求する質問がありました。次に、Assembly.GetExecutingAssembly()。GetCustomAttributes(typeof(AssemblyVersionAttribute)、true)は長さ0の配列を返します。これは、AssemblyVersionAttributeがカスタム属性ではないためだと思います。
Iain、

最初の点について、それが私が「別の属性を探しているなら、それを上記のものに置き換えてください」と言った理由です(IIRCは試していません)。2番目について、それはもっともらしいようですが、掘り下げる時間はありません...
Ruben Bartelink

ええ、実際には.GetCustomAttribute()を介してAssemblyVersion属性を取得することはできません。アセンブリバージョンはAssemblyName.Versionプロパティを介してのみ取得できます。しかし、他のすべての属性では、それを行うのが正しい方法です
Dmitrii Lobanov 2013年

@DmitryLobanovとIainプロンプトありがとうございます。編集がそれを十分にカバーして、答えを削除するのではなく保存する価値があることを願っています-知らせてください!
Ruben Bartelink 2013年

1
.netコア3.1のAssemblyInformationalVersionAttribute代わりに使用しましたAssemblyVersionAttribute
Vasya Milovidov

5

これを使って:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

またはこれ:

new Version(System.Windows.Forms.Application.ProductVersion);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.