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("jatwood@atwoodheavyindustries.com")>
<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.