【问题标题】:C# VSTO Outlook AddIn: What is a possible impact of not releasing the MailItem objectC# VSTO Outlook AddIn:不释放 MailItem 对象的可能影响是什么
【发布时间】:2020-03-14 14:03:52
【问题描述】:

在 Outlook 中与 MailItems 交互时使用 Marshal.ReleaseComObject 有什么重要性?

我参考了创建 C# VSTO Outlook 插件的演练 https://docs.microsoft.com/en-us/visualstudio/vsto/walkthrough-creating-your-first-vsto-add-in-for-outlook?view=vs-2019

他们有一个修改现有选定邮件项目的主题和正文的示例。

void Inspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector)
{
    Outlook.MailItem mailItem = Inspector.CurrentItem as Outlook.MailItem;
    if (mailItem != null)
    {
        if (mailItem.EntryID == null)
        {
            mailItem.Subject = "This text was added by using code";
            mailItem.Body = "This text was added by using code";
        }

    }
}

示例结束时没有提及使用Marshal.ReleaseComObject 释放邮件项目对象。

但在https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.releasecomobject?view=netframework-4.8 的 .Net API 参考中,他们提到:

您应该使用此方法及时释放包含资源引用的底层 COM 对象,或者在必须按特定顺序释放对象时。

所以如果我们没有在我们引用的 MailItem 上使用 Marshal.ReleaseComObject 显然会有一些后果?

是否存在不使用 Marshal.ReleaseComObject 会导致问题的特定用例?

谢谢

【问题讨论】:

    标签: c# outlook vsto outlook-addin office-addins


    【解决方案1】:

    如果您不调用Marshal.ReleaseComObject,该对象将被垃圾收集器作为稍后破坏的点释放。通常,这不是问题 - 在处理大量项目时,您通常需要小心,不要让发布有机会。在这种特殊情况下,没有Marshal.ReleaseComObject 也可以,除非您想确保该项目已发布,以防它在外部更新,并且您不希望 Outlook 对象模型以一个陈旧的对象结束。

    请注意,mailItem 变量上的 Marshal.ReleaseComObject 是不够的 - 您需要注意隐式变量,例如当您使用多点表示法时。一些 .Net 运算符也以隐式变量结尾,as 就是其中之一(还有is):

    void Inspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector)
    {
        object item = Inspector.CurrentItem;
        Outlook.MailItem mailItem = item as Outlook.MailItem;
        if (mailItem != null)
        {
            if (mailItem.EntryID == null)
            {
                mailItem.Subject = "This text was added by using code";
                mailItem.Body = "This text was added by using code";
            }
            Marshal.ReleaseComObject(mailItem);
        }
        Marshal.ReleaseComObject(item);
    }
    

    【讨论】:

    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 2011-05-10
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多