2016-08-16 58 views
-2

該應用程序及其所有庫都使用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

回答

0

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

來自:https://stackoverflow.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,並且將值恢復爲 可能會導致該應用程序出現問題。

相關問題