Reading assembly attributes at runtime using Reflection in .NET
September 23, 2014 Leave a comment
A lot of metadata of an assembly is stored by way of attributes in the AssemblyInfo.cs file. E.g. if you create a simple Console application then this file will be readily available in the Properties folder. Assembly-related attributes are denoted by an “assembly:” prefix and can carry a lot of customisable information. Examples:
[assembly: AssemblyTitle("ReflectionCodeBits")]
[assembly: AssemblyDescription("This is a container for Reflection related code examples")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Great Company Ltd.")]
[assembly: AssemblyProduct("ReflectionCodeBits")]
[assembly: AssemblyCopyright("Copyright © 2014")]
[assembly: AssemblyTrademark("GC")]
[assembly: AssemblyCulture("sv-SE")]
[assembly: ComVisible(false)]
[assembly: Guid("8376337d-c211-4507-bc0d-bcd39bc9fb4f")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Most of these are self-explanatory but others deserve more attention:
- AssemblyConfiguration: to specify which configuration is used for the assembly. You can specify this value like “DEBUG”, “RELEASE” or some custom configuration name, like “ALPHA”
- AssemblyCulture: normally only used for satellite assemblies, otherwise an empty string denoting neutral culture – in fact you specify an assembly culture like I have done above you’ll get a compile error saying that executables cannot be satellite assemblies; culture should always be empty.
You can read the full documentation about assembly attributes here.
In order to extract the assembly attributes you’ll first need to get a reference to that assembly. You can then list all attributes of the assembly as follows:
Assembly executingAssembly = Assembly.GetExecutingAssembly();
IEnumerable<CustomAttributeData> assemblyAttributes = executingAssembly.CustomAttributes;
foreach (CustomAttributeData assemblyAttribute in assemblyAttributes)
{
Type attributeType = assemblyAttribute.AttributeType;
Console.WriteLine("Attribute type: {0}", attributeType);
IList<CustomAttributeTypedArgument> arguments = assemblyAttribute.ConstructorArguments;
Console.WriteLine("Attribute arguments: ");
foreach (CustomAttributeTypedArgument arg in arguments)
{
Console.WriteLine(arg.Value);
}
}
In my case I got the following output:
You can also extract a specific attribute type as follows:
AssemblyDescriptionAttribute assemblyDescriptionAttribute = executingAssembly.GetCustomAttribute<AssemblyDescriptionAttribute>(); string assemblyDescription = assemblyDescriptionAttribute.Description;
…which returns “This is a container for Reflection related code examples” as expected.
View all posts on Reflection here.
