我如何捕获Interop异常?

时间:2013-03-21 15:44:58

标签: c# exception interop

我试图在我的C#代码

中捕获Interop异常
IEngine engine = null;

try
{
    engine = engineLoader.GetEngineObject(AbbyySdkSerialNumber);
}
catch(System.Runtime.InteropServices.COMException ex)
{
    int i = 0;
}

但它不想跳进catch块。有任何想法吗?提前谢谢!

3 个答案:

答案 0 :(得分:3)

CLR自动将HRESULT从COM互操作映射到更具体的托管异常, COMException 。例如,E_ACCESSDENIED变为 UnauthorizedAccessException ,E_OUTOFMEMORY变为 OutOfMemoryException ,依此类推。

如果HRESULT是自定义结果或CLR未知,则运行时会将通用 COMException 传递给客户端。 COMException 的ErrorCode属性包含HRESULT值。

有关COM互操作的完整讨论,请参阅Advanced COM Interoperability

请注意,如果您在VS调试器下运行此命令,则默认执行将在导致异常的行上停止。除非你然后步入下一行,否则它不会跳转到catch块。

答案 1 :(得分:1)

如果肯定会抛出异常,那么我敢打赌它实际上并没有抛出你期望的异常类型,即System.Runtime.InteropServices.COMException。我建议在catch (Exception ex)添加try子句,以便首先检查我的理智,然后检查 被抛出的异常。

答案 2 :(得分:0)

我有同样的例外。它告诉我项目ID是错误的 - 这应该是你在初始化期间插入对象的序列号。

建议: 如果您正在试用,那么请先检查一下,如果它没有过期。

我通过win服务运行SDK时发生异常。服务作为本地服务启动,但由于GetEngineObject无法创建引擎对象而无法正常工作。 我还尝试通过不同的用户名(进程)创建对象GetEngineObject,但它没有帮助。这就是为什么我考虑在我的visual studio中创建控制台应用程序的用户名差异,在那里我把我的代码放到它并在VS中以调试模式运行它的工作原理! (vs以我的用户名运行)

我不知道出了什么问题......