ナレッジ ベース KB0203

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

問題

OfficeではCOMを使用してオートメーション オブジェクトを公開しています。マネージ コードでは、C# and Visual Basic, the COM objects are wrapped in Runtime Callable Wrappers (RCWs). Without any special action by the programmer, COM objects wrapped in RCWs are released only on Garbage Collection, which in the absence of memory pressure may be never.#および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)