x86 と x64
概要
前節に引き続き、「DllExport」にてコンパイルされた.dll の x86 と x64 を見てゆきます。
普通のC#でコンパイルした.dllとの違いを調べる
前節でコンパイルした結果、以下のような.dllが出力されました。
その下には、 x86 フォルダと x64 フォルダが生成されています。
秀丸エディタで利用可能なのは、この x86 もしくは x64 フォルダの中にある.dllです。
ネイティブのLoadLibraryやGetProcAddress から「関数シンボル」が見えるかチェック
開発者プロンプトを開き...
dumpbin /exports ***.dll
対象の.dllをチェックしてみましょう。
「Debug」もしくは「Release」直下にある.dllは、純粋な「中間アセンブリ」であるため、
GetProcAddress からは「関数シンボル」は見えません。
すなわち、このファイルは秀丸マクロのloaddll文では使えません。
x86 / x64 の.dllは「関数シンボル」が見える
x86(もしくはx64)へと移動し、再び同名の対象.dllをチェックしてみましょう。
x86 もしくは x64 にある.dllは、GetProcAddress から見える「abc」という「関数シンボル」が見えます。
これが DllExport による加工の効果です。
秀丸エディタ 32bit版 なら x86、秀丸エディタ 64bit版なら x64
Windowsのビット数ではありません。秀丸エディタのビット数です。
秀丸の「ヘルプ」→「秀丸エディタについて」で32bit edition か 64bit edition かを見ることができます。
秀丸エディタ 32bit 版 | 秀丸エディタ 64bit 版 |
---|---|
x86フォルダの方の.dll が 使える | x64フォルダの方の.dll が 使える |
となります。
これらの.dllは、秀丸マクロから loaddll して使うことができます。
まさにC/C++で作成した.dllであるかのように振る舞いますが、1点異なるのは、
「freedll」は機能しないという点です(秀丸マクロからfreedllしても実際にはdllは解放されない)。
これは「一度読み込まれた中間アセンブリを含んだ.dll」は原則プロセスを閉じるまで解放できないためです。
秀丸エディタ 64bit版 で x64 だけでなく、x86の方も 使えるのか?
以下のように「秀丸エディタ 64bit版」でメニューより「動作環境」→「その他」→「64bit版」内の設定をすれば、限定的ながら動作します。
詳細は32bit版との互換性
C#でプログラムを組む際は、使えない主はパターンは
- 「ウィンドウハンドル」の類
- x86の.dll から 64bitのプロセスの情報を拾おうとしても、ビット数が足りないため原則拾えない
- 秀丸本体(Hidemaru.exe) から 関数を[DllImport] する際も、ビット数が異なるためうまくいかない
となります。
原則、よほどの事情がない限り、ビット数を一致させたもので動作させるようにしてください。
さて、次章からはいよいよ、秀丸エディタから、.dllを呼び出してみましょう。