0

いくつかのアプリケーションで使用しているDLL/クラスライブラリを作成しました。プロジェクト参照でライブラリへの参照があり、次のようにフォームの「パブリッククラス」でライブラリのインスタントを宣言します(つまり、サブまたは関数内ではありません)。

Dim myLibrary As New MyHelperLibrary.MyHelperLibraryClass

ユーザーに恐ろしい未処理の例外ウィンドウが表示されるのではなく、エラーを処理しようとしていますが、何らかの理由でライブラリが見つからないか削除された場合、生成される例外を処理できないようです。

System.IO.FileNotFoundException: Could not load file or assembly 'MyHelperLibrary, Version=0.9.0.0, Culture=neutral, PublicKeyToken=45f96d659b47asd9' or one of its dependencies. The system cannot find the file specified.

上記の状況に対処する方法はありますか?明らかに、メソッドの外にあるため、Dimの周りにTry / Catchを配置することはできませんが、エラーの原因となっているのがその行なのか、それとも存在しないプロジェクト参照があるという事実なのかさえわかりません。

4

2 に答える 2

1

一般に、グローバルスコープに直接あるサードパーティライブラリのインスタンスオブジェクトは、前述のような状況につながる可能性があるため、適切な方法ではありません。

変数のインスタンス化は、それらを使用するクラスのコンストラクターまたはロードメソッドに移動する必要があります。

元:

Class MyClass

    Dim myLibrary As MyHelperLibrary.MyHelperLibraryClass

    Private Sub New()
        myLibrary = New MyHelperLibrary.MyHelperLibraryClass
    End Sub

End Class

また:

Class MyClass

    Dim myLibrary As MyHelperLibrary.MyHelperLibraryClass

    Public Sub Main()
        myLibrary = New MyHelperLibrary.MyHelperLibraryClass
    End Sub

End Class

このようにして、インスタンス化をtry/catchブロックでラップできます。

別の方法は、Application.UnhandledExceptionを処理することです

Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
    MsgBox(e.Exception.Message ) 
End Sub
于 2013-03-04T22:34:29.923 に答える
1

その行がエラーの原因であるかどうかさえわかりません

それはありますが、あなたが考える場所ではありません。例外は、実際に型を使用するコードが実行を開始する前に、ジッターによって生成されます。ジャスト イン タイムであるため、これは通常、メソッドがクラスを呼び出すときに行われます。コードを生成するために最初にアセンブリが必要なのはジッターです。例外は、クラスの近くではなく、呼び出しを行うコードで発生します。

そこから悪化します。リリース ビルドを実行すると、ジッターによって、クラスのメソッドがメソッドを呼び出すコードにインライン化される場合があります。これで、クラスを呼び出すメソッドを呼び出すメソッドで例外が発生します。アセンブリに自明でない数のパブリック メンバーを持つ自明でない数のパブリック クラスがある場合、例外が発生する可能性のある場所の数は非常に大きくなる可能性があります。何百も可能です。

これが本当に悪いアイデアのように聞こえる場合は、そうです。

于 2013-03-05T01:45:24.533 に答える