2014-01-21 28 views
2

我有一個類正在使用Oracle.DataAccess.dll(32位)在其方法中的類。這些方法在服務器上調用(32位)。沒有一個屬性類屬於Oracle.DataAccess.dllXmlSerializer試圖在.NET中加載不相關的DLL

在客戶端我們已經提到了相同的DLL,下面的代碼在32位機器中運行良好,但在64位機器中運行得不錯。

Type t = typeof(ClassA); 
    XmlSerializer s = new XmlSerializer(t); 

在64位機器上得到以下錯誤:

System.BadImageFormatException: Could not load file or assembly 'Oracle.DataAccess, Version=2.111.7.20, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. An attempt was made to load a program with an incorrect format. 
File name: 'Oracle.DataAccess, Version=2.111.7.20, Culture=neutral, PublicKeyToken=89b483f429c47342' 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.CanSerialize(Type type) 
    at System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(Type type, String defaultNamespace, XmlSerializerImplementation& contract) 
    at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) 

爲什麼CLR試圖儘管沒有屬於DLL任何財產要加載的類Oracle.DataAccess.dll?

EDIT 當我們通過一個空XmlAttributeOverrides異常沒有發生

XmlAttributeOverrides o = new XmlAttributeOverrides(); 
XmlSerializer s = new XmlSerializer(t, o); 
+1

當您傳遞'XmlAttributeOverrides'時,XML序列化程序總是從頭創建一個新的臨時程序集,並且不檢查緩存的或預先生成的序列化程序集程序集。你是否預先生成這些? –

+0

不,我們不會預先生成 – Brij

+0

其實不管你做什麼都沒關係。新的XmlSerializer(t)和新的XmlSerializer(t,o)採用稍微不同的代碼路徑,在後一種情況下,拋出引用異常的方法從不會被調用。不過,我懷疑生成的序列化程序是否可行。 –

回答

1

此錯誤通常意味着該組件是混合組件,即,它包含受管理的和本機代碼。所以從操作系統的POV來看,它只是一個32位的DLL,無法加載到64位的進程中。如果Oracle提供此程序集的32位和64位版本,則必須修改部署過程以確保安裝了正確的程序集。如果只有32位程序集可用,那麼除了構建託管應用程序x86而不是anycpu之外,您可以做的很少。如果這是不切實際的,則一種解決方案是創建一個單獨的32位服務進程,它將加載該程序集,並使用選定的IPC機制與主要的64位進程通信。

+0

傳遞給XmlSerializer的類型沒有來自Oracle dll的任何屬性,但它爲什麼試圖加載它? – Brij

+0

也許它的代碼引用這個程序集(可能間接地通過另一個程序集)。基類,屬性,擴展方法...嘗試在程序集解析事件中設置斷點,並查看堆棧跟蹤/本地化。 –