VSTO Outlook加载项:TYPE_E_LIBNOTREGISTERED

时间:2017-06-02 18:57:29

标签: outlook vsto skype

我们在具有Outlook 2013和Skype 2013的环境中安装了Outlook(VSTO)中的加载项。它已成功运行,直到我们将Skype for Business迁移到2016版本。

从那以后,每当我们尝试阅读" ContactItem" class(我们实际上只需要一个自定义字段),我们得到以下错误(包括堆栈跟踪):

" System.InvalidCastException:无法转换类型为' System .__ ComObject'的COM对象。接口类型' Microsoft.Office.Interop.Outlook._ContactItem'。此操作失败,因为QueryInterface调用COM组件上的接口与IID' {00063021-0000-0000-C000-000000000046}'由于以下错误而失败:库未注册。 (HRESULT的例外情况:0x8002801D(TYPE_E_LIBNOTREGISTERED))。    在System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc,IntPtr pCPCMD,IntPtr& ppTarget,Boolean& pfNeedsRelease)    在Microsoft.Office.Interop.Outlook._ContactItem.get_PropertyAccessor()"

搜索后,我们发现[HKEY_CLASSES_ROOT \ TypeLib {00062FFF-0000-0000-C000-000000000046}]中有2个typeLib版本:9.5和9.6。这是正常的"因为我们在Outlook 2016上安装了Outlook 2013.

如果我删除typeLib 9.6,外接程序将再次开始工作,但它会破坏Skype。如果我删除TypeLib 9.5,Skype可以工作,但Outlook停止工作。

当从ContactItem(或来自2个typeLib中定义的互操作的其他类)访问属性时,是否有办法在VSTO中强制使用TypeLib版本?

或者我们需要降级Skype,还是升级Outlook?

1 个答案:

答案 0 :(得分:0)

在Outlook插件中,您无法访问主线程以外的线程上的OOM对象。旧版本的Outlook有时可以正常工作,Outlook 2016会直接引发错误。

<强>更新
您唯一的选择是Extended MAPI(仅限C ++或Delphi)或Redemption - 其RDO系列对象是扩展MAPI的包装:访问辅助线程上的联系人,保存{{1}的值变量中的属性(它指向IMAPISession扩展MAPI接口)和联系人条目id的值。在辅助线程(worker)上,创建RDOSession对象的实例(将在该线程上初始化MAPI),将Namespace.MAPIOBJECT属性设置为主线程上保存的值,调用RDOSession.GetMessageFromID

相关问题