我试图抓住一个互操作异常在我的C#代码如何捕获Interop异常?
IEngine engine = null;
try
{
engine = engineLoader.GetEngineObject(AbbyySdkSerialNumber);
}
catch(System.Runtime.InteropServices.COMException ex)
{
int i = 0;
}
,但它并不想跳进catch块。有任何想法吗?先谢谢你!
我试图抓住一个互操作异常在我的C#代码如何捕获Interop异常?
IEngine engine = null;
try
{
engine = engineLoader.GetEngineObject(AbbyySdkSerialNumber);
}
catch(System.Runtime.InteropServices.COMException ex)
{
int i = 0;
}
,但它并不想跳进catch块。有任何想法吗?先谢谢你!
的CLR自动映射从COM的HRESULT互操作,以更具体的托管异常,不到收到COMException。例如,E_ACCESSDENIED变为UnauthorizedAccessException,E_OUTOFMEMORY变为OutOfMemoryException等等。
如果HRESULT是一个自定义结果,或者它对于CLR是未知的,那么运行时确实会将一个通用的COMException传递给客户端。 COMException的ErrorCode属性包含HRESULT值。
有关COM互操作的完整讨论,请参阅Advanced COM Interoperability。
请注意,如果您正在VS调试器下运行此操作,那么默认情况下执行将停止在导致异常的行上。它不会跳到catch块,除非您继续下一行。
上面的链接已过时 - 我在这里找到Advanced Com Interop:https://msdn.microsoft.com/en- us/library/bd9cdfyx(v = vs.100).aspx – holtavolt 2017-10-05 13:32:49
@holtavolt:非常感谢 - 我修复了陈旧的链接。 – RoadWarrior 2017-10-05 22:29:47
如果肯定抛出异常,那么我敢打赌它并没有抛出你期望的异常类型,即System.Runtime.InteropServices.COMException
。我建议为try
增加一个catch (Exception ex)
子句,以便首先检查我的理智,然后再检查是被抛出的异常。
我有同样的例外。它说我的项目ID是错误的 - 这应该是您在初始化期间将要插入的对象序列号。
建议: 请先检查一下,如果您在试用期运行,那么如果没有过期。
我通过win服务运行SDK时出现异常。服务以本地服务启动,并且由于无法通过GetEngineObject创建引擎对象而无法工作。 我也尝试通过不同的用户名(进程)创建对象GetEngineObject,但它没有帮助。这就是为什么我认为我在Visual Studio中创建控制台应用程序的用户名区别,在那里我将代码放在它上面,并在VS中以调试模式运行! (VS在我的用户名运行)
我不知道什么是错的...
对于我来说,我需要赶产生异常的具体类型。 它正在代码的托管部分中生成System.IO.IOException类型的异常,并且在我需要执行catch(IOException ^)的非托管代码中,什么解决了问题。 或者,即使使用catch(例外^),该例外从未被捕获。
愚蠢的问题,但你** **错误? – LiverpoolsNumber9 2013-03-21 15:46:13
异常类型是否完全匹配? – asawyer 2013-03-21 15:46:17
试试你赶高级期待(Exception对象) – Jacek 2013-03-21 15:46:28