Recuperare tutti gli assembly referenziati dalla nostra applicazione

Scritto da  Massimo Bonanni il giovedì 10 febbraio 2011  •  Linguaggio: VB   • Livello: 100


La classe Assembly mette a disposizione il metodo GetReferencedAssembly che permette, a partire da un'istanza di Assembly di recuperare gli AssemblyName relativi agli Assembly da esso referenziato.

Tale metodo, però, recupera solamente il primo livello di reference. Vale a dire che se nella nostra applicazione utilizziamo una dll la quale, a sua volta, utilizza altre dll, il metodo restituirà solamente l'assembly relativo alla prima dll.

IL seguente Extension Method della classe Assembly utilizza il metodo GetReferencedAssembly per eseguire una ricerca ricorsiva al fine di recuperare tutti gli assembly referenziati:

Imports System.Runtime.CompilerServices
Imports System.Reflection

Module AssemblyExtension

    <Extension()> _
    Public Sub GetAllReferencedAssemblies(ByVal sourceAssembly As Assembly,
                                         ByVal allowGacAssembly As Boolean,
                                         ByVal list As ICollection(Of AssemblyName))
        If sourceAssembly Is Nothing Then Throw New ArgumentNullException("Source Assembly")
        If list Is Nothing Then Throw New ArgumentNullException("Destination List")
        list.Add(sourceAssembly.GetName())
        If allowGacAssembly OrElse Not sourceAssembly.GlobalAssemblyCache Then
            Dim assemblies = sourceAssembly.GetReferencedAssemblies()
            For Each assemblyName In assemblies
                Dim query = From a In list _
                            Where a.FullName = assemblyName.FullName _
                            Select a
                If query.Count = 0 Then
                    Dim assembly As Assembly = assembly.Load(assemblyName.FullName)
                    assembly.GetAllReferencedAssemblies(allowGacAssembly, list)
                End If
            Next
        End If
    End Sub
End Module

 

Attenzione: per assembly referenziato si intende un assembly del quale è utilizzato almeno un tipo contenuto.


Tags: Reflection

 
x