处理C ++ / MFC应用程序中从.NET dll抛出的异常

时间:2010-12-16 10:42:10

标签: c# .net c++ com

我正在使用C ++应用程序,该应用程序通过COM与C#.NET组件交互。 由于.NET dll引发了一些例外,尽管存在所有异常处理机制,但我的C ++应用程序仍在崩溃。 是否可以在C ++代码中捕获.NET dll抛出的异常?怎么样?

1 个答案:

答案 0 :(得分:2)

我不是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();
}

<强> [/编辑]

将调试器附加到您的进程,并在崩溃时查看应用程序的状态。

最佳

阿德