2

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

2 回答 2

1

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

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

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

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

于 2009-01-02T14:57:06.327 回答
0

嗯,我不确定 VB 语法,但在 C# 中,我会将它放在程序的 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);
}

更新:使用反射器,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
于 2009-01-01T00:11:52.597 回答