Domanda

Sto cercando di creare una schermata iniziale che mostri lo stato di caricamento degli assiemi (tutte le librerie di riferimento). Uso AppDomain.AssemblyLoad AssemblyLoadEventHandler delegato per rilevare quale assembly viene caricato ma il problema è che l'evento non viene attivato quando il programma viene inizializzato. Ho provato a registrare il gestore eventi all'avvio dell'applicazione " MyApplication_Startup " ma non ha funzionato. Ecco il mio codice di prova:

    Partial Friend Class MyApplication

    Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
        AddHandler AppDomain.CurrentDomain.AssemblyLoad, AddressOf MyAssemblyLoadEventHandler
    End Sub

    Sub MyAssemblyLoadEventHandler(ByVal sender As Object, ByVal args As AssemblyLoadEventArgs)
        Console.WriteLine(">>> ASSEMBLY LOADED: " + args.LoadedAssembly.FullName)
        Console.WriteLine()
    End Sub

End Class
È stato utile?

Soluzione

Un problema che si verificherà è che gli assembly in .Net non vengono caricati fino a quando non sono necessari.

Ad esempio, crea un nuovo assembly con un " Hello World " classificarlo, fare riferimento a qualsiasi eseguibile, quindi eliminare il nuovo assembly dalla directory di lavoro, in nessun momento noterai che è caricato.

Successivamente, su un evento clic pulsante, inizializza " Hello World " classe, mantieni l'assembly eliminato dalla directory di lavoro e riceverai l'errore che non è possibile trovare l'assembly quando si fa clic sul pulsante.

Questo è il motivo principale per cui il primo accesso al database è generalmente lento in .Net e ha una "velocità" & "; sentiti (più lo usi, più velocemente diventa), ciò perché gli oggetti che usi nel tuo livello dati non vengono caricati nel runtime fino a quando non vi si accede.

Altri suggerimenti

Hmm non sono sicuro della sintassi VB, ma in C # la inserirò nel Main del programma (...):

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(CurrentDomain_AssemblyLoad);
}

static void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args)
{
    Console.WriteLine("Loaded " + args.LoadedAssembly.FullName);
}

AGGIORNAMENTO: Utilizzando Reflector, la sintassi VB sembra essere:

Private Shared Sub Main(ByVal args As String())
    AddHandler AppDomain.CurrentDomain.AssemblyLoad, New AssemblyLoadEventHandler(AddressOf Program.CurrentDomain_AssemblyLoad)
End Sub

Private Shared Sub CurrentDomain_AssemblyLoad(ByVal sender As Object, ByVal args As AssemblyLoadEventArgs)
    Console.WriteLine(("Loaded " & args.LoadedAssembly.FullName))
End Sub
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top