get_SynonymInfo会为某些单词抛出不足的内存异常

Gor*_*kic 12 c# ms-word office-interop

我有一个简单的测试程序,使用Microsoft Word Interop从Thesaurus字典中获取单词含义:

using System;
using Word = Microsoft.Office.Interop.Word;

class Program
{
    static void Main(string[] args)
    {
        string word = "elite"; // = "common";

        var app = new Word.Application();
        var synInfo = app.SynonymInfo[word, Word.WdLanguageID.wdEnglishUS];

        if (synInfo.Found && synInfo.MeaningCount > 0)
        {
            foreach (var meaning in synInfo.MeaningList as Array)
                Console.WriteLine(meaning.ToString());
        }

        // release memory and quit Word app... (see below)
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Microsoft Office 2010和Microsoft Office 2013 Preview在Visual Studio 2010中使用.Net 4.0,引用Office 12 PIA.对于超过15万个不同的词,这就像一个魅力.但我注意到,对于某些词,方法get_SynonymInfo抛出异常:

Unhandled Exception: System.Runtime.InteropServices.COMException: Insufficient memory or disk space.
   at Microsoft.Office.Interop.Word.ApplicationClass.get_SynonymInfo(String Word, Object& LanguageID)
   at WordInteropTest.Program.Main(String[] args) in Program.cs:line 11
Run Code Online (Sandbox Code Playgroud)

我知道这些话引起了异常:

  • 精英(但"精英"的作品)
  • 塔克斯
  • 步行
  • 在船上
  • 吓坏了

这与异常无关,但为了提供完整的源代码,我确实会释放内存并正确退出Word应用程序.退出测试程序时,进程列表中没有msword.exe.

        // release memory and quit Word app... (continuing from above)
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(synInfo);
        app.Quit(Word.WdSaveOptions.wdDoNotSaveChanges);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(app);
Run Code Online (Sandbox Code Playgroud)

手动使用Microsoft Word中的同义词库为所有单词提供正确的结果.

如何使用Interop代码避免异常并获得结果?是否有使用其他API的有效替代方案?


更新:我在本地编程网络论坛上被告知此代码适用于Office 2007.令我惊讶的是,确实如此.但是,如此问题中所述的Office 2010和2013 Preview不起作用,至少在我的计算机/ VM上不起作用.然后我尝试引用Office 14 PIA而不是Office 12,但使用Office 2013 Preview时,其行为相同.

Dan*_*ker 8

我可以在Word 2010上的计算机上重现此问题.错误代码(HResult)是-2146822464或者0x800A16C0,在互联网上没有任何内容可以找到.

正如Remou所说,这个问题早在2002年就存在了.

它发生当且仅当在Word中的同义词列表包含两种或多种类型的一个或多个同义词(如ADJ./诉,ñ./诉形容词./ N. ).语言/词典并不重要.例如,onboard返回错误wdEnglishUS但不在wdEnglishUK,因为后者不知道该单词.两个词典中都存在其他词,并且在任何一种情况下都会出错.

显然这是一个错误,只有Word互操作的问题,因为Word本身显示它没有问题.据我所知,这是互操作允许你获取同义词信息的唯一方法,并且没有解决方法.