В настоящее время я работаю с ffmpeg с проприетарной оболочкой, и мне нужно перехватить исключения из собственного кода, которые иногда возникают во время процедур перекодирования и т. Д.
Я уже прочитал эти вопросы / ответы:
https://stackoverflow.com/questions/10517199/cant-catch-native-exception-in-managed-code
https://stackoverflow.com/questions/150544/can-you-catch-a-native-exception-in-c-sharp-code
Однако они не очень помогли, поскольку исключения возникают не во время вызова функции, а в совершенно другом потоке, который работает бок о бок в библиотеке ffmpeg и генерируется дополнительными компонентами, такими как DirectX. Это как-то реальная проблема, так как исключения разрушают все мое приложение!
Любая помощь очень ценится.
Вы можете ловить исключения, выданные из других потоков, используя эти 2 события:
System.Windows.Forms.Application.ThreadException += Application_ThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
// Set the unhandled exception mode to force all Windows Forms errors to go through our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Вам также может потребоваться установить следующее в файле App.config:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<runtime>
<legacyUnhandledExceptionPolicy enabled="1" />
</runtime>
...
Если вы не можете заставить его работать с управляемым кодом, приведенный ниже код перехватит все в нативном (c ++) коде (не уверен, что вы сможете PInvoke его):
//Sets the handler for a pure virtual function call.
_set_purecall_handler( &MyPureVirtualCallHandler );
// Sets the handler function to be called when invalid parameters are passed to C runtime functions
_set_invalid_parameter_handler( &MyInvalidParameterHandler );
//Register an unhandled exception filter
SetUnhandledExceptionFilter(&UnhandExceptionFilter);
Других решений пока нет …