最近は、もっぱら RespClient がお気に入りで欲しいと思ったものをちょいちょい追加しています。
Cmdlet なので、VS で C# となります。
PowerShell ISE での function デバッグといえば、まぁごにょごにょ。
これが、Cmdlet となるとどうやるのかをちらっと見てみましょう。
目次
手順
いたってふつーです。
- Cnmdletを書く
- ビルドした dll をてきとーに配置
- PowreShell.exe を開く
- VS でプロセスをアタッチ
Import-Module .\dllの名前.dll
でモジュールをインポート- ブレークポイントをテキトーにはってCmdletを実行
これで、VS内で設定したブレークポイントで停止、デバッグが可能になります。
Cmdlet を書く
書いてください。
ビルドしたdll をテキトーに配置
はい、てきとーです。
PowerShell.exeを開く
dll のパスで、File > Open PowerShell
が楽でしょう。
VS でプロセスをアタッチ
PowerShell.exe を開いたら 開いたPowerShell プロセスを VSにアタッチしましょう。
これでみんな大好きウォッチ式も使えます。
.dll からモジュールをインポート
.dllと同一パスでPowershell.exe を開いていれば簡単でしょう。
Import-Module .\RespClient.dll
ブレークポイントをテキトーにはってCmdletを実行
VS でテキトーにブレークポイントを貼ります。
PowerShell.exe でCmdletを実行しましょう。
VSで張ったブレークポイントにフォーカスが遷移して止まったはずです。
ローカルも、ウォッチ式も使えますねー。
あとは、F10 や F11 など、ステップイン/アウトを使ったりブレークポイントをずらしたりしてはかどってください。
注意点
Add-Type などで気づかれている方も多いかと思いますが、PowerShell.exe や PowerShell ISE は、そのプロセスでインポートしたモジュール.dll
やスナップインとして読み込んだ.dll
をハンドルしっぱなしになります。
そのため、ビルドしなおして dllを再配置使用としたらファイルロックと怒られたりします。 えー、やだー
PowerShellスクリプトで書いた、スクリプトモジュールはハンドルしないのにふぇぇです。
そのため、「一度 .dll を読み込んだら、プロセスを終了しないと .dll がハンドルされる」ことを覚えておいてください。うざいですね。
Roslyn や .NET Native 、 vNext などが出て来たら改善するんでしょうか? *1
まとめ
VS のデバッグは、間違いなく ISEよりはかどります。
PowerShell Script を ISE や VSで書くよりもはかどったりするので、ぜひぜひどうぞ。
*1:いやしないだろう