schermata iniziale con caricamento dello stato dell'assieme
-
03-07-2019 - |
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
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