C# Outlook VSTO 联系人在删除时复制

本文关键字:删除 复制 联系人 Outlook VSTO | 更新日期: 2023-09-27 18:34:47

更新联系人时,我只是删除旧联系人并将其替换为新联系人,因为我懒得检查所有联系人的所有字段。

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        string sTempPath = GetTemporaryDirectory();
        //RequestContacts();
        ExtractContacts(sTempPath);
        ImportContacts(sTempPath);
    }

"RequestContacts(("将联系人从服务器以zip格式下载到apps目录。

public string GetTemporaryDirectory()
    {
        string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
        Directory.CreateDirectory(tempDirectory);
        return tempDirectory;
    }

这只是找到一个临时文件夹,用于将联系人提取到,然后从Outlook导入。

private void ExtractContacts(string sExtractPath)
    {
        string sImportPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
        string sZipPath = sImportPath.Substring(6, sImportPath.Length - 6) + "/contacts.zip";
        ZipFile.ExtractToDirectory(sZipPath, sExtractPath);
    }

这会将下载的联系人从 zip 提取到临时文件夹。

private void ImportContacts(string sImportPath)
    {
        var oldContacts = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items.Cast<Outlook.ContactItem>()
            .Where(c => c.ManagerName.Equals("QERP"));
        foreach (var oldContact in oldContacts)
        {
            oldContact.Delete();
        }
        var newContacts = Directory.GetFiles(sImportPath, "*.vcf").Select(Application.Session.OpenSharedItem).Cast<Outlook.ContactItem>();
        foreach (var newContact in newContacts)
        {
            newContact.ManagerName = "QERP";
            newContact.Save();
        }
    }

这将删除我们下载的旧联系人,而不是此应用程序未下载的联系人。

问题是它不会删除所有联系人。出于某种原因,它总是删除 half+1。

C# Outlook VSTO 联系人在删除时复制

我建议从发布底层 COM 对象开始,避免在单行代码中使用多个点。例如:

 Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items

应用程序类的 Session 属性返回应在之后释放的命名空间类的实例。命名空间类的 GetDefaultFolder 方法返回 MAPIFolder 类的实例,该实例也应释放。

使用

System.Runtime.InteropServices.Marshal.ReleaseComObject 在完成使用 Outlook 对象后释放该对象。如果您的外接程序尝试枚举存储在 Exchange 服务器上的集合中的 256 个以上的 Outlook 项目,这一点尤其重要Microsoft。如果不及时释放这些对象,则可能会达到 Exchange 对一次打开的最大项目数施加的限制。然后在 Visual Basic 中将变量设置为 Nothing(在 C# 中为 null(以释放对该对象的引用。在系统地释放对象一文中阅读有关此内容的更多信息。

    foreach (var oldContact in oldContacts)
    {
        oldContact.Delete();
    }

请改用for循环。它将允许立即释放代码中的基础COM对象。对于删除Outlook项目,我建议使用while循环,您可以在其中查看可用项目的数量或减少计数器的for循环。

删除项目时不要使用 "foreach" 循环 - 您正在修改集合,从而跳过一半的项目。使用向下"for"循环

Outlook.Items items = oldContacts.Items;
for (int i = items.Count; i >= 1; i--)
{
   Outlook.ContactItem contact = items[i] as Outlook.ContactItem; 
   if (contact != null)  //could be a distribution list
   {
      contact.Delete();
   } 
}

它正在工作并删除所有联系人。我想通了一些东西。帮助我进行干净的编码。

    private void Contact_Sil()
    {
        var Eski_Contacts = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items.Cast<Outlook.ContactItem>();
        while ( Eski_Contacts.Count()>0)
        {
            Eski_Contacts = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items.Cast<Outlook.ContactItem>();
            foreach (var oldContact in Eski_Contacts)
            {
                oldContact.Delete();
            }                
        }
    }