Pregunta

Estoy intentando crear una pantalla de inicio que muestre el estado de carga de los ensamblados (todas las bibliotecas a las que se hace referencia). Uso el delegado AppDomain.AssemblyLoad AssemblyLoadEventHandler para detectar qué ensamblado se está cargando, pero el problema es que el evento no se activa cuando el programa se inicializa. Intenté registrar el controlador de eventos en el inicio de la aplicación " MyApplication_Startup " pero no funcionó. Aquí está mi código de prueba:

    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
¿Fue útil?

Solución

Un problema con el que se encontrará es que los ensamblados en .Net no se cargan hasta que se necesitan.

Por ejemplo, cree un nuevo ensamblaje con un " Hello World " clase en él, haga referencia a él con cualquier ejecutable, luego elimine el nuevo ensamblado del directorio de trabajo, en ningún momento notará que está cargado.

A continuación, en un evento de clic de botón, inicialice el " Hello World " clase, mantenga el ensamblado eliminado del directorio de trabajo y recibirá el error de que no se puede encontrar el ensamblado cuando se hace clic en el botón.

Esta es la razón clave por la que el primer acceso a la base de datos generalmente es lento en .Net y tiene una velocidad acelerada. sentirlo (cuanto más lo use, más rápido se vuelve), eso se debe a que los objetos que usa en su capa de datos no se cargan en el tiempo de ejecución hasta que se accede a ellos.

Otros consejos

Hmm, no estoy seguro acerca de la sintaxis de VB, pero en C #, lo pondría en el programa principal (...):

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);
}

ACTUALIZACIÓN: Usando Reflector, la sintaxis de 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top