Обработка исключений, генерируемых из библиотеки .NET в приложении C ++ / MFC - PullRequest
1 голос
/ 16 декабря 2010

Я работаю с приложением C ++, которое взаимодействует с компонентом C # .NET через COM.Из-за некоторых исключений, выданных из .NET dll, мое приложение C ++ падает, несмотря на все механизмы обработки исключений на месте.Можно ли поймать исключения, выданные .NET DLL внутри кода C ++?Как?

1 Ответ

2 голосов
/ 16 декабря 2010

Я не эксперт по взаимодействию COM / .NET, но я ожидаю, что среда выполнения .NET никогда не допустит утечку исключения через вызов метода COM. Вместо этого я предполагаю, что среда выполнения преобразует исключение в объект, реализующий интерфейс IErrorInfo .

[редактировать] Я только подтвердил свою гипотезу. Следующий код печатает «Исключение точечной сети ...», как я и подозревал.

// SERVER: C#
using System.Runtime.InteropServices;

namespace COMInteroperability
{
    [Guid("6650E916-B507-483e-9804-8EEDA770F76C")]
    interface IFoo
    {
        [ComVisible(true)]
        string Bar(int value);
    }

    [ClassInterface(ClassInterfaceType.AutoDual)]
    [Guid("92377D62-32CB-4b2b-AE79-B256F54B3E17")]
    public class Foo : IFoo
    {
        public string Bar(int value)
        {
            throw new Exception("A dotnet exception...");
        }
    }
}


// CLIENT: C++
#include "stdafx.h"
#import "G:\temp\COMInteroperability\COMInteroperability\COMInteroperability\bin\Debug\COMInteroperability.tlb" no_namespace names_guids raw_interfaces_only

void CheckResult(HRESULT hr)
{
    if (SUCCEEDED(hr)) return;

    CComPtr<IErrorInfo> error;
    if (FAILED(GetErrorInfo(0, &error))) return;

    if (!error.p) return;

    CComBSTR description;
    error->GetDescription(&description);
    wprintf(description.m_str);
}

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(0);
    {
        CComPtr<_Foo> foo;

        CLSID clsid;
        CLSIDFromString(L"{92377D62-32CB-4b2b-AE79-B256F54B3E17}", &clsid);

        HRESULT hr = foo.CoCreateInstance(clsid);

        CheckResult(hr);
        if (FAILED(hr))
        {
            printf("Error %x", hr);
            return -1;
        }

        CComBSTR ret;
        CheckResult(foo->raw_Bar(10, &ret));
    }
    CoUninitialize();
}

[/ отредактирован]

Подключите отладчик к своему процессу и просмотрите состояние приложения в случае его сбоя.

Лучший

Адриано

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...