x86 と x64

概要

前節に引き続き、「DllExport」にてコンパイルされた.dll の x86 と x64 を見てゆきます。

普通のC#でコンパイルした.dllとの違いを調べる

前節でコンパイルした結果、以下のような.dllが出力されました。
その下には、 x86 フォルダと x64 フォルダが生成されています。

PICTURE

秀丸エディタで利用可能なのは、この x86 もしくは x64 フォルダの中にある.dllです。

ネイティブのLoadLibraryやGetProcAddress から「関数シンボル」が見えるかチェック

開発者プロンプトを開き...

PICTURE

dumpbin /exports ***.dll

対象の.dllをチェックしてみましょう。

開発者コマンドプロンプト
dumpbin /exports ClassLibrary36.dll

「Debug」もしくは「Release」直下にある.dllは、純粋な「中間アセンブリ」であるため、
GetProcAddress からは「関数シンボル」は見えません。

すなわち、このファイルは秀丸マクロのloaddll文では使えません。

PICTURE

x86 / x64 の.dllは「関数シンボル」が見える

x86(もしくはx64)へと移動し、再び同名の対象.dllをチェックしてみましょう。
x86 もしくは x64 にある.dllは、GetProcAddress から見える「abc」という「関数シンボル」が見えます。
これが DllExport による加工の効果です。

開発者コマンドプロンプト
cd x86
dumpbin /exports ClassLibrary36.dll

PICTURE

秀丸エディタ 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版との互換性

PICTURE

C#でプログラムを組む際は、使えない主はパターンは

  • 「ウィンドウハンドル」の類
  • x86の.dll から 64bitのプロセスの情報を拾おうとしても、ビット数が足りないため原則拾えない
  • 秀丸本体(Hidemaru.exe) から 関数を[DllImport] する際も、ビット数が異なるためうまくいかない

となります。
原則、よほどの事情がない限り、ビット数を一致させたもので動作させるようにしてください。

さて、次章からはいよいよ、秀丸エディタから、.dllを呼び出してみましょう。