背景
我有一个嵌入式系统,该系统运行一个最初用C++编写并在Visual Studio中编译的应用程序,这导致一个可执行文件和30多个DLL。这些库不能在VS Object Browser或其他工具(例如P / Invoke Interop Assistant)中浏览。
在Dependency Walker中加载某些DLL表明,所有DLL都在其依赖关系树的深处缺少某些依赖项(cdfview.dll,dwmapi.dll,w32topl.dll等),但是根据this question,这可能不是问题。
我有一些源代码文件的,还有所有已编译DLL的。该应用程序当前可以正常运行,表明没有真正的依赖问题。
我试图调用某些库函数,并最终使用C#进行包装,但无法成功导入和调用最简单的函数。我总是收到以下错误:
示例代码[编辑]
从C++源代 jetty 文件中,我有以下声明:
#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)
最佳答案
您正在加载的DLL包含一个DllMain()函数。这很常见,此类函数会初始化DLL的状态。 Windows确保每次加载DLL时都会调用此函数,它将在您首次调用该DLL导出的函数时自动发生。
问题是,该函数返回FALSE表示它无法正确初始化DLL。当然,这并不能提供有关为什么返回FALSE的全部信息。 Windows除了产生错误1114 ERROR_DLL_INIT_FAILED之外,什么也不能做。如果DLL本身不输出任何诊断信息,那么您只能调试代码。从“项目+属性”的“调试”选项卡开始,勾选“启用非托管代码调试”选项。
手指交叉,您会在“输出”窗口中看到一条消息。赔率不是很好。如果您没有DLL的源代码,则需要DLL的供应商或作者的帮助。给他一个失败的测试项目的副本。
关于c# - 包装DLL-了解导入失败的原因,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13934962/