2011-03-17 127 views
3

我正在使用[DllImport]加载本机第三方库的进程内wmi提供程序。 dll位置固定为c:\ mydllpath。在加载dll之前,我在提供程序的Bind()方法中将当前目录设置为dll位置。在64位操作系统上的进程内wmi提供程序(32位)中加载本机DLL(32位)

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

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

的Gacutil.exe /如果myprovider.dll

installutil.exe myprovider.dll

它在所有32位Windows平台上工作的罚款。但在64位平台(使用Windows 7 64位试用版)时,当我从WMIC进行测试时,它不工作。但是当我使用WMI Code创建器进行测试时,它工作正常。

调试后,我发现它是抛出以下错误。

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

从互联网搜索帮助后,有人建议为x86构建提供程序。但是,供应商,86是给另一个错误,如建...

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

我也尝试加载机DLL(实际上2名的dll,和一个sys文件)使用/ linkref命令行开关,但因为无法使用/ linkref加载sys文件而失败。

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

任何帮助将非常感激,非常感谢提前!

+0

其他可能性......? :( – Muthukkumaran 2011-03-30 13:45:30

回答

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位提供者逃脱。

+0

非常感谢Mystere Man。过程提供者,我也尝试过为x86构建我的提供程序,但是没有运气,现在我正在等待来自我的客户端的64位本机dll – Muthukkumaran 2011-03-30 13:47:09

+0

最后,我的客户端提供了一个64位dll来解决问题。 – Muthukkumaran 2011-11-18 14:59:47

1

对不起朋友,这里运气不好。如果你的进程(主进程,开始的一切)运行64位,你不能加载32位本地dll。

here是描述了困难

+0

Thanks Ralf。我们将尝试从我们的客户端获取64位dll并尝试 – Muthukkumaran 2011-03-24 09:41:47

+0

最后,我的客户端提供了一个64位dll,解决了这个问题。谢谢ralf.v – Muthukkumaran 2011-11-18 15:00:00

相关问题