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 anAssemblyName
, and then get theVersion
имущество. To get the name of an assembly you have not loaded, callGetAssemblyName
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);
}