只有安装了Redemption才能在后台线程中访问RDOSession

时间:2017-08-03 19:27:27

标签: .net multithreading winforms backgroundworker outlook-redemption

我的Windows窗体应用程序使用Outlook Redemption。最近,我将一些邮件列表代码移到了BackgroundWorker。在我的开发机器上,一切正常。但是,在客户端计算机上,我得到了这个:

  

无法转换类型为' Redemption.RDOSessionClass'的COM对象。至   界面类型' Redemption.IRDOSession'。此操作失败,因为   用于接口的COM组件的QueryInterface调用   IID' {E54C5168-AA8C-405F-9C14-A4037302BD9D}'由于失败而失败   以下错误:不支持此类接口(来自HRESULT的异常:   0x80004002(E_NOINTERFACE))。

我找到this answerRedemption 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行上失败。
  • 我们从未使用过RedemptionLoader。 EXE包含一个包含Redemption CLSID的清单,并且Redemption DLL包含在应用程序文件夹中。

0 个答案:

没有答案