2008-10-09 4 views
52

В моей программе, как я могу читать свойства, установленные в AssemblyInfo.cs:Как читать сборки атрибуты

[assembly: AssemblyTitle("My Product")] 
[assembly: AssemblyDescription("...")] 
[assembly: AssemblyConfiguration("")] 
[assembly: AssemblyCompany("Radeldudel inc.")] 
[assembly: AssemblyProduct("My Product")] 
[assembly: AssemblyCopyright("Copyright @ me 2008")] 
[assembly: AssemblyTrademark("")] 
[assembly: AssemblyCulture("")] 

Я хотел бы показать некоторые из этих значений пользователя моей программы, так что я «Мне нравится знать, как загрузить их из основной программы и из составных сборок, которые я использую.

ответ

51

Это достаточно просто. Вы должны использовать отражение. Вам нужен экземпляр Assembly, который представляет сборку с атрибутами, которые вы хотите прочитать. Простой способ получить это сделать:

typeof(MyTypeInAssembly).Assembly 

Тогда вы можете сделать это, например:

object[] attributes = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false); 

AssemblyProductAttribute attribute = null; 
if (attributes.Length > 0) 
{ 
    attribute = attributes[0] as AssemblyProductAttribute; 
} 

Реферирование attribute.Product теперь будет давать вам значение, передаваемое в атрибуте в вашем AssemblyInfo. CS. Конечно, если атрибут, который вы ищете, может возникать более одного раза, вы можете получить несколько экземпляров в массиве, возвращаемом GetCustomAttributes, но обычно это не проблема для атрибутов уровня сборки, таких как те, которые вы хотите получить.

+4

Вы также можете использовать Assembly.GetExecutingAssembly(). GetCustomAttributes() для получения атрибутов выполняемой в данный момент сборки. – jop 2008-10-09 14:30:55

+0

Обратите внимание, что если вы читаете атрибуты для сборки, которая не загружена, процесс загрузки не может быть отменен, если только отдельный AppDomain не используется и не разгружается. – 2008-10-22 11:13:28

+4

GetExecutingAssembly не всегда дает то, что вы хотите (например, он может вернуть отладчик, если отладчик начал ваше приложение). – 2009-12-30 14:04:38

10

Хорошо, возможно, немного устаревший теперь для исходного вопроса, но я представлю это для будущей справки в любом случае.

Если вы хотите сделать это внутри самой сборки, то используйте следующее:

using System.Runtime.InteropServices; 
using System.Reflection; 

object[] customAttributes = this.GetType().Assembly.GetCustomAttributes(false); 

Вы можете перебирать все пользовательские атрибуты, чтобы найти один (ы) вам требуется, например,

foreach (object attribute in customAttributes) 
{ 
    string assemblyGuid = string.Empty;  

    if (attribute.GetType() == typeof(GuidAttribute)) 
    { 
    assemblyGuid = ((GuidAttribute) attribute).Value; 
    break; 
    } 
} 
12

Я создал этот метод расширения, который использует Linq:

public static T GetAssemblyAttribute<T>(this System.Reflection.Assembly ass) where T : Attribute 
{ 
    object[] attributes = ass.GetCustomAttributes(typeof(T), false); 
    if (attributes == null || attributes.Length == 0) 
     return null; 
    return attributes.OfType<T>().SingleOrDefault(); 
} 

, а затем вы можете удобно использовать его так:

var attr = targetAssembly.GetAssemblyAttribute<AssemblyDescriptionAttribute>(); 
if(attr != null) 
    Console.WriteLine("{0} Assembly Description:{1}", Environment.NewLine, attr.Description); 
4

Хорошо, я попытался пойти через множество ресурсов, чтобы найти способ извлечения .dll-атрибутов для Assembly.LoadFrom(path). Но, к сожалению, я не смог найти хороший ресурс. И этот вопрос был самым большим результатом для поиска по c# get assembly attributes (по крайней мере для меня). Поэтому я решил поделиться своей работой.

Я написал следующую простую консольную программу для получения общих атрибутов сборки после многих часов борьбы. Здесь я предоставил код, чтобы каждый мог использовать его для дальнейшей справочной работы.

Я использую CustomAttributes свойство для этого.Вы можете прокомментировать этот подход

