Outlook返回错误:消息传递接口返回了未知错误

时间:2010-12-29 14:18:22

标签: c# outlook

我在使用一段代码时遇到了一些问题,我试图将数据从源(此时是访问数据库)导入到自定义表单中,但我一直遇到上述错误。

当我在源数据库中使用VBscript时,所有联系人都正确导入。 当我修复PST时,它仍然会出现此错误。 当我添加450毫秒的延迟。错误也会发生,但稍后会在此过程中发生。 打开或关闭Outlook并不重要。

我使用以下方法

string[] arrFolders = strFolders.Split('\\');

        Outlook.Application app = null;
        Outlook.MAPIFolder folder = null;

        try {
            app = new Outlook.Application();
            folder = app.GetNamespace("MAPI").Folders[arrFolders[0]];
        } catch (Exception ex) {
            writeLogLine("Error creating Outlook instance: " + ex.Message);
            MessageBox.Show("Error creating Outlook instance\r\n" + ex.Message);
            intErrorCount++;
            blnHasErrors = true;
            blnAbort = true;
        }

        try {
            for (int i = 1; i < arrFolders.Length; i++) {
                folder = folder.Folders[arrFolders[i]];
            }
        } catch (Exception ex) {
            writeLogLine("Error navigating to DRM folder: " + ex.Message);
            MessageBox.Show("Error navigating to DRM folder\r\n" + ex.Message);
            intErrorCount++;
            blnHasErrors = true;
            blnAbort = true;
        }

        setProgressbarMaximum(dtResults.Rows.Count);
        setProgressbarMode(ProgressBarStyle.Continuous);

        //int intRowCount = 0;

        foreach (DataRow drItem in dtResults.Rows) {

            if (strDRMType == "Contact") {
                try {
                    Outlook.ContactItem x = (Outlook.ContactItem)folder.Items.Add("IPM.Contact." + strFormName);

                    for (int i = 0; i < arrMappings.GetLength(0); i++) {

                        if (arrMappings[i, 1] != null && drItem[arrMappings[i, 0]].ToString() != "") {
                            x.UserProperties[arrMappings[i, 1]].Value = drItem[arrMappings[i, 0]].ToString();
                        }
                    }

                    x.Save();
                } catch (Exception ex) {
                    writeLogLine("Error importing contact: " + ex.Message);
                    intErrorCount++;
                    blnHasErrors = true;
                }
            }

正如我所说,当我循环代码时,它将在100到200个联系人之后抛出异常,当我添加延迟时它会在失败之前联系400/500。

此代码应该用于此特定表单的通用导入工具,因此无需将源列名称硬编码到导入代码中的表单字段。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我假设这不是Outlook加载项,因为你说OL是开放还是关闭无关紧要,对吗?

您可能想要做的一件事是确保在完成COM对象后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject(...)释放它们。此外,当您使用像“namespace.Folders [..] .Name”这样的点表示法时,您实际上是在泄露对Folders集合对象和Folder对象的引用。

当你在循环中执行folders.Items.Add(...)时,会泄漏很多对象。

因此,首先清理您的COM引用,看看它会如何影响您的情况。

以下是我通常使用COM对象的方法:

MyComLib.Foo foo = null;
try
{
   foo = new MyComLib.Foo();
   foo.DoSomething();
} catch(COMException exc)
{
   // handle error, or rethrow
}
finally
{
   if(foo != null)
      Marshal.ReleaseComObject(foo);
}