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 это ведет себя одинаково.
Ответы
Ответ 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?