在VSTO中释放COM对象

时间:2014-01-23 17:34:15

标签: c# com vsto

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

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

但是,如果我有很多COM对象,这将成为很多工作。我下面有两个代码片段。下面的代码片段中的任何一个或两个都会正确释放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);

1 个答案:

答案 0 :(得分:-2)

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

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);