天天看點

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标簽後,問題解決了。:)