动态加载的程序集中的XML反序列化出现NullReferenceException
本文关键字:反序列化 XML NullReferenceException 集中 加载 程序 程序集 动态 | 更新日期: 2023-09-27 18:24:03
我正在为CMS编写一个插件,该插件使用Assembly.load
动态加载插件程序集。
注意:由于不相关的原因,前端静态加载程序集,而管理环境动态加载程序集
我的插件有自己的xml配置文件,它在第一次使用插件类时加载。使用XmlSerializer
将配置文件反序列化为对象对象。
当我通过前端静态加载程序集时,这种反序列化可以很好地工作,但是当管理员试图动态加载它时,我会从读取器获得NullReferenceException
。
我尝试过使用Sgen预生成序列化程序集,并将其添加到管理环境的"Bin"目录中,但这似乎没有效果。
堆栈跟踪:
[NullReferenceException: Object reference not set to an instance of an object.]
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderAccessibilityConfig..cctor() +1156
[TypeInitializationException: The type initializer for 'Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderAccessibilityConfig' threw an exception.]
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderAccessibilityConfig..ctor() +0
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.get_Reader() +44
System.Xml.Serialization.TempAssembly.InvokeReader(XmlMapping mapping, XmlReader xmlReader, XmlDeserializationEvents events, String encodingStyle) +69
System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) +101
[InvalidOperationException: There is an error in XML document (0, 0).]
System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) +613
System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader) +30
CoA.WebUI.Controls.AccessibilityObjects.AccessibilityConfigBase`1.Deserialize(String xml) +196
CoA.WebUI.Controls.AccessibilityObjects.AccessibilityConfigBase`1.LoadFromFile(String fileName) +256
CoA.WebUI.Controls.Accessibility.Configure(Boolean isAdmin) +725
CoA.WebUI.Controls.Accessibility.GetProperties() +118
CMS.Admin.WebUI.CustomControlCreator.GetCustomControlProperties() +194
CMS.Admin.WebUI.CustomControlCreator.BindPropertyControls() +146
CMS.Admin.WebUI.CustomControlCreator.PageLoad() +164
CMS.Admin.WebUI.CustomControlCreator.Page_Load(Object sender, EventArgs e) +47
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +50
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627
奇怪的是,堆栈跟踪似乎表明XML文档是空的,但我传入了一个StringReader,我已经调试并确认它填充了正确的文档——它不是空的。
我想通了!!!
如果其他人遇到这个问题,这里有一种解决方法
获取可序列化对象并将其放入自己的程序集中(即VS中自己的项目)。现在你有两个dll。一个包含要动态加载的程序集,另一个包含可序列化对象。
取一个带有可序列化对象的对象,并将其放在任何动态加载插件程序集的应用程序的bin目录中。
现在,当动态加载的程序集试图创建一个对象时,用于创建该对象的程序集已经在内存中可用——已经静态加载。
我不知道为什么XmlSerializer
在处理动态加载的程序集时不喜欢工作,但这种解决方法似乎工作得很好。
希望这有一天能帮助到别人。