KB0203: マネージド コード (C#、Visual Basic、.NET) から Office Automation を使用する方法

問題

Office は COM を使用してオートメーション オブジェクトを公開します。C# や Visual Basic で使用されるマネージド コードでは、COM オブジェクトは Runtime Callable Wrappers (RCW) でラップされます。プログラマーが特別な処理を行わない場合、RCW でラップされた COM オブジェクトはガベージ コレクション時にのみ解放されますが、メモリ負荷がない場合には解放されないことがあります。

解決策

COM オブジェクトを確実に解放するには、Office から受け取ったすべてのオブジェクトについて、使用後に System.Runtime.InteropServices.Marshal.ReleaseComObject で解放してください。

注記

  • System.Runtime.InteropServices.Marshal.FinalReleaseComObject は使用しないでください。他のマネージド アドインがまだ使用している場合でも COM オブジェクトを解放してしまうためです。

  • 別のオブジェクトを経由してオブジェクトにアクセスしないでください。例:

    // C#
    // 誤り
    PowerPoint.View view = Application.ActiveWindow.View;
    ' Visual Basic
    ' 誤り
    Dim view As PowerPoint.View = Application.ActiveWindow.View

    この場合、ActiveWindow によって一時的な PowerPoint.DocumentWindow が作成されますが、解放されません。

    代わりに、変数に代入してから解放します。

    // C#
    PowerPoint.DocumentWindow wnd = Application.ActiveWindow;
    PowerPoint.View view = wnd.View;
    System.Runtime.InteropServices.Marshal.ReleaseComObject(wnd);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(view);
    ' Visual Basic
    Dim wnd As PowerPoint.DocumentWindow = Application.ActiveWindow
    Dim view As PowerPoint.View = wnd.View
    System.Runtime.InteropServices.Marshal.ReleaseComObject(wnd)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(view)