0

私の現在のプロジェクトはうまくいっているので、正気な人のように、わざと壊そうとしています。1 つの可能性として、一部のリソースが失われる可能性があります。実行フォルダーに dll を入れるのを怠ると、アプリケーションが見事にクラッシュします。

リソースの不足に起因する例外を「エレガントに」処理することは可能ですか?

私のクラスの 1 つは、「TcAdsDll.dll」を参照するリソースをインポートします。.

....
Imports Okuma.EthernetIO
....

そのクラスでは、このリソースを使用しようとしたときに生成された例外をキャッチできます。

    Try
        Dim objAdsStateInfo As TwinCAT.Ads.StateInfo = Nothing
        Try
             'Do a bunch of fun stuff with Ethernet...
        Catch...  
        'catch Ethernet errors              
        End Try
    Catch ex As Exception
    'This catches the exception generated when I try to instantiate an object that uses the dll which is no longer present
    End Try

ただし、この例外を処理した後も、プログラムは引き続きクラッシュします。初期化フェーズを終了すると、フォームのメインが読み込まれ、そのイベントの最後のサブに到達します。「End Sub」ステートメントを実行するとすぐに (1 行ずつデバッグ)、次のメッセージが表示されます。

DllNotFoundException was unhandled
Unable to load 'tcadsdll.dll': The specified module could not be found.
(Exception from HRESULT: 0x8007007E)

この .dll を使用するリソースで何かを行う前に、この .dll の存在をチェックするコードを追加しましたが、imports ステートメントでクラスにリンクされているため、それでも破棄しようとしてクラッシュします。dll ファイルのチェックを含めるには、リソース (Okuma.EthernetIO) を再構築する必要がありますか? または、私のアプリケーションでこれを簡単に行うエレガントな方法はありますか?

更新:インポートを含むクラスにジャンプする前に dll ファイルの存在を確認することは、私にとってはうまくいっています。そもそも例外が生成されるのを防ぎます。ただし、疑問は残ります:
dll が見つからないという例外を処理する方法はありますか?

4

1 に答える 1

0

プログラムを終了することで、DLL が見つからない例外を「エレガントに」処理できます。

Dim MissingDll as Boolean = False
Try
    'Do a bunch of fun stuff with Ethernet...
Catch ex As System.DllNotFoundException
    MissingDll = True
    MsgBox("Missing DLL", , "Fatal Error")
    Application.Exit()
End Try

シャットダウン コードでは、MissingDll を使用して、"DllNotFoundException was unhandled" エラーの原因となる他の関数の呼び出しを回避します。

If Not MissingDll Then EthernetIO.Close()  ' something like this
于 2015-11-30T17:07:45.670 に答える