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

时间:2012-09-07 08:07:22

标签: c# ms-word office-interop

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

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)
    }
}

使用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

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

  • 精英(但“精英”的作品)
  • 步行
  • 板载
  • 惊悸

这与异常无关,但为了提供完整的源代码,我会释放内存并正确退出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);

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

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


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

3 个答案:

答案 0 :(得分:8)

我可以在Word 2010上的计算机上重现此问题。错误代码(HResult)为-21468224640x800A16C0,在互联网上无法找到。

正如Remou所述,此问题已存在back in 2002

发生 iff Word中的同义词列表包含两个或更多类型的一个或多个同义词(例如 adj。/ v。 n。/ v 。 adj。/ n。)。语言/词典并不重要。例如,onboardwdEnglishUS中的错误中返回,但在wdEnglishUK中没有,因为后者不知道该词。两个词典中都存在其他词,并且在任何一种情况下都会出错。

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

答案 1 :(得分:0)

如果您在MS Word中输入“坏”字并检查其同义词,结果会是什么?它在那里有用吗?你可能得到一个额外的对话框,在API中处理得不好吗?

答案 2 :(得分:0)

对于“ONE”这个词,我也遇到了同样的问题。我有一个例外列表可以捕获它......但是有 170,000 个单词,我怀疑我是否会捕获它们:)。这太令人沮丧了。

我有一个伪解决方法,我将“排除”作为字符串进行 DIMMED,然后使用这一行来捕捉坏词:

如果 InStr(Excludes, "[" & AddYourArrayWordHere & "]") 然后 AddYourArrayWordHere = ""