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

GetCustomAttribute() возвращает null для AssemblyVersionAttribute

Я добавляю диалоговое окно About к моему .NET-приложению, и я запрашиваю атрибуты сборки для отображения информации. Когда я пытаюсь восстановить свою сборку AssemblyVersionAttribute, используя GetCustomAttribute() возвращает null:

// Works fine
AssemblyTitleAttribute title
    = (AssemblyTitleAttribute)Attribute.GetCustomAttribute(
        someAssembly, typeof(AssemblyTitleAttribute));

// Gets null
AssemblyVersionAttribute version
    = (AssemblyVersionAttribute)Attribute.GetCustomAttribute(
        someAssembly, typeof(AssemblyVersionAttribute));

Мой AssemblyInfo.cs кажется прекрасным. У меня эти атрибуты определены:

[assembly: AssemblyTitle("Some Application")]
[assembly: AssemblyVersion("1.0.0.0")]

Какая сделка? У меня есть обходное решение, но я хотел бы знать, почему приведенный выше код не работает.

// Work-around
string version = someAssembly.GetName().Version.ToString();
4b9b3361

Ответ 1

AssemblyVersionAttribute не добавляется в сборку, но компилятор обрабатывается "специальным" способом (т.е. устанавливает версию сборки)

Вы можете получить атрибут AssemblyFileVersion (т.е. этот добавлен в сборку)

Существуют и другие атрибуты, которые показывают одно и то же поведение: AssemblyCultureAttribute и AssemblyFlagsAttribute также используются для настройки свойств сборки и не добавляются в сборку как пользовательские атрибуты.

Все эти атрибуты перечислены в разделе Атрибуты идентификации сборки в документации. В документации говорится об этих атрибутах:

Три атрибута вместе с сильным именем (если применимо) определяют личность сборки: имя, версия и культура.

Ответ 2

Ваш пример не работает. Это именно то, что заявляет документация MSDN, что заставляет меня думать, что код по-своему.
http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx

Чтобы получить имя [sic] загруженной сборки, вызовите GetName на сборке, чтобы получить AssemblyName, а затем получите свойство Version. Чтобы получить имя сборки, которую вы не загрузили, вызовите GetAssemblyName из своего клиентского приложения, чтобы проверить версию сборки, используемую вашим приложением.

Ответ 3

Не уверен, почему он ведет себя таким образом. Вместо того, чтобы идти после AssemblyVersionAttribute, мы делаем это:

Version AssemblyVersion = someAssembly.GetName().Version;

Для AssemblyFileVersion мы используем:

Version fileVersion = new Version("0.0.0.0");
AssemblyFileVersionAttribute[] fileVersionAttributes = (AssemblyFileVersionAttribute[])assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true);
if (fileVersionAttributes != null && fileVersionAttributes.Length > 0) {
    fileVersion = new Version(fileVersionAttributes[0].Version);
}