1
0

More than 5 years have passed since last update.

[C++/C#]C#をCOM参照可能にしてC++アプリから呼ぶ2

Last updated at Posted at 2019-05-22

やりたいこと

前回の続きで、C#のdllを、COM参照可能にしたC#dllでラップして、C++アプリから呼ぶことができるのは分かったが、そのC#のdllCOM参照可能にしたC#dllC++アプリのそれぞれのプラットフォーム(x64/x86/ANYCPU)の組み合わせで、動く動かないをはっきりさせたい。

関連項目目次

実験内容

前回のプロジェクト一式を使用して、C#のdllCOM参照可能にしたC#dllC++アプリについて、それぞれx64x86ANYCPUのdllを作成する。(C++アプリについてはANYCPUはなし)

それを組み合わせて実行し、うまく動作するかどうかを確認する。

動かすときは、下のようなexerun_64.batexerun_86.batを作成し、COM参照可能にしたC#dllを登録してからC++アプリを実行する。

exerun_64.bat
@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
exerun_86.bat
@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と出る様子。

CheckBinaryTarget.bat
@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のAnyCPUは試してない
image.png

結果としては、

  • 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

コード

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0