【发布时间】:2016-02-24 17:34:40
【问题描述】:
几乎在所有情况下都可以创建新的 VSTO Word 应用程序。我使用这一行来创建一个新实例:
var wordApplication = new Application {Visible = false}
(应用程序是“Microsoft.Office.Interop.Word.Application”)
我们在单元测试和一些自动化中经常这样做。但是在大约 1000 次调用中有一两次,初始化没有完成并且进程挂起。 (有人知道原因吗?)
为了解决这个问题,我将实例化包装成一个超时,然后再试一次:
var wordApplication = Utilities.CallWithTimeout(
// stuff to do
() => new Application {Visible = false},
// error handler before the TimeoutException happens
() =>
{
var info = "Try to create a WordApplication failed after 15 seconds";
Tracer.TraceEvent(TraceEventType.Error, info, TraceCategory.Application);
KillWordApplicationOnError(before);
},
// timeout
TimeSpan.FromSeconds(15));
(CallWithTimeout:https://gist.github.com/JuergenGutsch/b4b72fcb6a06327a6a41重试用这个方法完成:https://gist.github.com/JuergenGutsch/219e9fe3e5aad1a098f3)
我们通过识别单词 process 并杀死该进程来杀死应用程序。请记住,因为实例化挂起,我们没有 Word 应用程序可以使用 Quit(),但是 winword.exe 进程正在运行,我们需要将其杀死。 (我们如何杀死进程:https://gist.github.com/JuergenGutsch/92b64117cf51c15bab83)
这解决了挂起过程的问题,我们遇到了一个新问题,在大约 3000 次调用中会发生一次或两次。新问题是一个安全问题,它会禁用所有 Word 加载项,以及一些包含 VBA 宏的自定义 dotm 模板。
我们没有得到任何异常,也没有在事件日志中得到任何条目。杀死进程后除了这个:
An exception of type 'System.Runtime.InteropServices.COMException' occurred in BIS.MEDCS.Connectivity.Word.VSTO.dll but was not handled in user code
Additional information: Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
但是这个异常是通过重试处理的,并且实例化在下一次尝试时起作用。
你们中有人知道这里发生了什么吗?
【问题讨论】:
-
这看起来很像分配给对象的进程尚未完全释放且对象尚未“清理”时出现的错误。可能重试发生得太快?也许您应该尝试强制释放 COM 对象以及垃圾收集?
-
非常感谢 :) 我们在重试实例化之前等待 15 秒。也许这太快了。我们如何释放一个没有实例的 com 对象?我们重试,因为实例化不起作用。
标签: c# ms-word vsto ms-office office-interop