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

3 ответа

Решение

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

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

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

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

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

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

To get the name [sic] of an assembly you have loaded, call GetName on the assembly to get an AssemblyName, and then get the Version имущество. To get the name of an assembly you have not loaded, call GetAssemblyName from your client application to check the assembly version that your application uses.

Не уверен, почему так себя ведет. Вместо того, чтобы идти после 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);
}
Другие вопросы по тегам