c# - 与 Outlook 互操作的 OpenSharedItem 在 Office 2003 中抛出奇怪的异常,与 Office 2008 一起工作

标签 c# .net office-interop outlook-2003

我正在使用 Office 互操作 API 打开从 Outlook 保存的 .msg 文件,然后显示回复窗口以允许用户回复它。

运行 Office 2003 时,OpenSharedItem(pathToMSGFile);调用抛出以下异常:

Unhandled Exception: System.AccessViolationException: Attempted to read or write
  protected memory. This is often an indication that other memory is corrupt.
  at Microsoft.Office.Interop.Outlook._NameSpace.OpenSharedItem(String Path)
  at OutlookTest.Program.Main(String[] args)

运行 Office 2008 时,它运行得非常好。

我整理了一个小测试用例,代码如下:

static void Main(string[] args)
{
    try
    {
        Application app;
        string pathToMSGFile = "\\\\path\\to\\foobar.msg";

        if (args.Length > 0)
        {
            pathToMSGFile = args[0];
        }

        if (!File.Exists(pathToMSGFile))
        {
            Console.WriteLine("{0} does not exist.", pathToMSGFile);
            return;
        }

        Console.WriteLine("Opening {0}", pathToMSGFile);

        Type olType = Type.GetTypeFromProgID("Outlook.Application", false);

        app = Activator.CreateInstance(olType) as Application;

        MailItem fld = (MailItem)app.Session.OpenSharedItem(pathToMSGFile);

        _MailItem reply = fld.ReplyAll();
        reply.Save();
        reply.Display(false);

        Console.ReadKey();

        reply.Close(OlInspectorClose.olDiscard);
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.ToString());

        if (ex.InnerException != null)
        {
            Console.WriteLine(ex.InnerException.ToString());
        }
    }

    Console.ReadKey();
}

该应用程序的目标是 .Net 4,使用 Office12 互操作库。无论它是为 AnyCPU 还是为 x86 编译的,都会发生同样的情况。

最佳答案

我注意到互操作库的版本 11 不包含 OpenSharedItem() 方法。

从版本 12 开始可用。

似乎此操作在 Office 11/2003 上不可用(至少不能通过在任何版本的互操作库上调用该方法)。


我不确定这是否适合您的情况,但我在 Outlook Redemption 库中取得了很好的成功。

来自 What is Outlook Redemption? :

Outlook Redemption works around limitations imposed by the Outlook Security Patch plus provides a number of objects and functions to work with properties and functionality not exposed through the Outlook object model.

Redemption library also includes the RDO (Redemption Data Objects) family of objects that can function as a complete CDO 1.21 or Outlook Object Model replacement.

它似乎通过不同版本的 Outlook 规避了其中一些奇怪/不一致的行为(通过设计或作为原始目标的“副作用”)。

如果您在其他方面熟悉 CDO,那么您会对 RDO 感到满意。但老实说,我不知道它是如何“映射”到 Microsoft.Office.Interop.Outlook 的。

引用http://www.dimastr.com/redemption/rdo/rdosession.htm

Session.OpenSharedItem() 的等效 RDO 函数是 RDOSession.GetMessageFromMsgFile()

注意,我与该产品没有任何关系,只是我偶尔使用过它! :-)

关于c# - 与 Outlook 互操作的 OpenSharedItem 在 Office 2003 中抛出奇怪的异常,与 Office 2008 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12782033/

相关文章:

c# - 如何将多个对象传递到 IEnumerable 列表中?

c# - C# 编译器或 JIT 在什么级别优化应用程序代码?

c# - 如何检查字符串是否包含特定 unicode 范围内的所有字符?

c# - .NET 应用程序最稳定的时间戳源是什么?

c# - 为 StyleCop 拼写检查指定 CustomDictionary 文件的路径

asp.net - ApplicationClass Documents.Open 为 64 位系统上的 ASP.NET 站点返回 null

c# - 在 Word 互操作中访问当前文档

c# - 如何从 C# 应用程序中正确清理 Excel 互操作对象?

c# - ASP.Net MVC ModelState/Html.TextBox 回发问题

java - 可以使用类接口(interface)代替 AOP 来实现关注点分离吗?