Outlook addin逐个打开大量(> 100)邮件,保存邮件正文并进一步处理。
foreach (MailItemContainer mc in Mails)
{
var inspector = mc.MailItem.GetInspector;
var document = (Document)inspector.WordEditor;
document.SaveAs(tempFilePath, format);
Process(tempFilePath);
//dispose inspector
Marshal.ReleaseComObject(inspector);
Marshal.ReleaseComObject(document);
inspector = null;
document = null;
Marshal.ReleaseComObject(mc.MailItem);
mc.MailItem = null;
}
但是,经过一些处理(通常约80项)后,会弹出异常。
System.Runtime.InteropServices.COMException (0xC4104005): Operation failed.
in Microsoft.Office.Interop.Outlook._MailItem.get_GetInspector()
通过Marshal.Release / FinalReleaseComObject处理检查器和文档没有帮助。用
关闭检查员 ((_Inspector)inspector).Close(OlInspectorClose.olDiscard);
导致奇怪的行为:从列表document.SaveAs中的第二项开始保存此项的副本,即使document.WordOpenXML包含我从中获取检查器的项目的正确xml。
在Outlook中处理多个项目的正确方法是什么?检查员是否需要以某种特殊方式处理?
UPD2:
在发布邮件项目之后,我得到了"当前进程已经使用了Window Manager对象的所有系统允许句柄"。 使用MailItem.Close(OlInspectorClose.olDiscard)会导致Outlook崩溃。
答案 0 :(得分:0)
通过Marshal.Release / FinalReleaseComObject处理检查器和文档没有帮助。
我不这么认为。您需要立即释放所有底层COM对象,而不仅仅是其中一些。完成使用后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放Outlook对象。然后在Visual Basic中将变量设置为Nothing(C#中为null)以释放对该对象的引用。您可以在Systematically Releasing Objects文章中详细了解相关内容。
答案 1 :(得分:0)
我在使用Outlook.Inspector时遇到了完全相同的问题,
解决方案是:您需要使用Outlook.Inspector
参数在OlInspectorClose.olDiscard
上调用Close方法...
我只是设置为null,这没有帮助。