使用 LoadLibrary 返回 0,Win32Error 193

using LoadLibrary returns 0 with Win32Error 193

本文关键字:Win32Error LoadLibrary 返回 使用      更新时间:2023-10-16

我正在构建一个 c# 类库,该库调用与我们合作的供应商提供的第三方 DLL。供应商示例都是 vc++ 的,并且正在运行和工作。

我正在尝试加载其中一个 DLL,它返回IntPtr0。当我打电话给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。显然,这很复杂。