Win 7 64位操作系统上的Net Target = 4.5,Platform = AnyCPU和Prefer32Bit = off以32位运行

问题描述:

该应用程序及其所有库都使用Platform AnyCPU和Prefer32Bit关闭进行编译。应用程序使用currentDomain.AssemblyResource事件从嵌入式资源加载它的库。Win 7 64位操作系统上的Net Target = 4.5,Platform = AnyCPU和Prefer32Bit = off以32位运行

该应用程序已部署到超过100台运行Windows 7,Vista,10,2008和2012的PC上。但在某些Windows 7 Enterprise 64位PC(不是全部)上,应用程序加载嵌入类时引发BadImageFormatException的库。 JIT编译器以某种方式解决这些PC上的类库到32位而不是64,并且由于宿主应用程序编译为64位引发异常。

除了上面列出的JIT编译器(OS 64位,AnyCPU和Prefer32Bit关闭)之外,还会使用其他哪些因素来决定在加载类库时只选择32位而不是64位?

+1

如果你的应用程序由于外部引用而失败32位(如BadImageFormatException暗示),那你为什么不只是为64位编译? –

+0

该应用程序被部署到数百台具有各种Windows版本和32位和64位混合的PC上。该应用程序是自动分发和保持最新的,迄今为止,AnyCPU一直运行良好,直到最近它被部署到一个拥有Win 7 Enterprise 64位的客户。在我们的实验室中,我们安装了Win 7 Enterprise的全新副本,并且工作正常。所以在Win 7安装中有一些东西会导致JIT编译器将其中一个类库转换为32位而不是64位。 – Jeffrey

一种可能性是,.NET-64是在x64禁用

来自:https://*.com/a/14857294/97471

有可迫使AnyCPU组件以作为 x64操作系统32位运行设置。使用ldr64.exe从.Net2 x64目录检查状态:

C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727> ldr64.exe查询 加载kernel32 ... done。检索GetComPlusPackageInstallStatus 入口点检索SetComPlusPackageInstallStatus入口点 当前状态是:00000001 1 - 手段“运行AnyCPU为64位” 0 - 手段“运行AnyCPU为32位”

虽然我没有找到这样的实用程序在.Net v4文件夹中,设置 也适用于Net4 AnyCPU组件。这个标志是关键 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework

此设置似乎在OS开始加载,并且只改变 注册表值不影响应用程序,直到重新启动下保存在DWORD 注册表值Enable64Bit。使用ldr64.exe更改 标志会立即生效。

请注意,此设置是系统范围的。默认情况下,Enable64Bit被设置为 为1.看起来某些应用程序将其重置为0,并且将值恢复为 可能会导致该应用程序出现问题。