バックグラウンド
もともとC++で記述され、Visual Studioでコンパイルされたアプリケーションを実行する組み込みシステムがあります。これにより、単一の実行可能ファイルと30を超えるDLLが生成されます。これらのライブラリは、VSObjectBrowserやP/InvokeInteropAssistantなどの他のツールでは参照できません。
Dependency WalkerにいくつかのDLLをロードすると、それらすべてが依存関係ツリーの奥深くにいくつかの依存関係(cdfview.dll、dwmapi.dll、w32topl.dll、...)が欠落していることが示されますが、この質問によると、それはおそらく問題。
いくつかのソースコードファイルと、コンパイルされたすべてのDLLがあります。アプリケーションは現在問題なく実行されており、実際の依存関係の問題がないことを示しています。
いくつかのライブラリ関数を呼び出して、最終的にC#を使用してラッパーを作成しようとしていますが、最も単純な関数でさえ正常にインポートして呼び出すことができません。私は常に次のエラーを受け取ります:
DLL'dllName.dll'を読み込めません:ダイナミックリンクライブラリ(DLL)初期化ルーチンが失敗しました。(HRESULTからの例外:0x8007045A)
サンプルコード[編集済み]
C ++ソースコードヘッダーファイルから、次の宣言があります。
#define OB_API __declspec(dllexport) __cdecl
typedef unsigned long DWORD; // From windef.h
typedef DWORD OBSTATUS;
OBSTATUS OB_API TestObj(void);
C ++ソースコードファイルでは、次の定義が示されています(これは常にtrueを返すように見えます)。
BOOL WINAPI DllMain(HANDLE /* hModule */,
DWORD ul_reason_for_call,
LPVOID /* lpReserved */
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_PROCESS_DETACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
私のC#アプリケーションクラスに、次の宣言を追加します。
[DllImport(@"dllName.dll", CallingConvention=CallingConvention.Cdecl)
public static extern ulong TestObj();
DLLとC#アプリケーションバイナリは同じディレクトリにあります。
質問
エラーの調査から、この特定の例外がスローされる可能性がある理由は多数あるようで、このタイプの問題をさらにトラブルシューティングするにはどうすればよいか疑問に思いました。
初期化ルーチンが失敗した理由に関するより詳細な情報を取得する方法はありますか?
(注:ターゲットシステムは.NET Framework 2.0を実行しています)