VSTO Outlook加载项:键入\u E\u libnotregisted

VSTO Outlook加载项:键入\u E\u libnotregisted,outlook,vsto,skype,Outlook,Vsto,Skype,我们在具有Outlook 2013和Skype 2013的环境中安装了Outlook外接程序(VSTO)。在我们将Skype for Business迁移到2016版之前,它一直在成功运行 从那以后,每当我们试图从“ContactItem”类中读取任何内容(实际上我们只需要从中读取一个自定义字段),就会出现以下错误(包括堆栈跟踪): “System.InvalidCastException:无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Microsoft.O

我们在具有Outlook 2013和Skype 2013的环境中安装了Outlook外接程序(VSTO)。在我们将Skype for Business迁移到2016版之前,它一直在成功运行

从那以后,每当我们试图从“ContactItem”类中读取任何内容(实际上我们只需要从中读取一个自定义字段),就会出现以下错误(包括堆栈跟踪):

“System.InvalidCastException:无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Outlook.\u ContactItem”。此操作失败,因为对IID为“{00063021-0000-0000-C000-0000000000 46}的接口的COM组件的QueryInterface调用失败”'由于以下错误而失败:库未注册。(来自HRESULT的异常:0x8002801D(TYPE_E_libnotregisted))。 位于System.StubHelpers.StubHelpers.GetCOMIPFromRCW(对象objSrc、IntPtr pCPCMD、IntPtr和ppTarget、布尔值和pfNeedsRelease) 在Microsoft.Office.Interop.Outlook.\u ContactItem.get\u PropertyAccessor()

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

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

当从ContactItem(或在2个TypeLib中定义的interop中的其他类)访问属性时,是否有方法强制VSTO中的TypeLib版本


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

在Outlook加载项中,不能访问主线程以外的线程上的OOM对象。旧版本的Outlook有时可以工作,Outlook 2016会直接引发错误

更新

您唯一的选项是(仅限C++或Delphi)或-其RDO对象族是扩展MAPI的包装器:要访问次线程上的联系人,请将
Namespace.MAPIOBJECT
属性的值保存在变量中(它指向IMAPISession Extended MAPI接口)和次线程上联系人条目id的值(worker),创建对象的实例(将在该线程上初始化MAPI),将
RDOSession.MAPIOBJECT
属性设置为主线程上保存的值,调用RDOSession.GetMessageFromID.

是否使用多个线程?我们正在执行该代码以获取后台工作线程中的联系人属性,该属性在FormShowing事件中触发。