我有一个在其方法中使用Oracle.DataAccess.dll(32位)类的类。这些方法在服务器(32位)上调用。类的属性都不属于Oracle.DataAccess.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尝试加载Oracle.DataAccess.dll,尽管类没有属于dll的属性?
修改 当我们传递一个空的XmlAttributeOverrides
时,不会发生异常XmlAttributeOverrides o = new XmlAttributeOverrides();
XmlSerializer s = new XmlSerializer(t, o);
答案 0 :(得分:1)
此错误通常意味着程序集是一个混合程序集,即它包含托管代码和本机代码。因此,从操作系统的POV来看,它只是一个32位的dll,无法加载到64位进程中。如果Oracle同时提供此程序集的32位和64位版本,则必须修改部署过程以确保安装了正确的程序集。如果只有32位程序集可用,除了使托管应用程序x86而不是anycpu之外,你可以做的很少。如果这是不切实际的,一种解决方案是创建一个单独的32位服务进程,该进程将加载此程序集,并使主要的64位进程使用选择的IPC机制与之通信。