背景
我有一个嵌入式系统,它运行一个最初用 C++ 编写并在 Visual Studio 中编译的应用程序,这会产生一个可执行文件和 30 多个 DLL。这些库无法在 VS 对象浏览器或 P/Invoke Interop Assistant 等其他工具中浏览。
在 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)