Technically Impossible

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

未知のDLL(ライブラリ)の調べ方-IL DASMあるいはコマンド”ildasm” MagicWandWin.dllの場合

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

書籍『1分間プログラミング』のためのライブラリで、その他の目的に利用するようなものではない。そのためかGitHubなどでソースコードは公開されておらず、提供するプロパティ、メソッドをまとめたリファレンスも存在しない。内部処理に関するロジックが、『1分間プログラミング』にて説明される以外、何も公開情報はない。
1分間プログラミング - Technically Impossible

そもそも学習支援用、より厳密に言えば、"Hello World"や変数の学習に伴う無味乾燥、地味さ加減という、プログラム以前の問題で挫折してしまうほどの学習者の興味を引き付ける、その仕掛けのために用いられるライブラリなのだ。だから、書籍で紹介される記述方法以外の用途で使わせるつもりはないのだろう。

Intellisenseで表示されるメソッド情報(冒頭画像)を参照し、試行錯誤しても良いのだが、何とかしてリファレンスに代わるものを参照できないものだろうか。それは可能だ。

.Net Frameworkライブラリ IL DASM (Intermediate Language Disassembler)
コマンド”ildasm”
PowerShell
コマンド”Add-Type”
コマンド”Get-Member”
.Net Framework以外
Win32、COMなどのライブラリ
コマンド”dumpbin”

”ildasm”、”dumpbin”は、どちらもWindows SDKに含まれており、使い方も、ほとんど変わらない。この投稿では”ildasm”を取り上げる。
”dumpbin”と、PowerShellについては、余談にて、少し触れることにする。

前提ーWindows SDKの導入

まず”ildasm”を利用するための前提条件だ。

  1. Visual Studioが導入されていること。
    1. この投稿では、次のヴァージョンを用いている。
    2. Community 2019 Version 16.10.0
  2. Windows 10 SDKが導入されていること。

ちなみに、この条件で”dumpbin”も利用可能となる。

Windows 10 SDKは単体で導入することもできるし、Visual Studioのインストールに合わせて導入することもできる。具体的には、「C++によるデスクトップ開発」を選択し、”Windows 10 SDK”を選択すればよい。次の画像のような具合だ。

画像:「C++によるデスクトップ開発」を選択し、”Windows 10 SDK”を選択する。
f:id:espio999:20210528225710p:plain

Windows 10 SDKを単体で導入したければ、次の投稿で導入方法を紹介しているので、参照してほしい。こちらの場合、選択するのは"Windows SDK for Desktop"のうち、使用中のCPUに適合するものだ。
impsbl.hatenablog.jp

IL DASM - ildasm

コマンドを実行する前に、目的のライブラリが格納されているdllファイルの在処を特定する。おそらく最も分かりやすいのは、Visual Stuioで目的のライブラリを参照するプロジェクトを作成し、そこからパスを特定することだ。
今回の場合は”MagicWandWin”を参照している。そのパスはプロパティに表示されている。このパスは”ildasm”からの呼び出しに利用するので、どこかにメモしておく。

画像:ライブラリのプロパティを確認する。
f:id:espio999:20210528225853p:plain

”ildasm”はコマンド・ツールなので、コマンド・プロンプトやPowerShellから起動可能だ。ここでは、Visual Studioから起動することにする。”開発者用PowerShell”を起動する。

画像:ファイル・メニュー > ツール > コマンドライン > f:id:espio999:20210528225909p:plain

起動したPowerShellから次のコマンドを実行すると、ildasmが起動する。

ildasm /all [dllのパス]

画像:IL DASM
f:id:espio999:20210528225955p:plain

起動した画面から、パッケージ、クラスを辿れば、メソッドの情報に辿り着く。注意したいのは、一覧されているメソッドのすべてが呼び出し可能というわけではない、ということだ。

intellisenseに表示される
ildasmに表示される
publicメソッド
ユーザーが呼び出し可能
intellisenseに表示されない
ildasmに表示される
privateメソッド
ユーザーは呼び出し不可
内部処理に用いられる。

例えば”GetWeatherJsonText”は、String型の引数を受け取り、String型の値を戻す関数だ。これはIntellisenseには表示されない。メソッド名と引数、戻り値の関係から何となく、次のような処理が想像できる。

  • URLを受け取り、URLの参照先から受け取ったJSONを返す。
  • キーワードを受け取り、JSONに基づいて、キーワードに即した値を返す。

いずれにせよ、必要とする情報を取得するための内部処理として用意されたメソッドで、ユーザーが直接呼出しする必要はないのだろう、と推察できる。
さらにDeep Diveしたければ、該当メソッドをダブル・クリックすればよい。さらに詳細な情報が得られるのだが、もうこれ以上は触れない。

画像:GetWeatherJsonTextの詳細
f:id:espio999:20210528230106p:plain

余談-dumpbin

今回のライブラリ(dllファイル)は、.Net Frameworkを用いていたものだと分かっていたため、最初から”ildasm”を用いた。目的のライブラリがWin32など、他の技術を用いている場合は”dumpbin”を用いる。
こちらはCUIによるテキスト出力に限定されること以外、使い方は”ildasm”と同じだ。コマンドに、必要とするオプションと、目的のライブラリへのパスを追記して実行すればよい。このような具合だ。出力が多いため、オプション”/out”を用いて出力先として、テキスト・ファイルを指定すると良い。

dumpbin /all [dllのパス] /out:[テキスト・ファイルのパス]

余談-PowerShellの場合

今回紹介した”MagicWandWin.dll”の様に、事前に次のことが判明しているならば、PowerShellでも詳細を調べることができる。

  • .Net frameworkで制作されている。
  • クラス名が判明している。

その方法について、次の投稿で触れている。関心があれば、参照してほしい。
impsbl.hatenablog.jp

余談-『1分間プログラミング』

書籍『1分間プログラミング」が、今回の投稿のきっかけになった。当初、私が期待していたような内容ではなく、多少の失望感を抱きながら読み進めていたのだが、次第に説明に用いられているライブラリ”MagicWandWin”に関心が向き、そちらを調べる意欲が湧いてきたのだ。

期待していた内容ではなかったとはいえ、書籍の主張する事柄についても、少々思うところがあった後日、その紹介を投稿することになるだろう。
impsbl.hatenablog.jp