【发布时间】:2023-03-12 17:44:01
【问题描述】:
我有一个类在其方法中使用 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);
【问题讨论】:
-
当您传入
XmlAttributeOverrides时,XML 序列化程序总是从头开始创建一个新的临时程序集,并且不检查缓存或预生成的序列化程序程序集。你会预先生成这些吗? -
不,我们不预先生成
-
其实做不做都无所谓。 new XmlSerializer(t) 和 new XmlSerializer(t, o) 采用稍微不同的代码路径,在后一种情况下,永远不会调用引发您引用的异常的方法。不过,我怀疑生成的序列化程序是否可以工作。
-
在XmlSerializer的两个构造函数中,区别在于XmlAttributeOverrides参数是空的,所以应该不会对结果输出/xml有任何影响?
-
不应该。我的意思是当您尝试使用序列化程序时,可能会加载有问题的程序集(并抛出异常)。毕竟,
new XmlSerializer(t)抛出异常是有原因的,即使我的心灵调试能力太弱,无法告诉你原因。另外,需要记住的一点是,每次调用重载时都在编译一个新的临时程序集XmlAttributeOverrides。
标签: .net dll xml-serialization 32bit-64bit odp.net