前提・実現したいこと
CLRをサポートしていないC++のEXE(以下TestConsole)からCLRをサポートしているC++のDLLの関数(以下、TestDllClr)を呼び出せるようにしたいです。
しかし、実際に動かしてみるとLoadLibraryでTestDllClrをロードするタイミングでエラーが発生します。
開発環境はVisual Studio 2017を使用しています。
TestDllClrプロジェクトのプロパティで以下のように設定しました。
- 共通言語ランタイムサポート: 共通言語ランタイム サポート(/clr)
- .Net Framework対象バージョン: 4.8
どうしたらこのエラーを解消できるでしょうか?
よろしくお願いいたします。
発生している問題・エラーメッセージ
TestConsole.exeによってブレークポイントが発生しました。
該当のソースコード
c++
1typedef INT32(*FUNC)(); 2 3int main() 4{ 5 /* 6 LoadLibraryのタイミングでエラーが発生。 7 TestDllClrがCLRをサポートしないときは通っていた。 8 */ 9 HMODULE hModule = LoadLibrary(L"TestDllClr.dll"); 10 if (hModule == NULL) return 0; 11 12 FUNC func = (FUNC)GetProcAddress(hModule, "Test"); 13 INT32 ret = func(); 14 15 return 0; 16}
試したこと
まずはCLRをサポートしていない状態でテスト用の関数を作り、それがコンソールアプリから呼び出せることを確認しました。
変更したのはコンパイル オプション (プロジェクトのプロパティ) だけですか?
当方の環境 (Windows10, Visual Studio 2017) で適当にプロジェクトを作り実行してみました。
「共通言語ランタイム サポート (/clr)」で DLL を作り、コンソール アプリケーションから呼び出しましたが、特に問題ないようです。
DllMain があると、エラーになるようです。
アセンブリの初期化の問題のようですが、詳細は https://docs.microsoft.com/ja-jp/cpp/dotnet/initialization-of-mixed-assemblies?view=msvc-160
#pragma unmanaged を使用すれば、DllMain があってもうまくいきます。
ご回答ありがとうございます。
ご指摘の通り、DLLからDllMainを消したところ、問題なくロードできるようになりました。
またDllMainが残っているときのビルド結果をよく見ると、それらしき警告も出ていました。
勉強になりました。ありがとうございます。
回答2件
あなたの回答
tips
プレビュー