首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RDO的C#程序仅在未运行时退出时挂起

使用RDO的C#程序仅在未运行时退出时挂起
EN

Stack Overflow用户
提问于 2022-08-01 22:09:03
回答 3查看 54关注 0票数 0

我们在C#中有一个内部编写的程序,它使用中的RDO来创建、修改或删除Outlook联系人文件夹中的联系人。这是Outlook 2019,连接到内部交换。该程序是成功的是创建,修改或删除联系人。但是,如果Outlook未运行,则当C#程序试图退出时,它将挂起。我可以看到任务管理器中的进程是空闲的。即使我等了一夜,程序也不会退出。

如果我在运行Outlook的情况下运行C#程序,程序就会运行到完成,完成它需要做的事情,并成功退出。

我需要更改什么,无论是在C#代码中,在Outlook设置中,还是在Windows设置中,这样程序才能干净地退出?

EN

回答 3

Stack Overflow用户

发布于 2022-08-01 22:12:09

这只是猜测,因为您没有共享足够的代码。但我怀疑你的程序并没有处理这些资源。确保在您创建RDO对象的地方使用“使用”,以确保您的程序没有泄漏它们。

票数 0
EN

Stack Overflow用户

发布于 2022-08-01 23:00:17

是的,很可能您没有确保所有的Redemption对象,特别是RDOSession,没有在主线程上发布。

在关闭之前,请确保所有全局救赎对象要么通过调用Marshal.ReleaseComObject显式释放,要么超出作用域。在后一种情况下,在释放带有GC.Collect()的RDOSession之前,调用Marshal.ReleaseComObject ()(以确保所有超出作用域的对象立即释放)。

在最坏的情况下,请尝试在关闭之前调用RDOSession.DoFastShutdown()

票数 0
EN

Stack Overflow用户

发布于 2022-08-01 23:01:35

Outlook编程(和救赎)是基于处理底层COM对象的。在处理Outlook或Redemption时,您需要记住这一点。

为了正确处理底层COM对象,我建议使用Marshal类的Marshal方法,它减少与指定COM对象关联的指定运行时可调用包装器(RCW)的引用计数,但是它不释放对象。因此,要释放对象,增量和递减操作的数量应该相等。

通常,您需要释放从Office返回的每个对象(在您的情况下是Outlook或Redemption )对象模型。异常是作为参数传递给事件处理程序的对象。

此外,您还可以考虑使用以下调用序列释放对象:

代码语言:javascript
复制
GC.Collect
GC.WaitForPendingFinalizers
GC.Collect
GC.WaitForPendingFinalizers

一旦释放所有基础COM对象,托管应用程序就可以关闭。您可以阅读更多有关这方面的内容,并在何时在.NET开发的Office外接程序中发布COM对象文章中找到您的多个问题的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73200061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档