14

バックグラウンド スレッドで、アプリケーションは定期的にネットワーク フォルダー (UNC パス) を調べて、アプリケーションの更新を確認します。次のように、ファイルのアセンブリ バージョンを読み取ります。

Try
    newVers = System.Reflection.AssemblyName.GetAssemblyName("\\server\app.exe").Version
Catch ex As Exception
    ' ignore
End Try

このスニペットは非常に頻繁に実行されます。これまでのところ、複数の顧客サイトで 100.000 回以上実行されていると思いますが、問題はありません。

場合によってGetAssemblyNameFileNotFoundException、ネットワーク フォルダに到達できない場合などに が発生します (これは発生する可能性があり、対処する必要があります)。この例外はCatchすぐ下のブロックによってキャッチされ、すべて正常に動作します。

ただし、報告された 3 つのケースでは、GetAssemblyName呼び出しでSEHException. 奇妙なことに、この例外はCatchすぐ下のブロックではなく、グローバルなハンドルされていない例外ハンドラー ( System.AppDomain.CurrentDomain.UnhandledException) によってキャッチされました。その結果、アプリケーションがクラッシュします。

例外の詳細は次のとおりです (残念ながら、例外のフィールドErrorCodeCanResumeフィールドは、エラー処理ルーチンによってログに記録されません)。

Caught exception: System.Runtime.InteropServices.SEHException
   Message: External component has thrown an exception.
   Source: mscorlib
   TargetSite: System.Reflection.AssemblyName nGetFileInformation(System.String)
   StackTrace: 
      at System.Reflection.AssemblyName.nGetFileInformation(String s)
      at System.Reflection.AssemblyName.GetAssemblyName(String assemblyFile)
      at SyncThread.Run() 
      at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
      at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
      at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
      at System.Threading.ThreadHelper.ThreadStart()

Catchすぐ下のブロックで例外がキャッチされないのはなぜですか?

(これは関連している可能性があります。これは、UNC パスがローカル ネットワークの一部ではなく、VPN 上のリモート サーバーを指しているサーバーを指している顧客サイトでのみ発生しています。)

4

1 に答える 1