我有一个简单的测试程序,使用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在Visual Studio 2010中使用.Net 4.0,引用Office 12 PIA。对于超过15万个不同的词,这就像一个魅力。但是我注意到,对于某些单词,方法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中的同义词库为所有单词提供正确的结果。
如何使用Interop代码避免异常并获得结果?是否有使用其他API的有效替代方案?
更新:我在local programming web forum上被告知此代码适用于Office 2007.令我惊讶的是,确实如此。但是,如此问题中所述的Office 2010和2013 Preview不起作用,至少在我的计算机/ VM上不起作用。然后我尝试引用Office 14 PIA而不是Office 12,但使用Office 2013 Preview时,其行为相同。
答案 0 :(得分:8)
我可以在Word 2010上的计算机上重现此问题。错误代码(HResult)为-2146822464
或0x800A16C0
,在互联网上无法找到。
正如Remou所述,此问题已存在back in 2002。
发生 iff Word中的同义词列表包含两个或更多类型的一个或多个同义词(例如 adj。/ v。, n。/ v 。或 adj。/ n。)。语言/词典并不重要。例如,onboard
在wdEnglishUS
中的错误中返回,但在wdEnglishUK
中没有,因为后者不知道该词。两个词典中都存在其他词,并且在任何一种情况下都会出错。
显然这是一个错误,只有Word互操作的问题,因为Word本身显示它没有问题。据我所知,这是互操作允许您获取同义词信息的唯一方式,并且没有解决方法。
答案 1 :(得分:0)
如果您在MS Word中输入“坏”字并检查其同义词,结果会是什么?它在那里有用吗?你可能得到一个额外的对话框,在API中处理得不好吗?
答案 2 :(得分:0)
对于“ONE”这个词,我也遇到了同样的问题。我有一个例外列表可以捕获它......但是有 170,000 个单词,我怀疑我是否会捕获它们:)。这太令人沮丧了。
我有一个伪解决方法,我将“排除”作为字符串进行 DIMMED,然后使用这一行来捕捉坏词:
如果 InStr(Excludes, "[" & AddYourArrayWordHere & "]") 然后 AddYourArrayWordHere = ""