実行中の EXE が参照しているクラスライブラリ(DLL)のアセンブリ情報を取得したいと思った。
結論から言うと、こんな感じでいけた(下記のコードは「著作権」の取得例)。
'Imports System.Reflection Dim oExecutingAssembly As Assembly = Assembly.GetExecutingAssembly() For Each oReferencedAssembly as AssemblyName In oExecutingAssembly.GetReferencedAssemblies Dim oAssembly As Assembly = Assembly.Load(oReferencedAssembly.FullName) Dim oAttribute As Attribute = Attribute.GetCustomAttribute(oAssembly, GetType(AssemblyCopyrightAttribute)) Dim oCopyright As AssemblyCopyrightAttribute = CType(oAttribute, AssemblyCopyrightAttribute) MsgBox(oReferencedAssembly.Name & ":" & oCopyright.Copyright) Next
アセンブリ情報の違う項目を取得したい場合は、AssemblyCopyrightAttribute のところを別の Assembly~Attribute に変えて、最後のほうの oCopyright.Copyright を適切な変数名とプロパティにすればオーケー。(別の Assembly~Attribute とは、AssemblyTitleAttribute、AssemblyDescriptionAttribute、AssemblyCompanyAttribute、AssemblyProductAttribute、AssemblyTrademarkAttribute 等)
特定の DLL の情報だけを取得したい場合は、あくまでも一例だが、下記のように条件分岐させてやればいいかな(dic にはあらかじめ DLL 名を入れておく)。
if dic.ContainsKey(oReferencedAssembly.Name) = True Then : End If
Assembly.Load の他に Assembly.LoadFile や Assembly.LoadFrom や Assembly.LoadWithPartialName でも Assembly を取得できるのでチェックしてみてください。
話がずれるけど、アセンブリ情報を取得するコードのところをよく見てみると、一見無駄なことをしてるようにも見えますね。コピーライトの型を指定しておきながら、取得するのは AssemblyCopyrightAttribute ではなく Attribute。そしてその Attribute をあらためてコピーライトの型にキャストし直してる。う~む。