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();