質問

アセンブリ(すべての参照ライブラリ)の読み込みステータスを表示するスプラッシュ画面を作成しようとしています。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
役に立ちましたか?

解決

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

たとえば、「He​​llo World」クラスを含む新しいアセンブリを作成し、実行可能ファイルでそれを参照し、その後、作業ディレクトリから新しいアセンブリを削除しても、それが読み込まれていることに気づくことはありません。

次に、ボタンのクリック イベントで、「Hello World」クラスを初期化し、アセンブリを作業ディレクトリから削除したままにすると、ボタンをクリックしたときにアセンブリが見つからないというエラーが表示されます。

これが、.Net での最初のデータベース アクセスが一般的に遅く、「高速化」したように感じられる主な理由です (使用すればするほど速くなります)。これは、データ層で使用するオブジェクトが次のとおりであるためです。アクセスされるまでランタイムにロードされません。

他のヒント

うーん、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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top