gpt4 book ai didi

c# - 在 C# 中释放 COM 对象

转载 作者:太空狗 更新时间:2023-10-29 22:33:45 26 4
gpt4 key购买 nike

我知道之前已经讨论过这个问题,但我找不到满意的答案。

我有一个电子邮件文件 (.msg),我按如下所示打开它,然后调用 Display。

oApp = new Microsoft.Office.Interop.Outlook.Application();
mail = (Microsoft.Office.Interop.Outlook.MailItem)oApp.Session.OpenSharedItem(fileName);
mail.Display(false);
oApp = null; // do I need to release this object ?

用户可以关闭它并重新打开它。在他们单击“重新打开”之前,我会检查该窗口是否仍然存在,如果是.. 然后将 SetForeground(hwnd) 发送到该窗口。如果不是,则意味着用户关闭了它,因此只需释放 mailItem 对象并再次打开。

 public static void ReleaseCOMObject(Microsoft.Office.Interop.Outlook.MailItem item) {
int r = System.Runtime.InteropServices.Marshal.ReleaseComObject(item);
while (r != 0) {
r = System.Runtime.InteropServices.Marshal.ReleaseComObject(item);
}
}

如果我尝试再次打开同一个文件。它“有时”会抛出“文件正在使用异常”所以,我认为即使我正在发布 MailItem .. 它也没有被正确发布。

我该怎么做才能确保其正确发布。关闭并重新打开文件是一种非常常见的情况。

任何指示都会非常有帮助。

最佳答案

如果您正在使用 .NET 的 COM 互操作功能(您正在使用),那么您不必担心这一点。

COM 跟踪引用计数 - 当引用计数达到 0 时,COM 对象会自动释放 - .NET 负责为您使用标准 COM 引用计数机制。

如果您是 P/调用 C 库,情况可能会有所不同 - 但在像您这样的标准场景中,您不应该有任何担心。

关于c# - 在 C# 中释放 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9263481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com