Подтвердить что ты не робот

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?

Спасибо!

4b9b3361

Ответ 1

Я нашел ответ изначально здесь. Я повторяю детали для удобства ссылок.

Существуют три "версии", которые могут быть включены в файл AssemblyInfo.cs:

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

AssemblyInformationalVersion по умолчанию AssemblyFileVersion, если он не указан. Аналогично, 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

В случае AssemblyVersion используйте это:

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