tela de abertura w status de montagem / carga
-
03-07-2019 - |
Pergunta
Eu estou tentando criar uma tela que mostra os conjuntos (todos biblioteca referenciada) status de carregamento. Eu uso AppDomain.AssemblyLoad AssemblyLoadEventHandler delegado para pegar o que a montagem está sendo carregado, mas o problema é que o evento não é acionado quando o inicializa programa. Tentei registrar o manipulador de eventos no aplicativo de inicialização "MyApplication_Startup", mas não deu certo. Aqui está o meu código de teste:
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
Solução
Uma questão que você vai correr em é que as assembléias em .Net não são carregados até que sejam necessários.
Por exemplo, criar uma nova montagem com uma classe "Olá Mundo" nele, referência-lo com qualquer executável, em seguida, elimine a nova montagem do diretório de trabalho, em nenhum momento você vai notar que ele é carregado.
Em seguida, em um evento de clique de botão, inicializar a classe "Olá Mundo", manter o conjunto excluído do diretório de trabalho, e você receberá o erro que o conjunto não pode ser encontrada quando o botão é clicado.
Esta é a razão fundamental que o acesso primeiro banco de dados é geralmente lento na Net, e tem um "speed up" para ele se sentir (mais você usá-lo, mais rápido ele fica), que é porque os objetos que você usa no seu camada de dados não são carregados para o tempo de execução, até que sejam acedidos.
Outras dicas
Hmm eu não estou certo sobre a sintaxe VB, mas em C #, eu iria colocá-lo no principal do programa (...):
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: Usando o refletor, a sintaxe VB parece ser:
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