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

标签 c# com outlook

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

我有一个电子邮件文件 (.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/

相关文章:

c# - 将 DataTable 转换为 ObservableCollection(没有特定类)

c# - 将回调包装到异步任务中

c++ - CBasePin 递增对拥有过滤器的引用。循环引用?

c# - LINQ - 比较列表对象和字符串列表

c# - 使用 linq/lambda 构建位标志

.net - 调用Word.Documents.Add后WinWord.exe不会退出-Word .NET Interop

excel - Powershell - 添加捕获以在没有 Excel 进程的情况下进行拾取

python - 使用 imap 获取电子邮件附件,但无论电子邮件是从 Outlook 客户端还是通过 Web 发送,都会得到不同的结果

c# - 从 wpf 应用程序打开并且 outlook 正在运行时,如何使 outlook 选择名称对话框聚焦

vba - 触发函数,更改字体,当 Outlook 电子邮件创建时 : "The item' s properties and methods cannot be used inside this event procedure. "