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 Studio2010で.Net4.0を使用し、Office12PIAを参照してMicrosoftOffice2010およびMicrosoftOffice2013Previewでこれを試しました。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でシソーラスを手動で使用すると、すべての単語に対して適切な結果が得られます。
どうすれば例外を回避し、相互運用コードを使用して結果を得ることができますか?他のAPIを使用した有効な代替手段はありますか?
更新:ローカルプログラミングWebフォーラムで、このコードはOffice 2007で機能すると言われました。驚いたことに、機能します。しかし、この質問で述べたようにOffice 2010および2013プレビューでは、少なくとも私のコンピューター/VMでは機能しません。次に、Office12ではなくOffice14 PIAを参照しようとしましたが、Office2013Previewでは同じように動作します。