FileVersionInfo和AssemblyInfo

eco*_*fey 28 .net c# versioning version-control version

鉴于Blah.dll的AssemblyInfo.cs的这个片段:

[assembly: AssemblyVersion("3.3.3.3")]
[assembly: AssemblyFileVersion("2.2.2.2")]
Run Code Online (Sandbox Code Playgroud)

然后在一个单独的.exe中:

var fileInfo = FileVersionInfo.GetVersionInfo("/path/to/Blah.dll");
fileInfo.ProductVersion == fileInfo.FileVersion == true;
Run Code Online (Sandbox Code Playgroud)

其他SO问题显示ProductVersion是"正确的",如果对我如何使用它有些奇怪的话会很奇怪.

ProductVersion不应该是"3.3.3.3"而FileVersion应该是"2.2.2.2"吗?什么会导致它将这两个属性报告为AssemblyFileVersion?

Mat*_*vis 49

我原来在这里找到了答案.我正在重复细节以便于参考.

AssemblyInfo.cs文件中可以包含三个"版本":

[assembly: AssemblyVersion("1.1.1.1")]
[assembly: AssemblyInformationalVersion("2.2.2.2")]
[assembly: AssemblyFileVersion("3.3.3.3")]
Run Code Online (Sandbox Code Playgroud)

AssemblyInformationalVersionAssemblyFileVersion如果未指定,则默认为.同样,AssemblyInformationalVersion AssemblyFileVersion默认AssemblyVersion如果两者都没有规定.

在您的示例中,AssemblyInfo.cs文件未包含AssemblyInformationalVersion,因此默认值为AssemblyFileVersion.正如您将在下面看到的,AssemblyInformationalVersion映射到FileVersionInfo.ProductVersion属性,这解释了测试返回true的原因.

显然,这有一些令人沮丧的方面.首先,没有办法(我知道)AssemblyInformationalVersion从Visual Studio 设置.您必须直接修改AssemblyInfo.cs文件以包含此属性.其次,AssemblyInformationalVersion映射到FileVersionInfo.ProductVersion属性,这是非直观的.应该更恰当地命名该属性AssemblyProductVersion.显然,标题也是描述等.

那就是说,我们如何在代码中检索这些(和相关的)值?像这样:

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
Run Code Online (Sandbox Code Playgroud)

在这种情况下AssemblyVersion,使用这个:

string ver = Assembly.GetExecutingAssembly().GetName().Version.ToString();
Run Code Online (Sandbox Code Playgroud)

  • @ecoffey:"System.Diagnostics.FileVersionInfo.GetVersionInfo(fullPath)"不加载程序集,您可以调用"FileVersion"或"ProductVersion". (2认同)