VB.NETプログラムに必要なdllが見つからない場合、それを実行すると、通常のWindowsエラーメッセージでクラッシュし、エラーに関する情報が提供されません。
そこで、何かをする前に、すべての依存関係が満たされていることを検証することを考えました。しかし、管理されていない依存関係と実行時の依存関係があるため、これは簡単なことではありません。それで、それを掘り下げる前に、CLR設定、またはこの問題のより簡単な解決策はありますか?
VB.NETプログラムに必要なdllが見つからない場合、それを実行すると、通常のWindowsエラーメッセージでクラッシュし、エラーに関する情報が提供されません。
そこで、何かをする前に、すべての依存関係が満たされていることを検証することを考えました。しかし、管理されていない依存関係と実行時の依存関係があるため、これは簡単なことではありません。それで、それを掘り下げる前に、CLR設定、またはこの問題のより簡単な解決策はありますか?
それは本当に簡単でした(つまり、Windowsの定型文のメッセージを回避しました)。アプリケーションにUnhandledExceptionイベントを処理させる必要があります。
私のようなVB.NETアプリウィンドウフォームの場合、プロジェクトのプロパティ、Application
タブに移動してView Application events
ボタンをクリックすることを意味しました。
これにより、(デフォルトでは非表示になっている)ApplicationEvents.vbファイルが開きました。私はいくつかのコードを追加しました:
Namespace My
' The following events are available for MyApplication:
'
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication
Private Sub MyApplication_UnhandledException(ByVal sender As Object, _
ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs _
) Handles Me.UnhandledException
MessageBox.Show("Application crashed due to the following unhandled exception. " + e.Exception.ToString())
End Sub
End Class
End Namespace
さて、いくつかのdllが欠落している場合、それが管理されているか混合されている場合は、例外メッセージでその名前を取得します。不足しているdllが管理されていない場合は、それを必要とする混合アセンブリの名前だけを取得します。しかし、それは私には問題ありません。混合アセンブリをDepends.exeにスローすると、問題のあるアンマネージアセンブリがすぐに明らかになります。