C#DLL异常未在非托管的C 中捕获

  • 本文关键字:异常 C#DLL exception com
  • 更新时间 :
  • 英文 :


作为本练习的一部分,可以通过com熟悉在不受管理的c 中使用c#dll,我正在尝试查看异常处理方式。我写了一个小的c#dll,该c#dll只包含一个引发异常的函数,而一个调用该功能并试图捕获异常的C 函数。

这是DLL,用C#使用Visual Studio编写:

namespace ExceptionThrowingLib
{
    public interface IExceptionThrower
    {
        void ThrowException();
    }
    public class ExceptionThrower : IExceptionThrower
    {
        public ExceptionThrower() { }
        public void ThrowException()
        {
            using (StreamWriter writer = new StreamWriter("c:/misc/exceptionthrower.txt", true))
            {
                writer.WriteLine("Exception generation request received at " + DateTime.Now.ToString());
            }
            throw new Exception("This is a requested exception.");
            using (StreamWriter writer = new StreamWriter("c:/misc/exceptionthrower.txt", true))
            {
                writer.WriteLine("This should never appear in the output file.");
            }
        }
    }
}

这是尝试使用它的功能,使用Visual Studio 2008用C 编写:

void HandleException()
{   
    IExceptionThrowerPtr pThrower(__uuidof(ExceptionThrower));
    try
    {
        pThrower->ThrowException();
        AfxMessageBox(_T("No exception caught."));
    }
    catch (...)
    {
        AfxMessageBox(_T("I caught an exception!"));
    }
}

当我调用此功能时,"不例外"消息出现。

我希望客户端(C (端能够捕获_com_error对象并进行适当的处理以了解发生的事情,但似乎没有抓住。为什么不?我做错了吗?

您是否使用#import生成_com_ptr实现?

如果是这样,请注意省略raw_interfaces_only指令,因为它抑制了错误处理包装器功能的生成。

您并没有真正做错任何事情,但是有错误的理解。

C 代码没有捕获异常,因为C 代码正在抛出任何例外。.NET运行时的CLR/Interop层在传递后捕获异常。所有好的com代码永远不会从com方法或属性中引发例外,而是返回故障代码。

throwException((的返回代码(hresult(是什么。它不应该是s_ok,而是e_fail或其他一些描述性错误。

最新更新