C# 在VSTO中释放COM对象

C# 在VSTO中释放COM对象,c#,com,vsto,C#,Com,Vsto,我正在使用VSTO编写Outlook加载项。每当我需要释放COM对象时,我都会执行以下操作: MailItem email = inbox.Items[1]; // Do something Marshal.ReleaseComObject(email); 但是,如果我有很多COM对象,这就需要做很多工作。下面我有两段代码片段。下面的一个或两个代码段是否会正确释放COM对象 1. 2. List List=新列表(); MailItem电子邮件=收件箱。邮件[1]; 列表。添加(电子邮件);

我正在使用VSTO编写Outlook加载项。每当我需要释放COM对象时,我都会执行以下操作:

MailItem email = inbox.Items[1];
// Do something
Marshal.ReleaseComObject(email);
但是,如果我有很多COM对象,这就需要做很多工作。下面我有两段代码片段。下面的一个或两个代码段是否会正确释放COM对象

1. 2.
List List=新列表();
MailItem电子邮件=收件箱。邮件[1];
列表。添加(电子邮件);
//做点什么
foreach(列表中的对象对象)
元帅发布对象(obj);

我建议将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);
List List=新列表();
MailItem电子邮件=收件箱。邮件[1];
列表。添加(电子邮件);
//做点什么
foreach(列表中的对象对象)
ComUtil.发布(参考obj);

我建议将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);
List List=新列表();
MailItem电子邮件=收件箱。邮件[1];
列表。添加(电子邮件);
//做点什么
foreach(列表中的对象对象)
ComUtil.发布(参考obj);