web-dev-qa-db-ja.com

FileVersionInfoおよびAssemblyInfo

Blah.dllのAssemblyInfo.csからのこのスニペットを考えると:

[Assembly: AssemblyVersion("3.3.3.3")]
[Assembly: AssemblyFileVersion("2.2.2.2")]

そして、別の.exeで:

var fileInfo = FileVersionInfo.GetVersionInfo("/path/to/Blah.dll");
fileInfo.ProductVersion == fileInfo.FileVersion == true;

その他のSOの質問は、ProductVersionが「正しい」ことを示しています。私がそれをどのように使用しているかについて何か奇妙なことがあるかどうか、興味があります。

ProductVersionを「3.3.3.3」、FileVersionを「2.2.2.2」にするべきではありませんか?両方のプロパティをAssemblyFileVersionとして報告する原因は何ですか?

28
ecoffey

私は最初に答えを見つけました ここ 。参照しやすいように詳細を繰り返します。

AssemblyInfo.csファイルに含めることができる「バージョン」は3つあります。

[Assembly: AssemblyVersion("1.1.1.1")]
[Assembly: AssemblyInformationalVersion("2.2.2.2")]
[Assembly: AssemblyFileVersion("3.3.3.3")]

AssemblyInformationalVersionは、指定されていない場合、デフォルトでAssemblyFileVersionになります。同様に、AssemblyInformationalVersionandAssemblyFileVersionデフォルトはAssemblyVersion両方が指定されていない場合。

あなたの例では、AssemblyInfo.csファイルにAssemblyInformationalVersionが含まれていなかったため、デフォルトでAssemblyFileVersionの値になります。以下に示すように、AssemblyInformationalVersionFileVersionInfo.ProductVersionプロパティにマップされます。これは、テストがtrueを返す理由を説明しています。

明らかに、これにはいくつかの苛立たしい側面があります。まず、VisualStudioからAssemblyInformationalVersionを設定する方法(私が知っている)はありません。この属性を含めるには、AssemblyInfo.csファイルを直接変更する必要があります。次に、AssemblyInformationalVersionFileVersionInfo.ProductVersionプロパティにマップされますが、これは直感的ではありません。属性には、より適切にAssemblyProductVersionという名前を付ける必要があります。そして明らかに、titledescriptionなどでもあります。

そうは言っても、これらの(および関連する)値をコードで取得するにはどうすればよいでしょうか?このような:

AssemblyFileVersion          => System.Diagnostics.FileVersionInfo.FileVersion
AssemblyInformationalVersion => System.Diagnostics.FileVersionInfo.ProductVersion
AssemblyVersion              => System.Reflection.Assembly.Version

/// others...
AssemblyTitle                => System.Diagnostics.FileVersionInfo.FileDescription
AssemblyDescription          => System.Diagnostics.FileVersionInfo.Comments
AssemblyProduct              => System.Diagnostics.FileVersionInfo.ProductName
AssemblyCompany              => System.Diagnostics.FileVersionInfo.CompanyName
AssemblyCopyright            => System.Diagnostics.FileVersionInfo.LegalCopyright
AssemblyTrademark            => System.Diagnostics.FileVersionInfo.LegalTrademarks

AssemblyVersionの場合は、次を使用します。

string ver = Assembly.GetExecutingAssembly().GetName().Version.ToString();
46
Matt Davis