在64位操作系统上的进程内wmi提供程序(32位)中加载本机dll(32位)

时间:2011-03-17 17:33:03

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

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

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

Provider是为'Any CPU'构建的,使用gacutil和installexe安装。

gacutil.exe / if myprovider.dll

installutil.exe myprovider.dll

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

调试后发现它丢失了以下错误。

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

在从互联网上搜索帮助后,建议为x86构建提供程序。但是使用x86构建的提供程序会产生另一个错误,如...

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

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

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

任何帮助都会非常感谢,非常感谢!

2 个答案:

答案 0 :(得分: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:This article似乎表明WMI提供商不需要64位操作系统上的64位,除非在“罕见的情况下”,所以也许你可以逃脱32位提供商。

答案 1 :(得分:1)

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

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