Splash Screen w / Lastanordnung Status
-
03-07-2019 - |
Frage
Ich versuche, einen Begrüßungsbildschirm zu erstellen, die Baugruppen (alle referenzierten Bibliothek) Ladezustand zeigt. Ich benutze AppDomain.AssemblyLoad AssemblyLoadEventHandler Delegierten zu fangen, welche Assembly geladen wird, aber das Problem ist, wird das Ereignis nicht ausgelöst, wenn das Programm initialisiert. Ich habe versucht, die Event-Handler in dem Programmstart „MyApplication_Startup“ registrieren, aber es hat nicht funktioniert. Hier ist mein Test-Code:
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
Lösung
Ein Problem, das Sie in ausführen wollen, ist, dass Baugruppen in .Net nicht geladen werden, bis sie benötigt werden.
Zum Beispiel erstellen Sie eine neue Baugruppe mit einer „Hallo Welt“ Klasse darin, es mit einem beliebigen ausführbaren verweisen, dann löschen Sie die neue Baugruppe aus dem Arbeitsverzeichnis, in kürzester Zeit werden Sie feststellen, dass es geladen wird.
Als nächstes wird auf eine Schaltfläche klicken Ereignis, initialisieren Sie die „Hallo Welt“ Klasse, halten Sie die Baugruppe aus dem Arbeitsverzeichnis gelöscht, und Sie erhalten die Fehlermeldung, dass die Baugruppe nicht gefunden werden kann, wenn die Schaltfläche geklickt wird.
Dies ist der Hauptgrund, dass erste Datenbankzugriff in .Net im Allgemeinen langsam ist, und hat eine „Beschleunigung“ spüren (mehr Sie es verwenden, desto schneller wird es), das ist, weil die Objekte, die Sie verwenden in Ihrem Datenschicht nicht in die Laufzeit geladen, bis auf sie zugegriffen wird.
Andere Tipps
Hmm ich bin nicht sicher über die VB-Syntax, aber in C #, würde ich es in der Main-Programm setzen (...):
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);
}
UPDATE: Reflektor, die VB-Syntax scheint zu sein:
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