知識マップ: 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操作自体を推奨せずサポートもしないと明言しており、タスクスケジューラの無人ジョブでは別の手段への置き換えが求められる。

PowerShellからCOMと.NETを呼ぶ実践の知識マップPowerShellが.NETとCOMの上でAdd-TypeやNew-Object -ComObjectを使い分けること、RCWによるCOM参照管理とEXCEL.EXEの残留問題、Marshal.ReleaseComObjectによる後始末、無人実行でのExcel COM操作が非推奨である理由の関係を示す図利用する利用するの後継利用する利用する実装を担う利用する前提とする利用する原因になり得る利用する原因になり得る原因になり得る防止する前提とする用いるのは非推奨前提とする利用する前提とする原因になり得るPowerShellCOM(コンポーネントオブジェクトモデル).NET(Core以降)PowerShell 7Windows PowerShell 5.1.NET FrameworkAdd-TypeP/InvokeNew-Object -ComObjectProgID(Programmatic Identifier)WScript.ShellRCW(Runtime Callable Wrapper)Excel COM自動化(Excel COM Interop)EXCEL.EXEのプロセス残留Marshal.ReleaseComObjectタスクスケジューラの無人実行COMアパートメントモデル(STA/MTA)ZipFile/ZipArchive APIP/Invokeシグネチャ誤りによるクラッシュ

概念間の関係(全20件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

PowerShell
オブジェクトパイプラインとエラー処理機構を持つ、Microsoftが最も堅牢で最新のWindows自動化に推奨するコマンドラインシェル兼スクリプト言語。
COM(コンポーネントオブジェクトモデル)
公開インターフェース、レジストリ登録、Apartment Modelなどを土台にした、Windowsのバイナリ互換コンポーネントモデル。
.NET(Core以降)
.NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。
PowerShell 7
PowerShell Core系譜の最新世代で、.NET(Core以降)上に構築されたPowerShellのエディション。実行ファイルはpwsh.exeで5.1のpowershell.exeとサイドバイサイドに共存し、Out-File・Set-Content・Export-Csvなどの既定書き込みencodingはBOMなしUTF-8である。
Windows PowerShell 5.1
Windowsに標準で同梱されている、.NET Framework上に構築されたレガシー世代のPowerShell(5.1系)のランタイム。実行ファイルはpowershell.exeで、.NETアプリからはMicrosoft.PowerShell.5.1.ReferenceAssembliesを介して呼び出せる。
Add-Type
C#のソースコードをその場でコンパイルしてPowerShellのセッションに型として追加できるコマンドレット。DllImportを渡せばP/InvokeでWin32 APIも呼び出せる。
New-Object -ComObject
ProgIDを指定してCOMオブジェクトのインスタンスを作成するNew-Objectコマンドレットの使い方。VBScriptのCreateObjectに相当する。
Excel COM自動化(Excel COM Interop)
C#などの外部プログラムからCOM経由でExcelアプリケーション本体を起動・操作する自動化方式。
RCW(Runtime Callable Wrapper)
.NETがCOMオブジェクトを操作するために生成するプロキシ。COMインターフェイスポインターをキャッシュし、GCに回収されるときにCOMオブジェクトへの参照を解放する。
Marshal.ReleaseComObject
RCWの内部参照カウントをデクリメントし、0になった時点でRCWが握るCOM参照を即座に解放する.NETのAPI。公式には絶対に必要な場合にのみ使うことが推奨される。
ZipFile/ZipArchive API
ZIPアーカイブの作成・展開・読み取りを行う.NETのクラス群。Compress-Archive/Expand-Archiveコマンドレットの基盤でもあり、最大ファイルサイズ2GBの制限がある。
P/Invoke
C#などの.NETコードからアンマネージドなC関数群を呼び出すための、.NETの標準的な相互運用機構。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。