Pat*_*ard 6 excel office-interop excel-interop c#-4.0
从msdn看来它似乎IMessageFilter没有处理所有异常,例如,在某些点,办公室应用程序'暂停'它们的对象模型,此时它不能被调用并抛出:0x800AC472 (VBA_E_IGNORE)
为了解决这个问题,你必须把你的呼叫放在一个循环中并等待它成功:
while(true)
{
try
{
office_app.DoSomething();
break;
}
catch(COMException ce)
{
LOG(ce.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果每次调用office应用程序的对象模型都需要这个样板代码,那么实现中是否有任何意义IMessageFilter?
是的,这两种机制是独立的.IMessageFilter是一种通用的COM机制,用于处理已经紧张不安并且不会处理60秒的呼叫的COM服务器.VBE_E_IGNORE错误非常特定于Excel,并且当它处于暂时禁用属性浏览器的状态时发生.将其视为模态状态,在Excel需要执行必须完成的关键操作之前有意打开,然后才能再次处理进程外调用.如果你愿意的话.它与时间无关,如IMessageFilter,但纯粹由执行状态.VSTO团队的Geoff Darst在此MSDN论坛主题中提供了一些背景信息.
必须编写这种重试循环当然是可怕的.鉴于它是一个执行状态问题并且假设您在没有用户也操作程序的情况下与Excel互操作,应该有办法解决问题.如果您从程序中的工作线程中捣乱Excel,那么请考虑检查代码中线程之间的交互,以确保不会创建线程几乎同时发出Excel调用的情况.