【问题标题】:C# - LoadLibrary fails with 32bit DLLC# - LoadLibrary 使用 32 位 DLL 失败
【发布时间】:2017-12-18 13:02:46
【问题描述】:

我有一个在运行时加载 DLL 的 C# 应用程序。 DLL 是 32 位的,所以它是应用程序。

我尝试使用以下来源的 LoadLibrary:

    [DllImport("kernel32.dll")]
    private static extern IntPtr LoadLibrary(string dllToLoad);
    [DllImport("kernel32.dll")]
    private static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
    [DllImport("kernel32.dll")]
    private static extern bool FreeLibrary(IntPtr hModule);

但没有结果;它总是返回IntPtr.Zero。我也尝试过使用

[DllImport("%windir%\\SysWOW64\\kernel32.dll")]
    private static extern IntPtr LoadLibrary(string dllToLoad);
    [DllImport("%windir%\\SysWOW64\\kernel32.dll")]
    private static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
    [DllImport("%windir%\\SysWOW64\\kernel32.dll")]
    private static extern bool FreeLibrary(IntPtr hModule);

但这样应用程序在调用 LoadLibrary 时会收到“System.Windows.Markup.XamlParseException”异常。

以前有人遇到过这个问题吗?

【问题讨论】:

  • 使用[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)],然后当您的LoadLibrary 结果为IntPtr.Zero 时,请查看Marshal.GetLastWin32Error() 的结果以了解原因。
  • 你可以试试打电话给GetLastError吗?
  • @AlexK.,错误代码是0x000000c1
  • 那是 ERROR_BAD_EXE_FORMAT 所以你正在尝试将 32 位库加载到 64 位进程中。
  • 听起来,您的应用程序也是为 32 位平台编译的。请说明您的环境。如果您的问题是:如何将 32 位 DLL 加载到 64 位进程中,但是,答案很简单:您不能。

标签: c# wpf windows winapi dll


【解决方案1】:

您的 C# exe 必须编译为 32 位。

查看此页面了解错误代码详情:
https://msdn.microsoft.com/en-us/library/ms681382(v=vs.85).aspx

ERROR_BAD_EXE_FORMAT
193 (0xC1)
%1 不是有效的 Win32 应用程序。

【讨论】:

  • 我将尝试在“AnyCPU”的 x86 目标下重新编译我的应用程序,看看它是否有效。
  • 即使以 x86 作为目标加载失败,尝试加载 DLL 时出现相同的错误 0xC1
  • 1.您不必指定kernel32.dll 的路径,只需[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)] 就可以了
  • 2.您必须通过在项目属性窗口的Build 页面中将Platform target 设置为AnyCPU with Prefer 32-bitx86 来将您的exe 编译为32 位
  • 3.您必须确保您的 dll 是有效的 32 位 PE 格式 dll
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多