【问题标题】:Releasing COM objects in VSTO在 VSTO 中释放 COM 对象
【发布时间】:2014-02-14 10:17:30
【问题描述】:

我正在使用 VSTO 编写 Outlook 插件。每当我需要释放 COM 对象时,我都会这样做:

MailItem email = inbox.Items[1];
// Do something
Marshal.ReleaseComObject(email);

但是,如果我有很多 COM 对象,这将成为很多工作。我在下面有两个代码 sn-ps。下面的代码 sn-ps 中的一个或两个是否会正确释放 COM 对象?

1

public class Demo
{
    public void Main()
    {
        // Assume inbox exists.
        MailItem email = inbox.Items[1];
        // Do something
        Release(email);
    }

    public void Release(object obj)
    {
        Marshal.ReleaseComObject(obj);
    }
}

2

List<object> list = new List<object>();

MailItem email = inbox.Items[1];
list.add(email);

// Do something

foreach (object obj in list)
    Marshal.ReleaseComObject(obj);

【问题讨论】:

    标签: c# com vsto


    【解决方案1】:

    我建议将 Release 方法移至实用程序类并通过引用传递对象以确保引用与调用代码保持相同。

    public class ComUtil {
        public static void Release (ref object obj) {
            if(obj != null) {
                Marshal.ReleaseComObject(obj);
            }
        }
    }
    

    然后你可以在代码中的任何地方调用这个方法...

    List<object> list = new List<object>();
    
    MailItem email = inbox.Items[1];
    list.add(email);
    
    // Do something
    
    foreach (object obj in list)
        ComUtil.Release(ref obj);
    

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 2012-09-17
      • 2012-03-05
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2012-03-06
      相关资源
      最近更新 更多