我有一个简单的测试程序,使用 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 中,它的行为相同。