使用 LoadLibrary 返回 0,Win32Error 193
using LoadLibrary returns 0 with Win32Error 193
我正在构建一个 c# 类库,该库调用与我们合作的供应商提供的第三方 DLL。供应商示例都是 vc++ 的,并且正在运行和工作。
我正在尝试加载其中一个 DLL,它返回IntPtr
0。当我打电话给Marshal.GetLastWin32Error()
时,我得到 193,从我读到的内容来看,这意味着我正在尝试在 32 位应用程序中加载 64 位 DLL。但是我一次又一次地检查,我的类库都设置为x86
并且调用该类库的控制台应用程序设置为x86
。
我可以成功加载同一供应商的其他DLL文件(也是32位)。
这是我的本机帮助程序类:
class NativeHelper
{
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary", SetLastError = true)]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll", EntryPoint = "LoadLibraryEx", SetLastError = true)]
public static extern IntPtr LoadLibraryEx(string dllToLoad, IntPtr hFile, LoadLibraryFlags flags);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
[System.Flags]
public enum LoadLibraryFlags : uint
{
DONT_RESOLVE_DLL_REFERENCES = 0x00000001,
LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010,
LOAD_LIBRARY_AS_DATAFILE = 0x00000002,
LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040,
LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020,
LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008,
LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 0x00000100,
LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800,
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000
}
}
这就是我打电话的方式:
IntPtr pDll = NativeHelper.LoadLibrary(@"dhplay.dll"); // returns 0
if (pDll == IntPtr.Zero)
{
var err = Marshal.GetLastWin32Error().ToString(); // returns 193
Console.WriteLine(err);
}
我在这里错过了什么?如果我正在运行x86
为什么没有加载该 DLL 而其他人加载?
编辑(附加信息):
IntPtr.Size
是 4
dumpbin
返回8664 machine (x64)
- 这意味着它是 64 位的?我检查了使用的其他DLL,它们8664 machine (x86)
就依赖项而言,它正在我的机器上的 vc++ 应用程序上运行。
如果有烟,经常有火。某些 dll 可能是 x64,而你的应用是 x32(或相反)。
-
签入您的应用程序
IntPtr.Size
。 4 → x86,32 位,8 → x64,64 位 -
如果使用 Visual Studio 命令提示符,则应该能够使用
dumpbin
。为您的 dll 做一个dumpbin /headers yourdll.dll | more
。第一行之一应machine (...)
。在(...)
中,如果是 x86(所以 32 位)或 x64(所以 64 位),应该写
对于第二个问题,您不能以任何方式在单个进程中混合使用 32 位和 64 位 dll。一些程序"作弊"并使用正确的位创建一个辅助进程来加载 dll,然后在主进程和辅助进程之间进行 IPC(进程间通信)以使用 dll。显然,这很复杂。
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- numpy.load 给出 ValueError: descr 不是有效的 dtype 描述符:
- Qt3D:"Mesh is empty, nothing to load"消息
- Java 1.8 本机 System.load 通过 JNI 调用C++产生 TLSv1.如何获取 TLSv1.2?
- 无法将 IOKit 驱动程序与 IOHIDFamily 链接:"dependency load failed"
- 使用RCPP包创建R包时出错:macOS中的dyn.load中出错
- 当使用来自 std::atomic 的方法时隐式调用 load() 吗?
- 使用 Python "cPickle.load"加载C++编写的二进制文件时的 EOFError
- 使用 LoadLibrary 返回 0,Win32Error 193
- Visual C++ Load rtf 文档在丰富编辑框中包含图像和文本
- R dyn.load "Symbol not found"错误,即使C++代码构建良好
- 无法使用 dyn.load windows 7 64 位在 R 中加载 dll 文件
- 通过Atomic :: load()访问矢量时访问违规行为
- STD :: Atomic Load方法与STD :: shared_ptr一起使用时会减少参考计数
- std::atomic<int*>::load 应该做一个比较和交换循环吗?
- 对 std::atomic::load 的结果使用结构取消引用 (->) 运算符是否安全
- QTcpSocket do not load ssl
- QWebFrame load() 在初始页面加载时不发送 cookie
- 将包与Rcpp链接时发生dyn.load错误
- std::atomic::load的内存排序行为