XmlSerializer试图在.NET中加载不相关的DLL

时间:2014-01-21 19:13:16

标签: .net dll xml-serialization 32bit-64bit odp.net

我有一个在其方法中使用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);

1 个答案:

答案 0 :(得分:1)

此错误通常意味着程序集是一个混合程序集,即它包含托管代码和本机代码。因此,从操作系统的POV来看,它只是一个32位的dll,无法加载到64位进程中。如果Oracle同时提供此程序集的32位和64位版本,则必须修改部署过程以确保安装了正确的程序集。如果只有32位程序集可用,除了使托管应用程序x86而不是anycpu之外,你可以做的很少。如果这是不切实际的,一种解决方案是创建一个单独的32位服务进程,该进程将加载此程序集,并使主要的64位进程使用选择的IPC机制与之通信。