【问题标题】:NullReferenceException on XML Deserialization in dynamically loaded assembly动态加载程序集中 XML 反序列化的 NullReferenceException
【发布时间】:2012-02-10 02:08:17
【问题描述】:

我正在为 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 - 它不是空的。

【问题讨论】:

  • 这是我需要用调试器弄脏手的东西。
  • 你是在告诉我,我昨天花了一天的时间来完成这一切,但我无法弄清楚。我真的真的不想编写自己的反序列化器,但它是这样的:(。
  • 你试过 BinaryFormatter 吗?无论如何,我对 XmlSerializer 的运气并不好。
  • 我很想尝试一下,不幸的是我希望我的配置文件是人类可读和可编辑的:(
  • 试试DataContractSerializer 而不是BinaryFormatter

标签: c# asp.net xml-serialization assemblies


【解决方案1】:

我明白了!!!

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

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

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

现在,当您动态加载的程序集尝试创建对象时,用于创建该对象的程序集已在内存中可用 - 已被静态加载。

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

希望有一天这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多