繁体   English   中英

从C#应用程序中使用的C ++ / CX异步方法引发的异常消息

[英]Exception message thrown from C++/CX async method consumed in C# app

我正在编写针对Windows 8.1的C ++ / CX WinRT库,我想从C#应用程序中使用它。
如果我从异步方法抛出异常,则C#应用程序中显示的异常消息是错误的。

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

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

在C#应用中,我的代码如下:

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.

我知道这个问题 但是,这对于Windows 8.1应用程序已解决。 我成功地从非异步方法传递了异常消息,但是我无法使它在异步环境下工作。 谁能帮我这个忙吗?

如果它是异步的,则意味着函数c.test()在另一个线程中执行,该线程只能捕获其自身的异常,因此您的代码将无法工作。

可以使用返回代码来代替使用异常。 同样在此MSDN文章: 异步编程最佳实践中 ,它谈论的第一件事是:避免异步无效。

按照MSDN( https://msdn.microsoft.com/en-us/library/Hh750082.aspx

仅当必须创建可以从另一种语言或其他Windows运行时组件访问的功能时,才使用create_async。 当您知道该操作是由同一组件中的C ++>代码产生和使用的时,请直接使用任务类>>。

摘要:当create_async要被另一种语言使用时,请使用它。 由c ++占用时使用create_task

希望这可以帮助=)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM