天天看点

Xml序列化的调试开关(四)

XML序列化错误:找不到文件或程序集名称“effvdqz0.dll”,或找不到它的一个依赖项

详细的堆栈如下:

StackTrace "   at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Boolean isStringized, Evidence assemblySecurity, Boolean throwOnFileNotFound, Assembly locationHint, StackCrawlMark& stackMark)/r/n   at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Boolean stringized, Evidence assemblySecurity, StackCrawlMark& stackMark)/r/n   at System.Reflection.Assembly.Load(AssemblyName assemblyRef, Evidence assemblySecurity)/r/n   at System.CodeDom.Compiler.CompilerResults.get_CompiledAssembly()/r/n   at System.CodeDom.Compiler.CompilerResults.get_CompiledAssembly()/r/n   at System.Xml.Serialization.Compiler.Compile()/r/n   at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings)/r/n   at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlTypeMapping xmlTypeMapping)/r/n   at System.Xml.Serialization.XmlSerializer..ctor(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, String defaultNamespace)/r/n   at System.Xml.Serialization.XmlSerializer..ctor(Type type, XmlAttributeOverrides overrides)/r/n

上面那个dll即是.net动态生成的。为什么会找不到呢?

通常的原因是,当前帐户的临时目录下确实不能生成该dll,可能是权限的原因。

然而,还存在另一种原因。即:由于动态编译失败,所以dll没有生成。如下场景下会发生这种事情:

我们知道,XML序列化支持类型重载。

当动态添加一个数组属性的XmlElement标签后,竟然发现GenerateTempAssembly方法生成的cs文件中,会将该数组强行转换为XmlElement标签中的类型(是一个强类型数组),由于这中转化必然是编译不过的,所以就不会生成dll文件,自然就会出现上面的问题。

解决办法:

添加一个XmlElment标签后,问题解决了。:)