13

我有一个简单的测试程序,使用 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)
    }
}

使用 Visual Studio 2010 中的 .Net 4.0 并参考 Office 12 PIA,在 Microsoft Office 2010 和 Microsoft Office 2013 Preview 中进行了尝试。对于超过 150 000 个不同的单词,这就像一个魅力。但我注意到,对于某些话,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 中的词库可为所有单词提供正确的结果。

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


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

4

3 回答 3

9

我可以在 Word 2010 上的计算机上重现此问题。错误代码 (HResult) 为-2146822464or 0x800A16C0,在 Internet 上找不到任何内容。

正如Remou所说,这个问题早在 2002 年就已经存在。

如果Word中的同义词列表包含两种或多种类型的一个或多个同义词(例如adj. / v.n. / v.adj. / n.),就会发生这种情况。语言/字典无关紧要。例如,onboard返回错误 inwdEnglishUS而不是 in wdEnglishUK,因为后者不认识这个词。其他词在两个字典中都存在,并且在任何一种情况下都会出错。

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

于 2013-02-21T23:02:17.493 回答
0

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

于 2012-09-09T08:56:37.090 回答
0

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

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

If InStr(Excludes, "[" & AddYourArrayWordHere & "]") Then AddYourArrayWordHere = ""

于 2021-05-01T22:22:18.050 回答