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

遭遇する問題の 1 つは、.Net のアセンブリが必要になるまで読み込まれないことです。

たとえば、「He​​llo 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);
}

更新: 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
于 2009-01-01T00:11:52.597 に答える