Question

J'essaie de créer un écran de démarrage indiquant le statut de chargement des assemblys (toutes les bibliothèques référencées). J'utilise le délégué AppDomain.AssemblyLoad AssemblyLoadEventHandler pour intercepter l'assembly en cours de chargement, mais le problème est que l'événement n'est pas déclenché lors de l'initialisation du programme. J'ai essayé d'enregistrer le gestionnaire d'événements au démarrage de l'application " MyApplication_Startup " mais ça n'a pas marché. Voici mon code de test:

    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
Était-ce utile?

La solution

Un problème que vous allez rencontrer est que les assemblys dans .Net ne sont pas chargés tant qu'ils ne sont pas nécessaires.

Par exemple, créez un nouvel assemblage avec un " Hello World " classe en elle, faites-la référence à n’importe quel exécutable, puis supprimez le nouvel assemblage du répertoire de travail, à aucun moment vous ne remarquerez qu’il est chargé.

Ensuite, sur un événement de clic de bouton, initialisez le " Hello World " classe, conservez l'assembly supprimé du répertoire de travail et vous recevrez le message d'erreur indiquant que l'assembly est introuvable lorsque vous cliquez sur le bouton.

C’est la raison principale pour laquelle le premier accès à la base de données est généralement lent dans .Net et que le paramètre "accélération" est "accéléré". sentez-le (plus vous l'utilisez, plus il devient rapide), c'est-à-dire que les objets que vous utilisez dans votre couche de données ne sont pas chargés dans le runtime tant qu'ils ne sont pas utilisés.

Autres conseils

Hmm, je ne suis pas sûr de la syntaxe VB, mais en C #, je la mettrais dans le menu principal du programme (...):

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: À l’aide de Reflector, la syntaxe VB semble être:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top