アセンブリステータスをロードしたスプラッシュスクリーン
-
03-07-2019 - |
質問
アセンブリ(すべての参照ライブラリ)の読み込みステータスを表示するスプラッシュ画面を作成しようとしています。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 のアセンブリが必要になるまで読み込まれないことです。
たとえば、「Hello 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