バックグラウンド スレッドで、アプリケーションは定期的にネットワーク フォルダー (UNC パス) を調べて、アプリケーションの更新を確認します。次のように、ファイルのアセンブリ バージョンを読み取ります。
Try
newVers = System.Reflection.AssemblyName.GetAssemblyName("\\server\app.exe").Version
Catch ex As Exception
' ignore
End Try
このスニペットは非常に頻繁に実行されます。これまでのところ、複数の顧客サイトで 100.000 回以上実行されていると思いますが、問題はありません。
場合によってGetAssemblyName
はFileNotFoundException
、ネットワーク フォルダに到達できない場合などに が発生します (これは発生する可能性があり、対処する必要があります)。この例外はCatch
すぐ下のブロックによってキャッチされ、すべて正常に動作します。
ただし、報告された 3 つのケースでは、GetAssemblyName
呼び出しでSEHException
. 奇妙なことに、この例外はCatch
すぐ下のブロックではなく、グローバルなハンドルされていない例外ハンドラー ( System.AppDomain.CurrentDomain.UnhandledException
) によってキャッチされました。その結果、アプリケーションがクラッシュします。
例外の詳細は次のとおりです (残念ながら、例外のフィールドErrorCode
とCanResume
フィールドは、エラー処理ルーチンによってログに記録されません)。
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 上のリモート サーバーを指しているサーバーを指している顧客サイトでのみ発生しています。)