【问题标题】:How to handle managed exception in unmanaged code如何处理非托管代码中的托管异常
【发布时间】:2014-07-09 20:14:50
【问题描述】:

我有基于 COM 的 C++ 项目,在其中访问 C# 程序集。我想编写代码来处理 com 项目中由 C# 程序集抛出的异常。

我尝试放置 try 和 catch 块,但没有抛出异常,而是 HRESULT 值小于零。我需要显示 C# API 抛出的确切消息字符串。

请为此提供指南。

【问题讨论】:

  • 如果您只想知道错误消息,您可以将最后一个异常消息保存在变量中,然后使用 GetLastErrorMsg() 方法将其公开。当 HRESULT 值小于零时调用该方法。
  • 我认为您无法从非托管世界访问托管信息(异常字符串)。看看这个:blogs.msdn.com/b/liviuc/archive/2009/10/13/…。它说:“......您将无法在本机处理程序中获取托管异常信息 - 您必须在 C++/CLI 中使用 try/catch - 也就是说,在托管上下文中 - 如果您真的需要该信息。”。不过你可以抓住它。
  • 我没有找到 GetLastErrorMsg()... 我可以看到返回 DWORD 的 GetLastError()。

标签: c++ c#-4.0 com unmanaged managed


【解决方案1】:

您有两个可用的信息来源。首先,返回的 HRESULT 不是任意的,每个托管异常都有一个distinctive HRESULT,可以帮助您识别抛出的异常对象的类型。

接下来,CLR 实现IErrorInfo interface。您可以对您用来调用托管方法的接口指针进行 QI 获取 IErrorInfo 接口指针。 IErrorInfo::GetDescription() 返回 Exception.Message 属性值。

到此为止,没有办法得到神圣的堆栈跟踪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2010-09-18
    相关资源
    最近更新 更多