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?

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

/// 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();
Другие вопросы по тегам