Iai*_*ser 2 c# asp.net assemblies xml-serialization
我正在编写一个用于动态加载插件程序集的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
Run Code Online (Sandbox Code Playgroud)
奇怪的是,堆栈跟踪似乎表明XML文档是空的,但我传入的StringReader已经调试并确认填充了正确的文档 - 它不是空的.
我想到了!!!
如果有其他人遇到这个问题,这是一种解决它的方法.
获取可序列化对象并将其放在自己的程序集中(即VS中自己的项目).现在你有两个dll.一个用于动态加载程序集,另一个包含可序列化对象.
拿一个带有可序列化对象的对象并将其放在动态加载插件程序集的任何应用程序的bin目录中.
现在,当动态加载的程序集尝试创建对象时,用于创建该对象的程序集已在内存中可用 - 已静态加载.
我不知道为什么XmlSerializer在使用动态加载的程序集时不喜欢工作,但这种解决方法似乎运行良好.
希望有一天能帮到某人.