我正在使用进程中的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位安装的一些配置。
任何帮助都会非常感谢,非常感谢!
答案 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)
here是一篇描述一些困难的文章