从C#app中消耗的C ++ / CX异步方法抛出的异常消息

时间:2014-04-10 17:53:15

标签: c# c++ asynchronous windows-runtime c++-cx

我正在编写面向Windows 8.1的C ++ / CX WinRT库,我希望从C#app中使用它 如果我从异步方法中抛出异常,则C#app中显示的异常消息是错误的。

在WinRT库中,我有C ++ / CX代码,如:

IAsyncOperation<int>^ test()
{
    return create_async([]() -> int
    {
        throw ref new Platform::Exception(E_POINTER, "My message.");
    });
}

在C#app中我的代码如下:

try
{
    await c.test();
}
catch (Exception ex)
{
    Debug.WriteLine("Exception message: {0}", ex.Message);
}

调试模式下的输出是:

    WinRT information: My message.
    First-chance exception at 0x77692C1A in App1.exe: Microsoft C++ exception: Platform::Exception ^ at memory location 0x09A5E434. HRESULT:0x80004003 Invalid pointer
    WinRT information: My message.
    A first chance exception of type 'System.NullReferenceException' occurred in mscorlib.dll
    Exception message: Object reference not set to an instance of an object.

我知道this problem。但是,这已针对Windows 8.1应用程序解决。我成功地从非异步方法传递了我的异常消息,但我不能让它适用于异步。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

如果它是异步的,则表示函数c.test()在另一个线程中执行,该线程只能捕获自己的异常形式,因此你的代码将无法正常工作。

使用异常,您可以使用返回代码。同样在这篇MSDN文章中:Best Practices in Asynchronous Programming,它首先讨论的是:避免Async Void。