В фоновом потоке мое приложение регулярно проверяет сетевую папку (UNC-путь) для обновлений приложений. Он читает версию сборки файла, например:
Try
newVers = System.Reflection.AssemblyName.GetAssemblyName("\\server\app.exe").Version
Catch ex As Exception
' ignore
End Try
Этот фрагмент выполняется довольно часто, в общем, я бы предпочел более 100 000 раз на нескольких сайтах клиентов до сих пор без проблем.
Иногда GetAssemblyName
вызывает FileNotFoundException
, например, если сетевая папка недоступна (что может случиться и должно быть рассмотрено). Это исключение попадает в блок Catch
чуть ниже, и все работает отлично.
В трех сообщенных случаях, однако, вызов 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).