Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在64位操作系统上的进程内wmi提供程序(32位)中加载本机dll(32位)_C#_64 Bit_Wmi_Native Code - Fatal编程技术网

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

C# 在64位操作系统上的进程内wmi提供程序(32位)中加载本机dll(32位),c#,64-bit,wmi,native-code,C#,64 Bit,Wmi,Native Code,我正在使用一个进程内wmi提供程序,它使用[DllImport]加载本机第三方库。dll位置固定为c:\mydllpath。在加载dll之前,我在提供程序的Bind()方法中将当前目录设置为dll动作 Environment.CurrentDirectory=Environment.ExpandEnvironmentVariables(“%SystemDrive%”)+“\mydllpath” 提供程序是为使用gacutil和installexe安装的“任意CPU”构建的 gacutil.exe

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

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

提供程序是为使用gacutil和installexe安装的“任意CPU”构建的

gacutil.exe/if myprovider.dll

installutil.exe myprovider.dll

它在所有32位Windows平台上都运行良好。但在64位平台(使用64位Windows 7进行了尝试)中,当我从WMIC进行测试时,它不起作用。但当我使用WMI代码创建者进行测试时,它运行良好

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

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

在从internet上搜索帮助后,建议为x86构建提供程序。但使用x86构建的提供程序会出现另一个错误,如

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

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

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


我们将非常感谢您的帮助

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


这篇文章描述了一些困难

您需要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位的(我不知道是否是这种情况)。如果是的话,那么是的。。你真倒霉


更新2:似乎表明WMI提供程序在64位操作系统上不需要是64位的,除非在“罕见的情况下”,所以也许您可以使用32位的提供程序。

谢谢Ralf。我们将尝试从我们的客户端获取64位dll,然后再试。最后,我的客户端提供了一个64位dll,解决了这个问题。谢谢ralf.vany其他可能性…?:(非常感谢Mystere Man。我正在使用进程内提供程序。我还尝试为x86构建提供程序,但没有成功。现在我正在等待来自客户端的64位本机dll。最后,我的客户端提供了一个64位dll,解决了此问题。