ナレッジベース KB0203

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

問題

OfficeではCOMを使用してオートメーション オブジェクトを公開しています。C#およびVisual Basicで使用されているように、マネージ コードでCOMオブジェクトはランタイム呼び出し可能ラッパー (RCW) でラップされます。プログラムによる特別なアクションがない場合、RCWでラップされているCOMオブジェクトはガベージコレクションでのみリリースされます。メモリ負荷がない場合はリリースされません。

解決策

決定論的にCOMオブジェクトをリリースするには、System.Runtime.InteropServices.Marshal.ReleaseComObjectを使用後に添付してOfficeから受け取ったオブジェクトをすべてリリースしてください。

注記

  • System.Runtime.InteropServices.Marshal.FinalReleaseComObjectは使用しないでください。他の管理対象アドインがまだ使用している場合でもCOMオブジェクトをリリースするためです。

  • 以下のような別の手段でオブジェクトにアクセスしないでください。

    // C#
    // Wrong
    PowerPoint.View view = Application.ActiveWindow.View;
    ' Visual Basic
    ' Wrong
    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)

共有する