Необработанное исключение в потоке, входящем в CLR из неуправляемого кода, не запускает «нормальную» обработку CLR необработанного исключения. из « всех примеров взаимодействия и объединения ».
RuntimeHost (C ++):
PCWSTR pszStaticMethodName = L"GetStringLength";
PCWSTR pszStringArg = L"1";
//PCWSTR pszStringArg = L"2";
hr = pClrRuntimeHost->ExecuteInDefaultAppDomain(pszAssemblyPath,
pszClassName, pszStaticMethodName, pszStringArg, &dwLengthRet);
if (FAILED(hr))
{
wprintf(L"Failed to call GetStringLength w/hr 0x%08lx\n", hr);
goto Cleanup;
}
Управляемый код (C #):
public class CSSimpleObject
{
public CSSimpleObject()
{
}
//------8<----------
public static int GetStringLength(string str)
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
switch (str)
{
case "1":
throw new Exception("exception in non-CLR-created thread");
case "2":
Thread thread = new Thread(new ThreadStart(WorkThreadFunction));
thread.Start();
break;
}
return str.Length;
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine("CurrentDomain_UnhandledException:" + e.ToString());
Console.ReadKey();
}
public static void WorkThreadFunction()
{
throw new Exception(""exception in CLR-created thread"");
}
MSDN изначально подразумевает, что необработанные исключения в поток, не созданный в среде CLR, должен вести себя более или менее «естественно» - см. « Исключения в управляемых потоках »
Среда CLR позволяет большинству необработанных исключений в потоках выполняться естественным образом. В большинстве случаев это означает, что необработанное исключение вызывает завершение работы приложения ».
« Большинство »означает, что в потоках, созданных с помощью CLR, внутренние, прерывание потока и выгруженные исключения домена приложения обрабатываются по-разному. «они работают нормально, что приводит к прекращению действия приложения».
Дальнейшие исследования привели меня к « Механизм фильтра необработанных исключений (UEF) ОС не всегда может приводить к запуску обработки необработанных исключений CLR. При нормальных обстоятельствах это будет работать должным образом, и будет запущена обработка необработанных исключений CLR. Однако в некоторых случаях этого может не случиться ».
Что не так с приведенным выше кодом или как его можно изменить, чтобы срабатывала обработка необработанных исключений CLR?
Я только что нашел старый отчет об ошибке: «UnhandledExceptionEventHandler не вызывается, когда управляемый код вызывается из неуправляемого и генерирует исключение - http://tinyurl.com/44j6gvu », где Microsoft подтверждает, что это «ошибочное» поведение:
Спасибо, что нашли время сообщить об этой проблеме. Это действительно ошибка, вызванная механизмом выполнения CLR и CRT, конкурирующими за UnhandledExceptionFilter . вместо нехватки памяти вы в конечном итоге видите threadAborts - без понятия, откуда исходная ошибка)!