包装DLL-了解导入失败的原因
Wrapping a DLL - Understanding why Import Fails
背景
我有一个嵌入式系统,它运行一个最初用C++编写并在Visual Studio中编译的应用程序,它产生了一个可执行文件和30多个DLL。这些库不能在VS对象浏览器或其他工具(如P/Invoke Interop Assistant)中浏览。
在Dependency Walker中加载一些dll显示,所有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)
问题是,该函数返回FALSE表示无法正确初始化DLL。当然,这并不能提供关于为什么返回FALSE的所有信息。Windows除了生成错误1114,error_DLL_INIT_FAILED之外,什么也做不了。如果DLL本身没有输出任何诊断,那么除了调试代码之外,您什么都不能做。从Project+Properties的"调试"选项卡开始,勾选"启用非托管代码调试"选项。
祈祷您在"输出"窗口中看到一条消息。几率不是很大。如果你没有DLL的源代码,那么你需要DLL的供应商或作者的帮助。给他一份这样失败的测试项目的副本。
也许原因是需要安装旧的Net Framework版本,如2.0、3.0、3.5……这对我来说很有效:D
- 在 python 模块中导入子模块时PyImport_Import失败
- 在 macOS 上的 CLion 中导入 Bazel 项目失败
- VS 2017 构建工具失败,出现错误 MSB4019:找不到导入的项目"D:Microsoft.Cpp.Default.props"
- 将 .c 文件重命名为 .cpp,导入 Cython 库失败
- 无法在 Python 3.5 上导入 cv2 DLL 加载失败
- 提升 Python 导入失败,未定义包装类的符号
- dlib构建失败,无法导入dlib
- Emscripten 链接静态库错误:wasm 流式编译失败:导入'env.getTempRet0'
- CMAKE:导入时链接 OpenCV 失败
- OpenCV导入在Windows容器中失败(在Windows Server 2016上)
- 包装DLL-了解导入失败的原因
- 在 c 中嵌入 python 时,numpy 导入失败
- 使用嵌入式c++导入pygame失败
- C# DLL 导入失败:"The application has failed to start because its side-by-side configuration is incorrect
- cmake:链接静态导入库失败
- C#运行时导入失败中的C++非托管DLL
- Swig创建的Java包Jython导入链接失败
- 从自定义构建的Python导入自定义模块失败
- 在GLIBC版本较低的目标系统上,从.so文件导入Python模块失败
- 导入C++模块,如果失败:导入 Python 版本