Код:

using System; 
using System.Reflection; 

namespace MetaGetter 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Assembly asembly = Assembly.LoadFrom("Path to assembly"); 

      foreach (CustomAttributeData atributedata in asembly.CustomAttributes) 
      { 
       Console.WriteLine(" Name : {0}",atributedata.AttributeType.Name); 

       foreach (CustomAttributeTypedArgument argumentset in atributedata.ConstructorArguments) 
       { 
        Console.WriteLine(" >> Value : {0} \n" ,argumentset.Value); 
       } 
      } 

      Console.ReadKey(); 
     } 
    } 
} 

Пример вывода:

Name : AssemblyTitleAttribute 
    >> Value : "My Product" 
2

Я использую это:

public static string Title 
{ 
    get 
    { 
     return GetCustomAttribute<AssemblyTitleAttribute>(a => a.Title); 
    } 
} 

для справки:

using System; 
using System.Reflection; 
using System.Runtime.CompilerServices; 



namespace Extensions 
{ 


    public static class AssemblyInfo 
    { 


     private static Assembly m_assembly; 

     static AssemblyInfo() 
     { 
      m_assembly = Assembly.GetEntryAssembly(); 
     } 


     public static void Configure(Assembly ass) 
     { 
      m_assembly = ass; 
     } 


     public static T GetCustomAttribute<T>() where T : Attribute 
     { 
      object[] customAttributes = m_assembly.GetCustomAttributes(typeof(T), false); 
      if (customAttributes.Length != 0) 
      { 
       return (T)((object)customAttributes[0]); 
      } 
      return default(T); 
     } 

     public static string GetCustomAttribute<T>(Func<T, string> getProperty) where T : Attribute 
     { 
      T customAttribute = GetCustomAttribute<T>(); 
      if (customAttribute != null) 
      { 
       return getProperty(customAttribute); 
      } 
      return null; 
     } 

     public static int GetCustomAttribute<T>(Func<T, int> getProperty) where T : Attribute 
     { 
      T customAttribute = GetCustomAttribute<T>(); 
      if (customAttribute != null) 
      { 
       return getProperty(customAttribute); 
      } 
      return 0; 
     } 



     public static Version Version 
     { 
      get 
      { 
       return m_assembly.GetName().Version; 
      } 
     } 


     public static string Title 
     { 
      get 
      { 
       return GetCustomAttribute<AssemblyTitleAttribute>(
        delegate(AssemblyTitleAttribute a) 
        { 
         return a.Title; 
        } 
       ); 
      } 
     } 

     public static string Description 
     { 
      get 
      { 
       return GetCustomAttribute<AssemblyDescriptionAttribute>(
        delegate(AssemblyDescriptionAttribute a) 
        { 
         return a.Description; 
        } 
       ); 
      } 
     } 


     public static string Product 
     { 
      get 
      { 
       return GetCustomAttribute<AssemblyProductAttribute>(
        delegate(AssemblyProductAttribute a) 
        { 
         return a.Product; 
        } 
       ); 
      } 
     } 


     public static string Copyright 
     { 
      get 
      { 
       return GetCustomAttribute<AssemblyCopyrightAttribute>(
        delegate(AssemblyCopyrightAttribute a) 
        { 
         return a.Copyright; 
        } 
       ); 
      } 
     } 



     public static string Company 
     { 
      get 
      { 
       return GetCustomAttribute<AssemblyCompanyAttribute>(
        delegate(AssemblyCompanyAttribute a) 
        { 
         return a.Company; 
        } 
       ); 
      } 
     } 


     public static string InformationalVersion 
     { 
      get 
      { 
       return GetCustomAttribute<AssemblyInformationalVersionAttribute>(
        delegate(AssemblyInformationalVersionAttribute a) 
        { 
         return a.InformationalVersion; 
        } 
       ); 
      } 
     } 



     public static int ProductId 
     { 
      get 
      { 
       return GetCustomAttribute<AssemblyProductIdAttribute>(
        delegate(AssemblyProductIdAttribute a) 
        { 
         return a.ProductId; 
        } 
       ); 
      } 
     } 


     public static string Location 
     { 
      get 
      { 
       return m_assembly.Location; 
      } 
     } 

    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^