作为本练习的一部分,可以通过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或其他一些描述性错误。