Подтвердить что ты не робот

Get_SynonymInfo выбрасывает недостаточное исключение памяти для некоторых слов

У меня есть простая тестовая программа, использующая 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, используя .Net 4.0 в Visual Studio 2010, ссылаясь на Office 12 PIA. Для более чем 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

Я знаю, что эти слова вызывают исключение:

  • элита (но работает "элиты" )
  • около
  • складку
  • Tucks
  • ходьба
  • на борту
  • ужаснулся

Это не имеет никакого отношения к исключению, но чтобы предоставить полный исходный код, я освобождаю память и правильно закрываю приложение 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?


Обновление: Мне сказали на местном веб-форуме по программированию, что этот код работает с Office 2007. И, к моему удивлению, он делает, Но с Office 2010 и 2013 Preview, как указано в этом вопросе, он не работает, по крайней мере, на моих компьютерах/виртуальных машинах. Затем я попытался использовать Office 14 PIA вместо Office 12, но с Office 2013 Preview это ведет себя одинаково.

4b9b3361

Ответ 1

Я могу воспроизвести эту проблему на своем компьютере в Word 2010. Код ошибки (HResult) - это -2146822464 или 0x800A16C0, на котором нет ничего, что можно найти в Интернете.

Как отмечает Remou, эта проблема уже существовала в 2002 году.

Это происходит, если список синонимов в Word содержит один или несколько синонимов двух или более типов (например, adj./v., n./v. или adj./n.). Язык/словарь не имеет значения. Например, onboard возвращает ошибку в wdEnglishUS, но не в wdEnglishUK, так как последняя не знает этого слова. Другие слова существуют в обоих словарях и дают ошибку в любом случае.

По-видимому, это ошибка, и только проблема для Word interop, поскольку сам Word показывает все это без проблем. Насколько я могу найти, это единственный способ, которым interop позволяет получить информацию о синониме, и нет никакой работы.

Ответ 2

Какой результат, если вы введете свои "плохие" слова в MS Word и проверьте его синонимы? Он работает там? Может быть, вы получите дополнительный диалог, который не обрабатывается в API?