3

我正在开发一个进程内 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 位安装的配置。

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

4

2 回答 2

3

您需要代码为 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: 这篇文章似乎表明 WMI 提供程序在 64 位操作系统上不需要是 64 位的,除非在“极少数情况下”,所以也许你可以使用 32 位提供程序。

于 2011-03-24T19:28:00.083 回答
1

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

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

于 2011-03-23T21:02:48.947 回答