2011-06-29 153 views
10

我想在Win7 x64上運行我的.NET 3.5 WinForms應用程序。應用程序使用NHibernate和System.Data.OracleClient訪問Oracle數據庫。 Oracle客戶端是32位。如何強制.NET應用程序運行在32位模式

當啓動應用程序,我得到了以下錯誤消息

嘗試加載Oracle客戶端庫扔BadImageFormatException。 在安裝了32位Oracle客戶端組件的64位模式下運行時,會發生此問題。試圖在執行一個新的版本時

Screenshot of the Build settings

令我驚訝的是,非常相同的錯誤消息出現

迴應,我針對性我生成的x86平臺Win7平臺。

NHibernate程序集在運行時由Assembly.Load("...");加載。

難道是NHibernate的DLL仍然運行在64位模式,而主機EXE運行在32位模式。這聽起來很奇怪。或者,無論出於何種原因,即使它的目標是x86,我的應用程序仍以64位模式運行?


更新:

我檢查了我的使用CorFlags二進制文件,它標誌着32位:

Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.1 
Copyright (c) Microsoft Corporation. All rights reserved. 

Version : v2.0.50727 
CLR Header: 2.5 
PE  : PE32 
CorFlags : 3 
ILONLY : 1 
32BIT  : 1 
Signed : 0 

我也檢查了它在任務管理器,它有一個*32後綴。

我也試過和使用CorFlags到32位標誌添加到所有組件來與我的應用程序。它仍然會產生相同的錯誤信息。

我疑惑不解... ... ...不解

+1

您是否通過任務管理器檢查過您的程序在32位或64位模式下運行時是否崩潰?如果它的進程名稱後面有「* 32」,那麼它是32位的,否則是64位(假設64位操作系統和系統)。 –

+2

你是以x86爲目標的?你的班級圖書館?你的計劃?都? –

+1

@Lasse:更詳細的應用程序由3層,2個DLL和1個EXE組成,而一個DLL引用NHibernate。我已將所有這些目標指向x86,並確保在編譯時EXE項目使用DLL項目的x86 bin。我無法控制的唯一事情就是NHibernate DLL本身。 – chiccodoro

回答

3

正確的,這聽起來像NHibernate的組件與AnyCPU爲平臺的目標建造的。您需要一個專門爲x86構建的NHibernate程序集。

+0

嗨sixlettervariables。這是否意味着當EXE以32位模式運行時,加載到同一進程中的DLL仍可以以64位模式運行?你確定?這將是相當不幸的,因爲我不控制NHibernate的構建... – chiccodoro

+0

不,因爲我在我的答案中寫道一個32位進程無法加載64位DLL。 –

+0

@Helge:我說它加載了一個AnyCPU DLL,然後請求一個64位DLL。 – user7116

6

32位進程無法加載64位DLL,反之亦然(有關詳細信息,請參閱this)。這意味着如果您的進程成功加載了64位DLL,那麼它絕對是一個64位進程。您可以驗證在任務管理器中(如Lasse建議的)或通過其他方式描述here。該文章還在Windows x64上提供了有關.Net的更多信息。

+0

嗨Helge,謝謝你的回覆。這也是我所想的(DLL必須以與主機進程相同的模式運行)。我檢查了任務管理器並使用CorFlags,我的EXE是32位。 (請參閱我的問題更新)。 – chiccodoro

0

萬一它有助於任何人,我遇到與Oracle 64位和Windows 7 64位相同的症狀。我獨自離開平臺目標(沒有更改任何項目設置)。相反,我只是安裝了Oracle 32位,並解決了這個問題。務必更新您的環境變量(即ORACLE_HOME,PATH)以指向32位版本。

+0

有趣的是,我有32位的問題,並在最後安裝64位解決了它! – chiccodoro

2

您可以嘗試RunAsx86

我用這個工具來啓動x86的模式下,當在命令行中運行它們的.NET應用程序。

0

我以前遇到過類似的問題。我有一個使用Crystal Reports的Windows服務,在我的64b機器上一切正常,我調整了一切 - 該項目是爲了使用x86架構而構建的。

部署到不同機器時發生問題,服務失敗,因爲Crystal Reports引擎無法加載log4net.dll 1.2.10程序集。我檢查了目錄 - 版本有1.2.11,我的本地目錄包含相同的版本。 bindingRedirect沒有工作。

然後我檢查了GAC-CR dll是否已簽名,並且已由安裝程序添加到GAC,log4net 1.2.10在那裏,但處理器架構不是x86。 在爲x86架構添加log4net 1.2.10之後,它的工作就像一個魅力。

+0

不知道這與原始問題有多大關係...... – chiccodoro

+0

我想分享我的故事,並表明畢竟這是爲GAC安裝適當的版本。 –

0

我在我的C++ oracle應用程序中遇到了同樣的錯誤,我需要在64位機器上運行32位機器。不好的圖像錯誤是由於32位和64位dll的混合造成的,因此我使用依賴關係walker來查找哪些dll混合在一起。在那個應用程序中,我發現oci.dll是64位的,因爲我已經安裝了64位的oracle客戶端,但所有其他32位的dll。所以我在64位機器上安裝了32位的oracle客戶端並解決了這個錯誤。

相關問題