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();
Ответы
Ответ 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);
}