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
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top