Custom AssemblyInfo Attributes
To complement my previous post bemoaning the lack of respect for AssemblyInfo, I wanted to illustrate just how easy it is to add a few custom attributes to our AssemblyInfo file:
Imports System Imports System.Reflection <Assembly: AssemblyTitle("ASPUnhandledException")> <Assembly: AssemblyDescription("ASP.NET unhandled exception handling library")> <Assembly: AssemblyCompany("Atwood Heavy Industries")> <Assembly: AssemblyCompanyEmail("[email protected]")> <Assembly: AssemblyCompanyUrl("http://www.atwoodheavyindustries.com")> <Assembly: AssemblyProduct("Exception Handling Framework")> <Assembly: AssemblyCopyright(" 2004, Atwood Heavy Industries")> <Assembly: AssemblyTrademark("All Rights Reserved")> <Assembly: CLSCompliant(True)> <Assembly: AssemblyVersion("2.1.*")>
To get the custom attributes AssemblyCompanyUrl and AssemblyCompanyEmail working, just add these two classes to your solution:
<AttributeUsage(AttributeTargets.Assembly)> _ Public Class AssemblyCompanyEmailAttribute Inherits System.Attribute Private _strCompanyEmail As String Public Sub New(ByVal email As String) _strCompanyEmail = email End Sub Public Overridable ReadOnly Property CompanyEmail() As String Get Return _strCompanyEmail End Get End Property End Class <AttributeUsage(AttributeTargets.Assembly)> _ Public Class AssemblyCompanyUrlAttribute Inherits System.Attribute Private _strCompanyUrl As String Public Sub New(ByVal url As String) _strCompanyUrl = url End Sub Public Overridable ReadOnly Property CompanyUrl() As String Get Return _strCompanyUrl End Get End Property End Class
Once you’ve compiled your assembly, the obvious question is, how do we get these attributes (custom or standard) back out? I do it with a reflection loop into a NameValueCollection:
Private Shared Function GetAssemblyAttribs(ByVal a As Reflection.Assembly) _ As Specialized.NameValueCollection Dim attribs() As Object Dim attrib As Object Dim Name As String Dim Value As String Dim nvc As New Specialized.NameValueCollection attribs = a.GetCustomAttributes(False) For Each attrib In attribs Name = attrib.GetType().ToString() Value = "" Select Case Name Case "System.Reflection.AssemblyTrademarkAttribute" Name = "Trademark" Value = CType(attrib, AssemblyTrademarkAttribute).Trademark.ToString Case "System.Reflection.AssemblyProductAttribute" Name = "Product" Value = CType(attrib, AssemblyProductAttribute).Product.ToString Case "System.Reflection.AssemblyCopyrightAttribute" Name = "Copyright" Value = CType(attrib, AssemblyCopyrightAttribute).Copyright.ToString Case "System.Reflection.AssemblyCompanyAttribute" Name = "Company" Value = CType(attrib, AssemblyCompanyAttribute).Company.ToString Case "System.Reflection.AssemblyTitleAttribute" Name = "Title" Value = CType(attrib, AssemblyTitleAttribute).Title.ToString Case "System.Reflection.AssemblyDescriptionAttribute" Name = "Description" Value = CType(attrib, AssemblyDescriptionAttribute).Description.ToString Case Else 'Console.WriteLine(Name) End Select If Value <> "" Then If nvc.Item(Name) = "" Then nvc.Add(Name, Value) End If End If Next Return nvc End Function
But I am sure there are other ways.