我们在C#中有一个内部编写的程序,它使用中的RDO来创建、修改或删除Outlook联系人文件夹中的联系人。这是Outlook 2019,连接到内部交换。该程序是成功的是创建,修改或删除联系人。但是,如果Outlook未运行,则当C#程序试图退出时,它将挂起。我可以看到任务管理器中的进程是空闲的。即使我等了一夜,程序也不会退出。
如果我在运行Outlook的情况下运行C#程序,程序就会运行到完成,完成它需要做的事情,并成功退出。
我需要更改什么,无论是在C#代码中,在Outlook设置中,还是在Windows设置中,这样程序才能干净地退出?
发布于 2022-08-01 22:12:09
这只是猜测,因为您没有共享足够的代码。但我怀疑你的程序并没有处理这些资源。确保在您创建RDO对象的地方使用“使用”,以确保您的程序没有泄漏它们。
发布于 2022-08-01 23:00:17
是的,很可能您没有确保所有的Redemption对象,特别是RDOSession,没有在主线程上发布。
在关闭之前,请确保所有全局救赎对象要么通过调用Marshal.ReleaseComObject显式释放,要么超出作用域。在后一种情况下,在释放带有GC.Collect()的RDOSession之前,调用Marshal.ReleaseComObject ()(以确保所有超出作用域的对象立即释放)。
在最坏的情况下,请尝试在关闭之前调用RDOSession.DoFastShutdown()。
发布于 2022-08-01 23:01:35
Outlook编程(和救赎)是基于处理底层COM对象的。在处理Outlook或Redemption时,您需要记住这一点。
为了正确处理底层COM对象,我建议使用Marshal类的Marshal方法,它减少与指定COM对象关联的指定运行时可调用包装器(RCW)的引用计数,但是它不释放对象。因此,要释放对象,增量和递减操作的数量应该相等。
通常,您需要释放从Office返回的每个对象(在您的情况下是Outlook或Redemption )对象模型。异常是作为参数传递给事件处理程序的对象。
此外,您还可以考虑使用以下调用序列释放对象:
GC.Collect
GC.WaitForPendingFinalizers
GC.Collect
GC.WaitForPendingFinalizers一旦释放所有基础COM对象,托管应用程序就可以关闭。您可以阅读更多有关这方面的内容,并在何时在.NET开发的Office外接程序中发布COM对象文章中找到您的多个问题的答案。
https://stackoverflow.com/questions/73200061
复制相似问题