.net 带加载组件状态的启动屏幕

.net 带加载组件状态的启动屏幕,.net,vb.net,initialization,.net,Vb.net,Initialization,我正在尝试创建一个显示程序集(所有引用的库)加载状态的启动屏幕。我使用AppDomain.AssemblyLoadAssemblyLoadEventHandler委托捕获正在加载的程序集,但问题是程序初始化时未触发事件。我尝试在应用程序启动“MyApplication\u startup”中注册事件处理程序,但没有成功。以下是我的测试代码: Partial Friend Class MyApplication Private Sub MyApplication_Startup(

我正在尝试创建一个显示程序集(所有引用的库)加载状态的启动屏幕。我使用AppDomain.AssemblyLoadAssemblyLoadEventHandler委托捕获正在加载的程序集,但问题是程序初始化时未触发事件。我尝试在应用程序启动“MyApplication\u startup”中注册事件处理程序,但没有成功。以下是我的测试代码:

    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

嗯,我不确定VB语法,但在C中,我会把它放在程序的主(…)中:

更新:使用Reflector,VB语法似乎是:

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

您将遇到的一个问题是.Net中的程序集在需要时才会加载

例如,创建一个包含“Hello World”类的新程序集,用任何可执行文件引用它,然后从工作目录中删除新程序集,在任何时候您都不会注意到它已加载

接下来,在按钮单击事件中,初始化“Hello World”类,将程序集从工作目录中删除,然后您将收到一个错误,即当单击按钮时无法找到程序集

这是.Net中第一次数据库访问通常比较慢的关键原因,并且有一种“加速”的感觉(使用越多,速度就越快),这是因为在数据层中使用的对象在被访问之前不会加载到运行时。

One“fix”对于加载问题,需要有一个方法来创建在需要加载的各种程序集中找到的类型的实例。然后调用该方法将强制加载程序集。
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