我正在尝试创建一个启动屏幕,显示程序集(所有引用的库)加载状态。我使用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
答案 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