我有一个功能区按钮,可通过根据其中的收件人修改MailItem对象将文本插入到Outlook Inspector中。点击时调用的方法如下所示:

public async void OnTemplateClick(Office.IRibbonControl control)
        {
            var templateId = control.Tag;
            var template = templates.GetTemplateById(templateId);
            await templateUi.SetTemplate(control.Context, template);
        }


SetTemplate方法如下所示:

public async Task SetTemplate(object window, Template template,
            SynchronizationContext uiThread = null)
{
Outlook.MailItem currentMailItem = null;
            Outlook.Recipients olRecps = null;
            Outlook.Recipient recp = null;
            Outlook.AddressEntry addEntry = null;
            try
            {
                currentMailItem = GetMailItem(window);
                olRecps = currentMailItem.Recipients;
                var recipType = Outlook.OlMailRecipientType.olTo;
                var recps = from r in olRecps.Cast<Outlook.Recipient>()
                            where r.Type == (int)recipType
                            select r;
                var numRecps = recps.Count();

                var oldBodyHtml = currentMailItem.HTMLBody;
               ...


现在,有时,获取HTMLBody的最后一行会引发以下错误:

System.Runtime.InteropServices.COMException (0x8E604001): Not implemented.
   at Microsoft.Office.Interop.Outlook._MailItem.get_HTMLBody()


这个错误不会一直发生,并且很难重现,因此我们通常会在应用程序日志中看到它。我想知道什么可能导致此错误?我认为这与异步调用的时间有关,这意味着MailItem消息没有完全形成吗?

谢谢!

最佳答案

Outlook对象模型不能在辅助线程上使用。 Outlook 2016在检测到此类呼叫时将立即引发错误。在旧版本的Outlook中,呼叫可能会意外失败。

如果必须使用辅助线程,则唯一的选择是Extended MAPI(C ++或Delphi)或Redemption(其RDO对象can be used on secondary threads系列)。

关于c# - MailItem.HtmlBody引发未实现的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35853432/

10-09 07:20