【问题标题】:Creating Outlook Application Object reference not set to an instance of an object创建未设置为对象实例的 Outlook 应用程序对象引用
【发布时间】:2013-02-12 10:00:43
【问题描述】:

您好,我正在创建一个新的 Outlook.Application(使用 v.14.0.0.0 Office 库)并使用 C# 检索收件箱电子邮件。只有当 Outlook 没有运行时,我才会收到错误

'对象引用未设置为对象的实例'

在警报中(发生在第一行)。该程序正在运行(甚至没有进入 catch 部分)。

try {
    Outlook.Application outlookApplication = new Outlook.Application();
    Outlook.NameSpace mapiNameSpace = outlookApplication.GetNamespace("MAPI");
    Outlook.MAPIFolder folder = mapiNameSpace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);

    foreach (Object obj in folder.Items) {
        if (obj is Outlook.MailItem) {
            Outlook.MailItem mailItem = (Outlook.MailItem)obj;
        }
    }
} catch (Exception e) {
    Console.WriteLine("Unfortunately an error occurred");
    Console.WriteLine(e.Message);
}

这个烦人的警报有什么解决方案吗?我可以压制它或解决问题吗?

警报来自 Outlook 实例,我可以看到它,因为在导航栏中打开了一个 Outlook 实例(小警报对话框)。

【问题讨论】:

  • folder 对象有 items 吗?看起来你创建了一个对象但没有初始化它。你有没有逐行调试你的代码?
  • 是文件夹有项目,131。
  • 哪一行崩溃了?
  • 哪一行给你这个错误?调试它。
  • 第一行。 Outlook.Application outlookApplication = new Outlook.Application();它不会崩溃,它只是发出警报并继续前进。

标签: c# object reference outlook instance


【解决方案1】:

您需要首先尝试获取对正在运行的实例的引用,并且仅在无法附加现有实例时创建一个新实例 (new Outlook.Application())。

This MSDN article 说得很清楚。

直接来自 MSDN 文章的无耻 rip:

Outlook.Application application = null;

// Check whether there is an Outlook process running.
if (Process.GetProcessesByName("OUTLOOK").Count() > 0)
{

    // If so, use the GetActiveObject method to obtain the process and cast it to an Application object.
    application = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
}
else
{

    // If not, create a new instance of Outlook and log on to the default profile.
    application = new Outlook.Application();
    Outlook.NameSpace nameSpace = application.GetNamespace("MAPI");
    nameSpace.Logon("", "", Missing.Value, Missing.Value);
    nameSpace = null;
}

【讨论】:

  • 这段代码看起来不错,但它不能解决关于警报对话框的问题。
  • 这听起来更像是您的 Outlook 配置有问题。也许是加载项?
  • 如果我执行此代码两次,我会得到一个错误并跳转到 catch 块。 Operation unavailable <Exception from HRESULT: 0x800401E3 <MK_E_UNAVAILABLE>>在线outlookApplication = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;我必须在程序结束时退出/退出/终止应用程序吗?
  • Outlook 是一个单例,因此您可以随时创建 Outlook.Application 的新实例 - 如果 Outlook.exe 已经在运行,您将取回正在运行的实例。
  • 我也面临同样的问题,但不幸的是这个答案并不能解决问题。
【解决方案2】:

在我的情况下,消息

'对象引用未设置为对象的实例'

被 Snag-it 插件抛出。所以这与核心 Outlook 无关。

我禁用了插件,我不再收到此消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多