Обработка исключений размещения CLR в потоке, не созданном CLR

Проблема:

Необработанное исключение в потоке, входящем в 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?

Обновление (2011-05-31):

Я только что нашел старый отчет об ошибке: «UnhandledExceptionEventHandler не вызывается, когда управляемый код вызывается из неуправляемого и генерирует исключение - http://tinyurl.com/44j6gvu », где Microsoft подтверждает, что это «ошибочное» поведение:

Спасибо, что нашли время сообщить об этой проблеме. Это действительно ошибка, вызванная механизмом выполнения CLR и CRT, конкурирующими за UnhandledExceptionFilter . вместо нехватки памяти вы в конечном итоге видите threadAborts - без понятия, откуда исходная ошибка)!

17
задан Peter Mortensen 15 July 2011 в 11:54
поделиться