FileVersionInfo.FileVersion возвращает ProductVersion? - PullRequest
0 голосов
/ 28 марта 2011

Я пытаюсь получить версию файла, используя C #:

string file = @"C:\somefile.dll";
Console.WriteLine(FileVersionInfo.GetVersionInfo(file).FileVersion);

Для большинства файлов это нормально, однако для некоторых я получаю результаты, которые отличаются от представленных в проводнике Windows.

См. Прикрепленное изображение: версия файла, представленная в окнах, - "0.0.0.0", однако та, которую я получаю, используя свойство FileVersion, - "000.000.000.000".

Я пробовал использовать разныеверсии .NET (2, 3.5, 4), которые дают те же результаты.

Кто-нибудь еще сталкивался с этой проблемой?

Спасибо, Лиор

enter image description here

Ответы [ 2 ]

1 голос
/ 28 марта 2011

Причина в том, что в WIN32 API (и метаданных файла) версии продукта определяются как строки, а версии файлов определяются как целочисленные, тогда как в .NET все они определяются как целые числа.

ЕслиВы используете рефлектор и проверяете класс FileVersionInfo, видите, что они загружаются по-разному:

 this.productVersion = GetFileVersionString(memIntPtr, string.Format(CultureInfo.InvariantCulture, format, new object[] { codepage, "ProductVersion" }))

Но:

this.fileMajor = HIWORD(fixedFileInfo.dwFileVersionMS);
this.fileMinor = LOWORD(fixedFileInfo.dwFileVersionMS);
this.fileBuild = HIWORD(fixedFileInfo.dwFileVersionLS);
this.filePrivate = LOWORD(fixedFileInfo.dwFileVersionLS);
1 голос
/ 28 марта 2011

Похоже, Windows Explorer удаляет первые 0 из частей версии.

Попробуйте создать сборку с FileVersion 001.001.001.001, в проводнике она будет отображаться как 1.1.1.1. Но ваш код вернет фактическое значение (001.001.001.001).

EDIT:

Обозреватель вернет 001.001.001.001 как ProductVersion , но только если AssemblyInformationalVersion не задано, и в этом случае он вернет его как ProductVersion.

...