やりたいこと
前回の続きで、C#のdllを、COM参照可能にしたC#dllでラップして、C++アプリから呼ぶ
ことができるのは分かったが、そのC#のdll
とCOM参照可能にしたC#dll
とC++アプリ
のそれぞれのプラットフォーム(x64/x86/ANYCPU)の組み合わせで、動く動かないをはっきりさせたい。
関連項目目次
実験内容
前回のプロジェクト一式を使用して、C#のdll
とCOM参照可能にしたC#dll
とC++アプリ
について、それぞれx64``x86``ANYCPU
のdllを作成する。(C++アプリについてはANYCPUはなし)
それを組み合わせて実行し、うまく動作するかどうかを確認する。
動かすときは、下のようなexerun_64.bat``exerun_86.bat
を作成し、COM参照可能にしたC#dll
を登録してからC++アプリ
を実行する。
@echo off
cd %~dp0
regasm_64 /u DllCsComWrapper.dll
regasm_86 /u DllCsComWrapper.dll
regasm_64 /codebase DllCsComWrapper.dll
pause
start /wait ConsoleApplication1.exe
echo exeからの戻り値は %ERRORLEVEL% です
regasm_64 /u DllCsComWrapper.dll
regasm_86 /u DllCsComWrapper.dll
pause
@echo off
cd %~dp0
regasm_64 /u DllCsComWrapper.dll
regasm_86 /u DllCsComWrapper.dll
regasm_86 /codebase DllCsComWrapper.dll
pause
start /wait ConsoleApplication1.exe
echo exeからの戻り値は %ERRORLEVEL% です
regasm_64 /u DllCsComWrapper.dll
regasm_86 /u DllCsComWrapper.dll
pause
前提
x64,86それぞれのregasm.exeをとってきてそれぞれregasm_64.exe、regasm_86.exeに改名し、同じ階層に置いている。
ポイント
x64、x86のラッパーdllは、x64.x86それぞれのregasmでしか登録できない。
anycpuのラッパーdllは、x64.x86どちらのregasmでも登録できる。
その際、x64のregasmで登録すればx64向けのdll、x86のregasmで登録すればx86向けのdllとなる。
便利bat
各dll、exeのターゲットが何か(x86/x64)を出力する。
※AnyCPUはx86と出る様子。
@echo off
echo process start...
rem 開発用コマンドプロンプト(環境によってはパス違うかも)
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\VsDevCmd.bat"
cd %~dp0
SET TARGET1="ConsoleApplication1.exe"
SET TARGET2="DllCsComWrapper.dll"
SET TARGET3="DllTestCs.dll"
echo %TARGET1%
dumpbin /headers %TARGET1% | findstr machine
echo %TARGET2%
dumpbin /headers %TARGET2% | findstr machine
echo %TARGET3%
dumpbin /headers %TARGET3% | findstr machine
pause
結果
結果としては、
- C#dllがx64であれば、ラッパーもC++アプリもx64でないといけない
- C#dllがx86であれば、ラッパーもC++アプリもx86でないといけない
という普通な結果となった。
しかし
COMは、もうちょっと便利な、x64ともx86とも連携できる便利な奴、ではなかった?
イメージが間違えていた??
このHPにあるように、なにかやり方があるのかも。(未検証)
ここにあるのは(32bitDLLを64bitプロセスから呼ぶ方法だが...)
https://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/
参考
64bitアプリと32bit DLLの混在
https://www.backyrd.net/entry/20130704/1372920343
コード