Не используйте foreach
при изменении коллекции - используйте нисходящий цикл:
for (int i = FolderItems.Count; i >= 1; i--)
{
object oItem = FolderItems[i];
Outlook.ContactItem oContact = (oItem as Outlook.ContactItem);
if (oContact != null)
{
...
Marshal.ReleaseComObject(oContact);
}
Marshal.ReleaseComObject(oItem);
}
ОБНОВЛЕНИЕ .Для запроса OP, пример, который показывает, как удалить все элементы в папке, используя Погашение :
RDOSession session = new RDOSession();
session.MAPIOBJECT = MAPI.MAPIOBJECT; //an instance of the Namespace object from your snippet above
RDOFolder rFolder = session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts); //or you can use RDOSession.GetFolderFromID if you already have an Outlook.MAPIFolder
rFoldder.EmptyFolder ();
Если вы хотите удалить только контакты (но не списки рассылки), вы можетесначала получите их идентификаторы записей, используя RDOFolder.Items.MAPITable.ExecSQL("SELECT EntryID from Folder where MessageClass LIKE 'IPM.Contact%' ")
(ExecSQL возвращает экземпляр ADODB.Recordset
COM-объекта), используйте его для создания массива идентификаторов записей и передайте его RDOFolder.Items.RemoveMultiple()
.
.экземпляр объекта RDOSession , вы также можете использовать класс RedemptionLoader , если вы не хотите регистрировать redemption.dll в реестре с помощью regsvr32.exe (вы можете просто поместить выкуп.dll вместе с вашим исполняемым файлом).