我的Windows窗体应用程序使用Outlook Redemption。最近,我将一些邮件列表代码移到了BackgroundWorker
。在我的开发机器上,一切正常。但是,在客户端计算机上,我得到了这个:
无法转换类型为' Redemption.RDOSessionClass'的COM对象。至 界面类型' Redemption.IRDOSession'。此操作失败,因为 用于接口的COM组件的QueryInterface调用 IID' {E54C5168-AA8C-405F-9C14-A4037302BD9D}'由于失败而失败 以下错误:不支持此类接口(来自HRESULT的异常: 0x80004002(E_NOINTERFACE))。
我找到this answer和Redemption FAQs,它建议将MAPIOBJECT从UI线程的RDOSession传递到后台线程,并在新的RDOSession对象上使用它。
所以我改变了代码。在UI线程中(已登录到RDOSession):
Me.Bgw.RunWorkerAsync(Email.OlAdmin.Session.MAPIOBJECT)
...然后在后台线程中:
Dim sess As New RDOSession
sess.MAPIOBJECT = e.Argument
Dim stores As RDOStores = sess.Stores
...etc
然而,有了这个,我收到相同的错误信息。
如果我更改代码以便它全部在前台运行,那很好。
但是,如果我实际上在客户端计算机上安装了Redemption(使用注册DLL的安装程序),则后台代码可以正常工作。这不是生产中的选项 - 我们将Redemption与应用程序一起发送,并且它运行无注册表。
所以我很困惑 - 它出现是一个线程问题(前台工作正常,后台失败),但将MAPIOBJECT传递给后台工作者并没有帮助;如果我安装 DLL,它可以在后台中正常工作,而不用传递MAPIOBJECT。
我还尝试完全重建.NET 3.5应用程序,以便它以.NET 4.6.2为目标,但它仍然以同样的方式失败。)
如何修复它以便它在后台运行,但无需安装Redemption?
修改:澄清一下,以回应德米特里的问题:
sess.MAPIOBJECT = e.Argument
行上失败。