启动屏幕w /加载程序集状态

时间:2008-12-31 23:47:31

标签: .net vb.net initialization

我正在尝试创建一个启动屏幕,显示程序集(所有引用的库)加载状态。我使用AppDomain.AssemblyLoad AssemblyLoadEventHandler委托来捕获正在加载的程序集,但问题是程序初始化时未触发事件。我尝试在应用程序启动“MyApplication_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

2 个答案:

答案 0 :(得分:1)

您将遇到的一个问题是.Net中的程序集在需要之前不会加载。

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

接下来,在按钮单击事件上,初始化“Hello World”类,保持程序集从工作目录中删除,并且您将收到单击按钮时无法找到程序集的错误。

这是.Net中第一次访问数据库的速度通常很慢的关键原因,它具有“加速”的感觉(你使用的越多,获得的速度越快),这是因为你在你的在访问数据层之前,数据层不会加载到运行时中。

答案 1 :(得分:0)

嗯,我不确定VB语法,但在C#中,我会把它放在Program的Main(...)中:

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

更新:使用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