我有它運行原文爲C++和Visual Studio中,這會導致一個可執行文件和30多個DLL文件編譯的應用程序的嵌入式系統。這些庫不能在VS Object Browser或其他工具(如P/Invoke Interop Assistant)中瀏覽。
加載一些在Dependency Walker中的DLL文件的顯示,所有的人都缺少一些依賴深藏在他們的依賴關係樹(cdfview.dll,dwmapi.dll文件,w32topl.dll,...),但根據this question,很可能不是一個問題。
我有一些的源代碼文件,和所有編譯的DLL。該應用程序目前運行沒有問題,表明沒有真正的依賴性問題。
我試圖調用一些庫函數,最終使使用C#的包裝,但我無法成功導入,並呼籲即使是最簡單的功能。我總是收到以下錯誤:
Unable to load DLL 'dllName.dll': A dynamic link library (DLL) initialization routine failed. (Exception from HRESULT: 0x8007045A)
示例代碼[EDITED]
從C++源代碼的頭文件我有以下聲明:
#define OB_API __declspec(dllexport) __cdecl
typedef unsigned long DWORD; // From windef.h
typedef DWORD OBSTATUS;
OBSTATUS OB_API TestObj(void);
在C++源碼文件中的以下定義給出了(這似乎總是返回真):
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)
與加載問題無關,但需要在p/invoke聲明中使用'CallingConvention.Cdecl',以匹配C++端。 –
更新了'CallingConvention' – nicholas