知識マップ: C#のExcel操作でEXCEL.EXEが残る問題 ── COM参照の解放パターンと置き換えの判断
記事「C#のExcel操作でEXCEL.EXEが残る問題 ── COM参照の解放パターンと置き換えの判断」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
C#からExcelをCOM経由で操作すると、.NETが生成するRCW(Runtime Callable Wrapper)がCOMの参照カウントを介してオブジェクトを保持し続けるため、Quit()を呼んでも参照が残っている限りEXCEL.EXEは終了しません。ドットを2つ以上つなぐ複合式は解放手段のない匿名の中間オブジェクトを生み、これが残留の主犯になります。対策はMarshal.ReleaseComObjectを規律正しく適用する派と、処理を1メソッドに隔離してGCの3点セットに任せる派の2通りがあり、後者を基本としつつ保険としてHwndからPIDを特定したプロセスKillを組み合わせます。さらにサーバーサイドでのOffice自動化はMicrosoftが非サポートと明言しており、無人実行の帳票生成はExcelを起動しないOpen XML SDKやClosedXMLへ置き換えるのが安全です。
flowchart LR
accTitle: 「C#のExcel COM操作でEXCEL.EXEが残る問題の知識マップ」
accDescr: RCWとCOMの参照カウントがEXCEL.EXEの残留をどう引き起こすか、2ドットルールが匿名の中間オブジェクトを生む仕組み、ReleaseComObject派とGC隔離派という2つの解放パターン、保険としてのプロセスKill、サーバーサイド自動化が非サポートでOpen XML SDKやClosedXMLへの置き換えが推奨されることを示す図
excel_process_leak["EXCEL.EXEプロセスの残留"]
excel_com_automation["Excel COM自動化(Excel COM Interop)"]
rcw["RCW(Runtime Callable Wrapper)"]
com_reference_count["COMの参照カウント"]
excel_exe_process["EXCEL.EXE(Excelの自動化サーバー)"]
quit_method["Application.Quit()"]
release_com_object["Marshal.ReleaseComObject"]
gc_collect_pattern["GC 3点セット(Collect→WaitForPendingFinalizers→Collect)"]
two_dot_rule["2ドットルール"]
anonymous_intermediate_com_object["匿名の中間COMオブジェクト(中間RCW)"]
method_isolation_pattern["メソッド隔離パターン"]
com_scope_wrapper["using規律化ラッパー(ComScope)"]
excel_process_kill["EXCEL.EXEの強制終了(保険のKill)"]
hwnd_getwindowthreadprocessid["Hwnd + GetWindowThreadProcessId によるPID特定"]
pid_reuse_risk["PIDの再利用リスク"]
server_side_office_automation["サーバーサイドのOffice自動化"]
open_xml_sdk["Open XML SDK"]
closedxml["ClosedXML"]
automation_security_force_disable["AutomationSecurity強制無効化(msoAutomationSecurityForceDisable)"]
untrusted_workbook_macro_risk["外部由来ブックのマクロ実行リスク"]
excel_com_automation -->|"利用する"| rcw
rcw -->|"前提とする"| com_reference_count
rcw -.->|"原因になり得る"| excel_process_leak
excel_exe_process -->|"前提とする"| com_reference_count
quit_method -.->|"前提とする"| release_com_object
quit_method -.->|"前提とする"| gc_collect_pattern
release_com_object -->|"軽減する"| excel_process_leak
gc_collect_pattern -->|"軽減する"| excel_process_leak
two_dot_rule -->|"防止する"| anonymous_intermediate_com_object
anonymous_intermediate_com_object -.->|"原因になり得る"| excel_process_leak
method_isolation_pattern -->|"前提とする"| gc_collect_pattern
method_isolation_pattern -->|"軽減する"| anonymous_intermediate_com_object
com_scope_wrapper -->|"軽減する"| excel_process_leak
method_isolation_pattern -->|"推奨される対応"| excel_process_leak
excel_process_kill -.->|"推奨される対応"| excel_process_leak
excel_process_kill -->|"前提とする"| hwnd_getwindowthreadprocessid
hwnd_getwindowthreadprocessid -->|"軽減する"| pid_reuse_risk
excel_com_automation -->|"用いるのは非推奨"| server_side_office_automation
server_side_office_automation -.->|"原因になり得る"| excel_process_leak
open_xml_sdk -->|"推奨される対応"| server_side_office_automation
closedxml -->|"利用する"| open_xml_sdk
closedxml -->|"防止する"| excel_process_leak
automation_security_force_disable -->|"軽減する"| untrusted_workbook_macro_risk
excel_com_automation -.->|"利用する"| automation_security_force_disable
概念間の関係(全24件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- Excel COM自動化(Excel COM Interop)はRCW(Runtime Callable Wrapper)を利用します。
- RCW(Runtime Callable Wrapper)はCOMの参照カウントを前提とします。
- RCW(Runtime Callable Wrapper)はEXCEL.EXEプロセスの残留の原因になることがあります。
- EXCEL.EXE(Excelの自動化サーバー)はCOMの参照カウントを前提とします。
- Application.Quit()はMarshal.ReleaseComObjectを前提とします。
- Application.Quit()はGC 3点セット(Collect→WaitForPendingFinalizers→Collect)を前提とします。
- Marshal.ReleaseComObjectはEXCEL.EXEプロセスの残留を軽減します。
- GC 3点セット(Collect→WaitForPendingFinalizers→Collect)はEXCEL.EXEプロセスの残留を軽減します。
- 2ドットルールは匿名の中間COMオブジェクト(中間RCW)を防ぎます。
- 匿名の中間COMオブジェクト(中間RCW)はEXCEL.EXEプロセスの残留の原因になることがあります。
- メソッド隔離パターンはGC 3点セット(Collect→WaitForPendingFinalizers→Collect)を前提とします。
- メソッド隔離パターンは匿名の中間COMオブジェクト(中間RCW)を軽減します。
- using規律化ラッパー(ComScope)はEXCEL.EXEプロセスの残留を軽減します。
- メソッド隔離パターンはEXCEL.EXEプロセスの残留に対する本記事の推奨です。
- EXCEL.EXEの強制終了(保険のKill)はEXCEL.EXEプロセスの残留に対する本記事の推奨です。
- EXCEL.EXEの強制終了(保険のKill)はHwnd + GetWindowThreadProcessId によるPID特定を前提とします。
- Hwnd + GetWindowThreadProcessId によるPID特定はPIDの再利用リスクを軽減します。
- Excel COM自動化(Excel COM Interop)をサーバーサイドのOffice自動化に用いることは推奨されません。
- サーバーサイドのOffice自動化はEXCEL.EXEプロセスの残留の原因になることがあります。
- Open XML SDKはサーバーサイドのOffice自動化に対する本記事の推奨です。
- ClosedXMLはOpen XML SDKを利用します。
- ClosedXMLはEXCEL.EXEプロセスの残留を防ぎます。
- AutomationSecurity強制無効化(msoAutomationSecurityForceDisable)は外部由来ブックのマクロ実行リスクを軽減します。
- Excel COM自動化(Excel COM Interop)はAutomationSecurity強制無効化(msoAutomationSecurityForceDisable)を利用します。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。