【问题标题】:Loading native dll (32bit) in in-process wmi provider(32 bit) on 64 bit OS在 64 位操作系统上的进程内 wmi 提供程序(32 位)中加载本机 dll(32 位)
【发布时间】:2011-03-17 17:33:03
【问题描述】:

我正在开发一个进程内 wmi 提供程序,它使用 [DllImport] 加载本机第三方库。 dll 位置固定为 c:\mydllpath。在加载 dll 之前,我在提供程序的 Bind() 方法中将当前目录设置为 dll 位置。

Environment.CurrentDirectory = Environment.ExpandEnvironmentVariables("%SystemDrive%") + "\mydllpath";

Provider 是为“任何 CPU”构建的,使用 gacutil 和 installexe 安装。

gacutil.exe /if myprovider.dll

installutil.exe myprovider.dll

它在所有 32 位 Windows 平台上都能正常工作。但是在 64 位平台中(尝试使用 Windows 7 64 位),当我从 WMIC 测试时它不起作用。但是当我使用 WMI Code creator 进行测试时,它运行良好。

调试后发现报错了。

System.BadImageFormatException 附加信息:试图加载格式不正确的程序。 (HRESULT 异常:0x8007000B)

在网上搜索帮助后,建议为 x86 构建提供程序。但是使用 x86 构建的提供程序给出了另一个错误,例如...

错误: 代码 = 0x80041013 描述 = 提供程序加载失败 设施 = WMI

我还尝试使用 /linkref 命令行开关加载本机 dll(实际上是 2 个 dll,和一个 sys 文件),但由于无法使用 /linkref 加载 sys 文件而失败。

我编写了一个测试 C# 客户端应用程序并将所有文件保存在同一路径中,它工作正常。 我希望我缺少一些 64 位安装的配置。

任何帮助将不胜感激,并在此先感谢!

【问题讨论】:

  • 还有其他可能性吗...? :(

标签: c# 64-bit wmi native-code


【解决方案1】:

您需要代码为 64 位吗?您可以告诉 Visual Studio 将您的 c# 代码编译为 32 位可执行文件,然后使用 32 位本机 DLL。这在 64 位操作系统上可以正常工作。

.NET 默认将 .net IL 编译为本机指令集。在构建选项卡上的项目设置中,如果构建目标设置为“任何 CPU”,那么它将在 64 位平台上编译为 64 位,在 32 位平台上编译为 32 位。

如果您更改此设置并强制 32 位编译(将其设置为 x86),那么即使在 64 位平台上它也会编译为 32 位,从而允许您使用 32 位 DLL。

更新:重新阅读您的问题后,您声明您正在构建一个进程内 WMI 提供程序。这表明提供程序可能需要在 64 位平台上为 64 位(我不知道是否是这种情况)。如果是这样,那么是的......你不走运。

UPDATE2:This article 似乎表明 WMI 提供程序在 64 位操作系统上不需要是 64 位,除非在“极少数情况”下,所以也许您可以使用 32 位提供程序。

【讨论】:

  • 非常感谢神秘人。我在进程提供程序中使用。我还尝试为 x86 构建我的提供程序,但没有运气。现在我正在等待来自我的客户端的 64 位本机 dll。
  • 最后我的客户提供了一个 64 位的 dll 解决了这个问题。
【解决方案2】:

对不起,伙计,这里运气不好。如果您的进程(主进程,一切启动)运行 64 位,则无法加载 32 位本机 dll。

here 是一篇描述一些困难的文章

【讨论】:

  • 谢谢拉尔夫。我们将尝试从我们的客户端获取 64 位的 dll 并尝试。
  • 最后我的客户提供了一个 64 位的 dll 解决了这个问题。谢谢 ralf.v
猜你喜欢
  • 2015-09-26
  • 1970-01-01
  • 2011-09-05
  • 2011-07-06
  • 2011-07-07
  • 2012-09-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
相关资源
最近更新 更多