Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

PowerShellからDLL(ライブラリ)を呼び出す-Add-TypeとGet-Member MagicWandWin.dllの場合

MagicWandWinというライブラリの存在を知った。.Net frameworkを利用したライブラリで、NuGetからダウンロードすることができる(リンクなどは投稿末尾参照)。

MagicWandWinには、書籍『1分間プログラミング』*1の話題に必要な機能を提供するメソッドが提供されている。例えば、

Speak(String text, String locale) 指定されたロケールの発音で、textを音声出力する。
GetHTML(String url) 指定されたURLのHTMLを出力する。
GetWikipedia(String text) 指定された文字列でWikipediaを検索し、結果を出力する。

...などなど。

これらは『1分間プログラミング』を通じて活用するのだが、メソッドの動作を確認するためだけに、コーディングとビルドを繰り返すのは効率が悪い。それはMagicWandWinに限ったことではない。必要な機能を有するライブラリが存在し、その機能を利用したいのであれば、直接スクリプトから呼び出しできればよいのだ。

PowerShellならば、それができる。特に.Net frameworkで作成されたライブラリ(DLL)であれば、話は早い。コマンド”Add-Type”を使えばよい。

Add-Type

標準ライブラリの場合

必要な機能を有するライブラリが、Windows.Net frameworkが提供するものであれば、次のコマンドで呼び出しできる。指定されたアセンブリが、PowerShellセッションに追加され、呼び出し可能となる。

Add-Type -Assembly "アセンブリ名"

例えば、”System.Windows.Forms”に備わっているメッセージ・ボックスを活用したければ、一連のコマンドは次のようになる。

Add-type -assembly "System.Windows.Forms"
[System.Windows.Forms.MessageBox]::Show("!!!!")

その他のライブラリの場合

いわゆる標準ライブラリ以外のDLLファイルでも、それが.Net frameworkで作成されたものであれば、DLLファイルのパスを指定することで、呼出しできる。

Add-Type -Path "DLLファイルのパス"

例えば、”MagicWandWin.dll”がWindowsのシステム・フォルダに格納されていたとすれば、指定するパスは、次のようになるだろう。

%SystemRoot%\System32

あるいは、特定のプロジェクトだけのために参照されているライブラリであれば、そのプロジェクト・フォルダ配下に格納されているかもしれない。

次のコードは”MagicWandWin.dll”が提供するメソッド”GetWikipedia”を利用し、「モリアーティ」を検索するコマンドと、その出力結果だ。

add-type -path "D:\user temp\work\1min\packages\MagicWandWin.3.0.1\lib\net472\MagicWandWin.dll"
[MagicWand.Magic]::GetWikipedia("モリアーティ")

f:id:espio999:20210529232005p:plain

Get-Member-ライブラリの詳細を調べる

昨日の投稿では、「IL DASM」を用いて、未知のライブラリを調べる方法を紹介した。*2

対象のライブラリが.Net frameworkで作成されたことが分かっており、そのクラス名まで特定できていれば、その詳細をPowerShellでも調べることができる。コマンド”Get-Member”を使えばよい。

コマンドは、オブジェクトとコマンドをパイプで繋げて実行する。このような具合だ。

[MagicWand.Magic] | Get-Member

f:id:espio999:20210529232250p:plain

例えば、Visual StudioなどのIntellisenseで表示されるメソッドの一覧を取得したければ、次のようにコマンドを実行する。

[MagicWand.Magic] | Get-Member -Static

f:id:espio999:20210529232306p:plain