背景

我有一个嵌入式系统,该系统运行一个最初用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/

10-11 23:17
查看更多