FileVersionInfo и AssemblyInfo - PullRequest
       37

FileVersionInfo и AssemblyInfo

28 голосов
/ 17 декабря 2010

Учитывая этот фрагмент из 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 Ответ

46 голосов
/ 17 декабря 2010

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

В файл 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. И, очевидно, title также является описанием и т. Д.

Тем не менее, как мы можем получить эти (и связанные) значения в коде? Как это:

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