知識マップ: PowerShellからCOMと.NETを呼ぶ実践 ── スクリプトの届く範囲を一気に広げる
記事「PowerShellからCOMと.NETを呼ぶ実践 ── スクリプトの届く範囲を一気に広げる」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
PowerShellは.NETの上に構築されており、[型]::メソッドやNew-Object -ComObjectを使えば、コマンドレットにない.NETクラスやCOMオブジェクトを直接呼び出せる。Add-TypeはC#コードをその場でコンパイルしてセッションに型を追加でき、DllImportを渡せばP/Invoke経由でWin32 APIも扱えるが、シグネチャを誤るとプロセスごと落ちる。New-Object -ComObjectで作ったCOMオブジェクトはRCWというプロキシ越しに参照カウントで寿命が管理され、参照が残るとExcelなどのプロセスが終了しない。Marshal.ReleaseComObjectによる解放はこれを防ぐが、より根本的にはMicrosoftが無人実行でのExcel COM操作自体を推奨せずサポートもしないと明言しており、タスクスケジューラの無人ジョブでは別の手段への置き換えが求められる。
flowchart LR
accTitle: PowerShellからCOMと.NETを呼ぶ実践の知識マップ
accDescr: PowerShellが.NETとCOMの上でAdd-TypeやNew-Object -ComObjectを使い分けること、RCWによるCOM参照管理とEXCEL.EXEの残留問題、Marshal.ReleaseComObjectによる後始末、無人実行でのExcel COM操作が非推奨である理由の関係を示す図
powershell["PowerShell"]
com["COM(コンポーネントオブジェクトモデル)"]
dotnet[".NET(Core以降)"]
powershell_7["PowerShell 7"]
windows_powershell_5_1["Windows PowerShell 5.1"]
dotnet_framework[".NET Framework"]
add_type["Add-Type"]
p_invoke["P/Invoke"]
new_object_comobject["New-Object -ComObject"]
progid["ProgID(Programmatic Identifier)"]
wscript_shell["WScript.Shell"]
rcw["RCW(Runtime Callable Wrapper)"]
excel_com_automation["Excel COM自動化(Excel COM Interop)"]
excel_com_process_residue["EXCEL.EXEのプロセス残留"]
release_com_object["Marshal.ReleaseComObject"]
task_scheduler["タスクスケジューラの無人実行"]
com_apartment_model["COMアパートメントモデル(STA/MTA)"]
ziparchive_api["ZipFile/ZipArchive API"]
pinvoke_signature_risk["P/Invokeシグネチャ誤りによるクラッシュ"]
powershell_7 -->|"利用する"| dotnet
windows_powershell_5_1 -->|"利用する"| dotnet_framework
dotnet -->|"の後継"| dotnet_framework
powershell -->|"利用する"| com
powershell -->|"利用する"| add_type
add_type -->|"実装を担う"| p_invoke
powershell -->|"利用する"| new_object_comobject
new_object_comobject -->|"前提とする"| progid
powershell -.->|"利用する"| wscript_shell
new_object_comobject -->|"原因になり得る"| rcw
excel_com_automation -->|"利用する"| new_object_comobject
excel_com_automation -.->|"原因になり得る"| excel_com_process_residue
rcw -->|"原因になり得る"| excel_com_process_residue
release_com_object -.->|"防止する"| excel_com_process_residue
release_com_object -->|"前提とする"| rcw
excel_com_automation -->|"用いるのは非推奨"| task_scheduler
excel_com_automation -->|"前提とする"| com_apartment_model
powershell -.->|"利用する"| ziparchive_api
ziparchive_api -.->|"前提とする"| add_type
p_invoke -.->|"原因になり得る"| pinvoke_signature_risk
概念間の関係(全20件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- PowerShell 7は.NET(Core以降)を利用します。
- Windows PowerShell 5.1は.NET Frameworkを利用します。
- .NET(Core以降)は.NET Frameworkの後継に当たります。
- PowerShellはCOM(コンポーネントオブジェクトモデル)を利用します。
- PowerShellはAdd-Typeを利用します。
- Add-TypeはP/Invokeの実装を担います。
- PowerShellはNew-Object -ComObjectを利用します。
- New-Object -ComObjectはProgID(Programmatic Identifier)を前提とします。
- PowerShellはWScript.Shellを利用します。
- New-Object -ComObjectはRCW(Runtime Callable Wrapper)の原因になることがあります。
- Excel COM自動化(Excel COM Interop)はNew-Object -ComObjectを利用します。
- Excel COM自動化(Excel COM Interop)はEXCEL.EXEのプロセス残留の原因になることがあります。
- RCW(Runtime Callable Wrapper)はEXCEL.EXEのプロセス残留の原因になることがあります。
- Marshal.ReleaseComObjectはEXCEL.EXEのプロセス残留を防ぎます。
- Marshal.ReleaseComObjectはRCW(Runtime Callable Wrapper)を前提とします。
- Excel COM自動化(Excel COM Interop)をタスクスケジューラの無人実行に用いることは推奨されません。
- Excel COM自動化(Excel COM Interop)はCOMアパートメントモデル(STA/MTA)を前提とします。
- PowerShellはZipFile/ZipArchive APIを利用します。
- ZipFile/ZipArchive APIはAdd-Typeを前提とします。
- P/InvokeはP/Invokeシグネチャ誤りによるクラッシュの原因になることがあります。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。