题
我正在尝试创建一个启动屏幕,显示程序集(所有引用的库)加载状态。我使用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
解决方案
您将遇到的一个问题是.Net中的程序集在需要之前不会加载。
例如,创建一个带有“Hello World”的新程序集。在其中的类中,用任何可执行文件引用它,然后从工作目录中删除新的程序集,在任何时候你都不会注意到它已被加载。
接下来,在按钮点击事件中,初始化“Hello World”按钮。 class,保持程序集从工作目录中删除,并且您将收到单击该按钮时无法找到程序集的错误。
这是.Net中第一次数据库访问通常较慢的关键原因,并且具有“加速”速度。感觉它(你使用它越多,得到的速度越快),这是因为你在数据层中使用的对象在被访问之前不会被加载到运行时。
其他提示
嗯,我不确定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
不隶属于 StackOverflow