动态加载的程序集中的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,我已经调试并确认它填充了正确的文档——它不是空的。

动态加载的程序集中的XML反序列化出现NullReferenceException

我想通了!!!

如果其他人遇到这个问题,这里有一种解决方法

获取可序列化对象并将其放入自己的程序集中(即VS中自己的项目)。现在你有两个dll。一个包含要动态加载的程序集,另一个包含可序列化对象。

取一个带有可序列化对象的对象,并将其放在任何动态加载插件程序集的应用程序的bin目录中。

现在,当动态加载的程序集试图创建一个对象时,用于创建该对象的程序集已经在内存中可用——已经静态加载。

我不知道为什么XmlSerializer在处理动态加载的程序集时不喜欢工作,但这种解决方法似乎工作得很好。

希望这有一天能帮助到别人。

相关文章: