EXCEL.EXEプロセスの残留
type: Concept
definition: Excel COM自動化のあと、外部クライアントに渡したCOM参照が返却されずEXCEL.EXEプロセスが終了せずに残り続ける問題。
alternative label: Excelプロセス残留問題

Excel COM自動化(Excel COM Interop)
type: Concept
definition: C#などの外部プログラムからCOM経由でExcelアプリケーション本体を起動・操作する自動化方式。
alternative label: Excel Automation
alternative label: Office Automation(Excel)
uses: RCW(Runtime Callable Wrapper)
not recommended for: サーバーサイドのOffice自動化

RCW(Runtime Callable Wrapper)
type: Concept
definition: .NETがCOMオブジェクトを操作するために生成するプロキシ。COMインターフェイスポインターをキャッシュし、GCに回収されるときにCOMオブジェクトへの参照を解放する。
alternative label: Runtime Callable Wrapper
requires: COMの参照カウント

COMの参照カウント
type: Concept
definition: COMオブジェクトの寿命を管理する仕組みで、外部に渡した参照がすべて返却される(カウントが0になる)までオブジェクトは解放されない。
alternative label: COM Reference Counting

EXCEL.EXE(Excelの自動化サーバー)
type: Concept
definition: Excelアプリケーション本体のプロセスで、COMの自動化サーバーとして外部クライアントに参照を渡す。
alternative label: Excel.exe
requires: COMの参照カウント

Application.Quit()
type: Concept
definition: Excelに終了してよいと伝えるCOMメソッド。参照の解放そのものではなく、参照が残っていればExcelは終了を待ち続ける。
alternative label: excel.Quit()

Marshal.ReleaseComObject
type: Concept
definition: RCWの内部参照カウントをデクリメントし、0になった時点でRCWが握るCOM参照を即座に解放する.NETのAPI。公式には絶対に必要な場合にのみ使うことが推奨される。
mitigates: EXCEL.EXEプロセスの残留

GC 3点セット(Collect→WaitForPendingFinalizers→Collect)
type: Concept
definition: RCWの解放をGCに任せ、Excelを触るメソッドを抜けた後にGC.Collect、WaitForPendingFinalizers、GC.Collectの順に呼んで確定的なタイミングで回収させる手法。
alternative label: GC.Collect + WaitForPendingFinalizers
mitigates: EXCEL.EXEプロセスの残留

2ドットルール
type: Concept
definition: COMオブジェクトに対してドットを2つ以上つなげず、すべての中間オブジェクトを一度変数に受けるという、Office自動化コミュニティの経験則。
alternative label: Two-Dot Rule
prevents: 匿名の中間COMオブジェクト(中間RCW)

匿名の中間COMオブジェクト(中間RCW)
type: Concept
definition: 変数に受けずに複合式の中間結果として生成されるRCWで、参照する変数がないため明示的に解放する手段がない。
alternative label: 匿名RCW

メソッド隔離パターン
type: Concept
definition: Excelを触る処理を1つのメソッドに完全に隔離し、RCWをフィールドや戻り値に逃がさないことで、GC 3点セットによる確実な回収を可能にする設計。
alternative label: Excel操作の1メソッド隔離
requires: GC 3点セット(Collect→WaitForPendingFinalizers→Collect)
mitigates: 匿名の中間COMオブジェクト(中間RCW)
recommended for: EXCEL.EXEプロセスの残留

using規律化ラッパー(ComScope)
type: Concept
definition: IDisposableでMarshal.ReleaseComObjectの呼び出しを規約化し、using宣言の逆順でCOMオブジェクトを解放させる小さなラッパー。
alternative label: ComScope
mitigates: EXCEL.EXEプロセスの残留

EXCEL.EXEの強制終了(保険のKill)
type: Concept
definition: 解放パターンを実装してもなお残るケースに備え、自分が起動したExcelインスタンスだけを特定して強制終了する最終手段。
alternative label: Process.Kill(Excel)
requires: Hwnd + GetWindowThreadProcessId によるPID特定

Hwnd + GetWindowThreadProcessId によるPID特定
type: Concept
definition: Application.Hwndプロパティでトップレベルウィンドウのハンドルを取得し、GetWindowThreadProcessIdでそのウィンドウを作成したプロセスのIDを得る、自分のExcelインスタンスを特定する方法。
alternative label: Application.Hwnd
alternative label: GetWindowThreadProcessId
mitigates: PIDの再利用リスク

PIDの再利用リスク
type: Concept
definition: WindowsのプロセスIDが再利用されるため、PIDの数値だけを覚えて後から解決すると、その間に対象プロセスが終了して同じPIDが別プロセスに割り当てられ、無関係なプロセスをKillしてしまう危険。

サーバーサイドのOffice自動化
type: Concept
definition: ASP.NET、DCOM、NTサービスなど無人・非対話のクライアントアプリケーションやコンポーネントからOfficeアプリを自動操作すること。Microsoftは推奨せずサポートもしないと明言している。
alternative label: 無人・非対話のOffice Automation

Open XML SDK
type: Concept
definition: ECMA-376/ISO・IEC 29500として標準化されたOfficeのファイル形式を、Excel本体を起動せずに強く型付けされたクラスで読み書きできるMicrosoft製ライブラリ。
alternative label: DocumentFormat.OpenXml
recommended for: サーバーサイドのOffice自動化

ClosedXML
type: Concept
definition: Open XML APIの上にブック・シート・セルという直感的なAPIを被せた、Excelのインストールなしに.xlsx/.xlsmを扱えるMITライセンスのOSSライブラリ。
uses: Open XML SDK
prevents: EXCEL.EXEプロセスの残留

AutomationSecurity強制無効化(msoAutomationSecurityForceDisable)
type: Concept
definition: プログラムからブックを開く際のマクロセキュリティを設定するプロパティ。msoAutomationSecurityForceDisableを指定すると、警告なしに開いたブックのVBAマクロを無効化する。Excel 4.0(XLM)マクロはこの設定の対象外で、Excelが別のセキュリティ確認で扱う。
alternative label: Application.AutomationSecurity
mitigates: 外部由来ブックのマクロ実行リスク

外部由来ブックのマクロ実行リスク
type: Concept
definition: COM自動化でWorkbooks.Openを使って外部由来のブックを開くと、マクロ警告なしにVBAが実行され得るリスク。

subject: Excel COM自動化(Excel COM Interop)
predicate: uses
object: RCW(Runtime Callable Wrapper)
description: .NETはExcelなどのCOMオブジェクトをRCW(Runtime Callable Wrapper)というプロキシ経由で操作する。
evidence: runtime-callable-wrapper
verified at: 2026-08-01
certainty: established

subject: RCW(Runtime Callable Wrapper)
predicate: requires
object: COMの参照カウント
description: RCWはCOMの参照カウントの仕組みの上で、GCに回収されるときにCOMオブジェクトへの参照を解放する。
evidence: runtime-callable-wrapper
verified at: 2026-08-01
certainty: established

subject: RCW(Runtime Callable Wrapper)
predicate: mayCause
object: EXCEL.EXEプロセスの残留
description: GCによる回収が遅れる、または明示的な解放がない間、RCWがCOM参照を保持し続けEXCEL.EXEプロセスの残留の原因になることがある。
evidence: runtime-callable-wrapper
verified at: 2026-08-01
certainty: context-dependent

subject: EXCEL.EXE(Excelの自動化サーバー)
predicate: requires
object: COMの参照カウント
description: EXCEL.EXEは外部クライアントに渡した参照カウントがすべて返却される(0になる)まで終了しない。
verified at: 2026-08-01
certainty: established

subject: Application.Quit()
predicate: requires
object: Marshal.ReleaseComObject
description: (a)ReleaseComObject派では、Quit()自体は解放ではないため、確実な終了にはMarshal.ReleaseComObjectによる明示的な解放と組み合わせることが前提になる。
verified at: 2026-08-01
certainty: context-dependent

subject: Application.Quit()
predicate: requires
object: GC 3点セット(Collect→WaitForPendingFinalizers→Collect)
description: (b)GC派では、Quit()自体は解放ではないため、確実な終了には処理を隔離したうえでのGC 3点セットの実行が前提になる。
evidence: runtime-callable-wrapper
verified at: 2026-08-01
certainty: context-dependent

subject: Marshal.ReleaseComObject
predicate: mitigates
object: EXCEL.EXEプロセスの残留
description: Marshal.ReleaseComObjectをすべてのCOMオブジェクトへ規律正しく適用すると、GCを待たずに決定的なタイミングでEXCEL.EXEの残留を防げる。
evidence: system.runtime.interopservices.marshal.releasecomobject
verified at: 2026-08-01
certainty: established

subject: GC 3点セット(Collect→WaitForPendingFinalizers→Collect)
predicate: mitigates
object: EXCEL.EXEプロセスの残留
description: Excelを触る処理を隔離した後にGC 3点セットを実行すると、RCWが本来の仕組みどおり回収されEXCEL.EXEの残留を防げる。
evidence: runtime-callable-wrapper
verified at: 2026-08-01
certainty: established

subject: 2ドットルール
predicate: prevents
object: 匿名の中間COMオブジェクト(中間RCW)
description: COMオブジェクトへのドットを2つ以上つなげず中間オブジェクトを変数に受ける2ドットルールは、匿名の中間COMオブジェクトの発生を防ぐ。
verified at: 2026-08-01
certainty: established

subject: 匿名の中間COMオブジェクト(中間RCW)
predicate: mayCause
object: EXCEL.EXEプロセスの残留
description: 変数に受けられていない匿名の中間RCWはMarshal.ReleaseComObjectを呼ぶ手段がなく、GCに回収されるまでEXCEL.EXEの残留の原因になることがある。
verified at: 2026-08-01
certainty: context-dependent

subject: メソッド隔離パターン
predicate: requires
object: GC 3点セット(Collect→WaitForPendingFinalizers→Collect)
description: メソッド隔離パターンは、隔離したメソッドの外でGC 3点セットを呼ぶことを前提とする。
evidence: runtime-callable-wrapper
verified at: 2026-08-01
certainty: established

subject: メソッド隔離パターン
predicate: mitigates
object: 匿名の中間COMオブジェクト(中間RCW)
description: Excel操作を1メソッドに隔離しGCに任せれば、2ドットルールを破っても匿名の中間RCWごと回収される。
evidence: runtime-callable-wrapper
verified at: 2026-08-01
certainty: established

subject: using規律化ラッパー(ComScope)
predicate: mitigates
object: EXCEL.EXEプロセスの残留
description: usingで規律化したComScopeラッパーはMarshal.ReleaseComObjectの呼び出しを規約化し、解放漏れによるEXCEL.EXEの残留を防ぐ。
evidence: system.runtime.interopservices.marshal.releasecomobject
verified at: 2026-08-01
certainty: established

subject: メソッド隔離パターン
predicate: recommendedFor
object: EXCEL.EXEプロセスの残留
description: 処理を1メソッドに隔離しGC 3点セットに任せるパターンを基本とすることが、EXCEL.EXEの残留対策として推奨される。
evidence: runtime-callable-wrapper
verified at: 2026-08-01
certainty: established

subject: EXCEL.EXEの強制終了(保険のKill)
predicate: recommendedFor
object: EXCEL.EXEプロセスの残留
description: 解放パターンを正しく実装したうえでの最後の保険として、自分のExcelインスタンスだけを特定したプロセスKillの仕込みが推奨される。
evidence: excel.application.hwnd
verified at: 2026-08-01
certainty: context-dependent

subject: EXCEL.EXEの強制終了(保険のKill)
predicate: requires
object: Hwnd + GetWindowThreadProcessId によるPID特定
description: 保険のプロセスKillは、Application.HwndとGetWindowThreadProcessIdで自分が起動したExcelのPIDを特定することを前提とする。
evidence: excel.application.hwnd
verified at: 2026-08-01
certainty: established

subject: Hwnd + GetWindowThreadProcessId によるPID特定
predicate: mitigates
object: PIDの再利用リスク
description: 起動直後にSafeHandleへ触れてOSのプロセスハンドルを明示的に開いておくことで、PIDの再利用による無関係なプロセスの取り違えを防げる。
evidence: nf-winuser-getwindowthreadprocessid
verified at: 2026-08-01
certainty: established

subject: Excel COM自動化(Excel COM Interop)
predicate: notRecommendedFor
object: サーバーサイドのOffice自動化
description: Excel COM自動化をサーバーサイドのOffice自動化に用いることは、Microsoftが推奨せずサポートもしないと明言している。
verified at: 2026-08-01
certainty: established

subject: サーバーサイドのOffice自動化
predicate: mayCause
object: EXCEL.EXEプロセスの残留
description: 対話ユーザーを前提としないサーバー環境でのOffice自動化は、ハングしたプロセスが無限に蓄積する運用問題を招くことがある。
verified at: 2026-08-01
certainty: context-dependent

subject: Open XML SDK
predicate: recommendedFor
object: サーバーサイドのOffice自動化
description: Officeをインストール・起動せずファイルを直接操作するOpen XML SDKが、サーバーサイドでの帳票生成の代替として推奨される。
evidence: considerations-unattended-automation-office-microsoft-365-for-unattended-rpa
verified at: 2026-08-01
certainty: established

subject: ClosedXML
predicate: uses
object: Open XML SDK
description: ClosedXMLはOpen XML APIの上に直感的なインターフェイスを提供するラッパーである。
evidence: ClosedXML
verified at: 2026-08-01
certainty: established

subject: ClosedXML
predicate: prevents
object: EXCEL.EXEプロセスの残留
description: ClosedXMLはExcel本体を起動せずに.xlsx/.xlsmを操作できるため、EXCEL.EXEプロセスの残留自体が発生しない。
evidence: ClosedXML
verified at: 2026-08-01
certainty: established

subject: AutomationSecurity強制無効化(msoAutomationSecurityForceDisable)
predicate: mitigates
object: 外部由来ブックのマクロ実行リスク
description: Workbooks.Openの前にAutomationSecurityをmsoAutomationSecurityForceDisableに設定すると、開いたブックのVBAマクロが警告なしに実行されるリスクを抑えられる。Excel 4.0(XLM)マクロはこの設定の対象外で、Excelが別のセキュリティ確認で扱う
evidence: microsoft.office.interop.excel. application.automationsecurity
verified at: 2026-08-01
certainty: established

subject: Excel COM自動化(Excel COM Interop)
predicate: uses
object: AutomationSecurity強制無効化(msoAutomationSecurityForceDisable)
description: COM自動化でWorkbooks.Openを使って外部由来のブックを開く場合、AutomationSecurity強制無効化を設定できる。
evidence: microsoft.office.interop.excel. application.automationsecurity
verified at: 2026-08-01
certainty: context-dependent