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
Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top