一些单词调用get_SynonymInfo时会抛出内存不足异常。

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预览版上测试了此方法。对于超过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

我知道这些词会导致异常:

  • elite(但"elites"可行)
  • near
  • tuck
  • tucks
  • walking
  • onboard
  • horrified

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

在微软Word中手动使用同义词词典可以为所有单词提供正确的结果。

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


更新:我在本地编程网络论坛上被告知这段代码适用于Office 2007。令我惊讶的是,它确实有效。但是,根据本问题所述,在Office 2010和2013预览版中,它无法正常工作,至少在我的计算机/虚拟机上不行。然后我尝试引用Office 14 PIA而不是Office 12,但在Office 2013 Preview下,它的行为与前者相同。


2
似乎Word存在一个长期存在的问题,因为在2013年(据我所知)仍然存在。这个https://groups.google.com/forum/?hl=en&fromgroups=#!topic/microsoft.public.office.developer.automation/ex58NtYsJmc建议使用Excel。 - Fionnuala
错误看起来一样,但是那个线程中的“pale”和“deflate”都对我有效。 - Goran Rakic
2
我认为可能的问题是所有这些单词在含义列表中都有同形异义词。例如,“elite”有“best(名词)”和“best(形容词)”。SynonymInfo接口无法同时表示两者。Word 2007将其显示为同义词面板中的两个不同条目,但Word 2010和2013预览版将其显示为合并的“best(名词/形容词)”条目。 - Goran Rakic
3个回答

9
我能在我的电脑上的Word 2010重现这个问题。错误代码(HResult)为-21468224640x800A16C0,在互联网上找不到任何解释。
正如Remou所指出的,这个问题早在2002年就已存在。
只有当Word中的同义词列表包含两种或更多类型(例如adj. / v.n. / v.adj. / n.)的一个或多个同义词时,该问题才会发生。语言/字典并不重要。例如,onboardwdEnglishUK中没有这个单词,因此会在wdEnglishUS中返回错误。其他单词在两个字典中都存在,并且在任一情况下都会出错。
显然,这是一个错误,仅在Word交互操作中出现问题,因为Word本身可以显示所有内容而无需任何问题。据我所知,这是交互操作允许您获取同义词信息的唯一方法,因此没有解决方法。

0

如果你在 MS Word 中输入你的“不良”词汇并检查其同义词,会得到什么结果?它能够正常工作吗?你可能会得到一个额外的对话框,在 API 中无法处理它吗?


1
如果在更新之前阅读第二行,它会说:“在Microsoft Word中手动使用同义词词典可以为所有单词提供正确的结果。”没有其他对话框。 - Goran Rakic

0

我遇到了与“ONE”这个单词相同的问题。我有一个异常列表来捕获它...但是有170,000个单词,我怀疑我能够全部捕获:)。这真的很令人沮丧。

我有一个伪解决方法,我将“Excludes”定义为字符串,然后使用以下行来捕获错误的单词:

如果InStr(Excludes,“[”& AddYourArrayWordHere &“]”)那么AddYourArrayWordHere =“”


我还加入了一个错误处理程序,以防万一它不在我的异常列表中,可以“跳过”那个单词。 - David Chandler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接