C# 赎回+;Clickonce=:-(

C# 赎回+;Clickonce=:-(,c#,com,clickonce,outlook-redemption,C#,Com,Clickonce,Outlook Redemption,我有一个普通的windows窗体程序(不是VSTO),它使用click once进行部署。问题是用户的加载遇到了随机错误(来自IClassFactory的随机错误由于以下错误而失败:80004005) Im通过将模式更改为“隔离”来部署赎回,这似乎对某些用户有效,但对其他用户无效 arn无法工作的用户可以通过手动安装Redemption DLL进行修复 有谁能解释一下如何自动化这个过程(我真的希望它是免费的,这样用户就不需要管理员许可就可以安装了) 谢谢 Ross解决了这个问题。问题是我在后台线

我有一个普通的windows窗体程序(不是VSTO),它使用click once进行部署。问题是用户的加载遇到了随机错误(来自IClassFactory的随机错误由于以下错误而失败:80004005)

Im通过将模式更改为“隔离”来部署赎回,这似乎对某些用户有效,但对其他用户无效

arn无法工作的用户可以通过手动安装Redemption DLL进行修复

有谁能解释一下如何自动化这个过程(我真的希望它是免费的,这样用户就不需要管理员许可就可以安装了)

谢谢


Ross解决了这个问题。问题是我在后台线程上加载了赎回对象,并试图在UI线程上操作它们。确保您在使用对象时保持一致。

解决了这个问题。问题是我在后台线程上加载了赎回对象,并试图在UI线程上操作它们ead。确保在使用对象时保持一致。

Outlook Redemption(Redemption.dll)和后台线程不能混合使用

与您的情况类似,我们使用后台线程登录Exchange服务器

这会导致无法登录Exchange的间歇性赎回错误

另外,我的一位同事在后台线程中放置了一个电子邮件Pop呼叫,而且,有时它会工作,有时则不会

使用赎回时,始终让主UI线程处理其操作

Redemption不会真正锁定应用程序,因为在弹出电子邮件、添加约会或甚至连接到电子邮件发送的Redemption事件以处理通过电子邮件发送的信息记录等时,实际上没有长时间运行的进程。

Outlook Redemption(Redemption.dll)和后台线程不会混合使用

与您的情况类似,我们使用后台线程登录Exchange服务器

这会导致无法登录Exchange的间歇性赎回错误

另外,我的一位同事在后台线程中放置了一个电子邮件Pop呼叫,而且,有时它会工作,有时则不会

使用赎回时,始终让主UI线程处理其操作


赎回不会真正锁定应用程序,因为在弹出电子邮件、添加约会或甚至挂接到电子邮件发送的赎回事件以处理通过电子邮件发送的信息记录等时,实际上没有长时间运行的过程。

如果您操作正确,完全可以在后台线程中使用赎回。T您创建的第一个RDOSession对象必须在UI线程中创建,因为某些MAPI内部需要在同一线程中创建消息泵。通常,此RDOSession应在应用程序的生命周期内保留。您无法从任何其他线程访问此对象

您需要将第一个RDO会话的MAPIOBJECT属性传递给每个工作线程,从每个线程中创建一个新的RDO会话对象,并将RDO会话中的MAPIOBJECT分配给该线程中创建的辅助RDO会话。示例:

(Aircode警告:下面的代码是从内存中键入的。)


从那里,您可以执行任何与赎回相关的正常操作。如果Outlook对象在一个线程中选择/定位,并在另一个线程中执行操作,则可以在线程之间传递EntryId。

如果操作正确,完全可以在后台线程中使用赎回。您创建的第一个RDOSession对象必须在UI线程,因为某些MAPI内部需要在同一线程中创建消息泵。通常,此RDO会话应在应用程序的生命周期内保留。您不能从任何其他线程访问此对象

您需要将第一个RDO会话的MAPIOBJECT属性传递给每个工作线程,从每个线程中创建一个新的RDO会话对象,并将RDO会话中的MAPIOBJECT分配给该线程中创建的辅助RDO会话。示例:

(Aircode警告:下面的代码是从内存中键入的。)


从那里,您可以执行任何与赎回相关的正常操作。如果Outlook对象在一个线程中被选中/定位,并在另一个线程中执行操作,则可以在线程之间传递EntryID。

在尝试解释问题时总是效果更好:)我已经回答了很多问题。在试图解释问题时总是效果更好:)我已经回答了很多问题。你错了。你可以用另一条线来赎罪。松饼人,我只能凭经验。另外,看看这个问题的自我解决是什么!我很惊讶我没有在这件事上获得赞成票!哎呀……)我们只是重写了外接程序的一部分,以便在后台线程上执行可能较慢的MAPI操作,而不是像使用Outlook对象模型时那样阻塞UI线程。我可以向您保证这是可以做到的。如果工作线程中的每个会话对象都单独登录,说明您没有正确登录,请在它们从第一个会话传递MAPIOBJECT属性以连接其他会话后登录。您错了。你可以用另一条线来赎罪。松饼人,我只能凭经验。另外,看看这个问题的自我解决是什么!我很惊讶我没有在这件事上获得赞成票!哎呀……)我们只是重写了外接程序的一部分,以便在后台线程上执行可能较慢的MAPI操作,而不是像使用Outlook对象模型时那样阻塞UI线程。我可以向您保证这是可以做到的。如果工作线程中的每个会话对象都单独登录,则表明您没有正确登录,请在它们从第一个会话传递MAPIOBJECT属性后登录,以连接其他会话。
Dim PrimaryRDOSession As New Redemption.RDOSession()
PrimaryRDOSession.Login([...])
Dim WorkerThread as New System.Threading.Thread(AddressOf ThreadProc)
WorkerThread.Start(PrimaryRDOSession.MAPIOBJECT)

Sub ThreadProc(ByVal param as Object)
    Dim ThdRDOSession As New Redemption.RDOSession()
    ThdRDOSession.MAPIOBJECT = param
    ' do other stuff
End Sub