NullReferenceException при десериализации XML в динамически загружаемой сборке - PullRequest
2 голосов
/ 10 февраля 2012

Я пишу плагин для 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, который я отладил и подтвердил, заполнен правильным документом - он не пустой.

1 Ответ

5 голосов
/ 10 февраля 2012

Я понял это !!!

Если кто-то еще сталкивался с этой проблемой, вот способ ее решения.

Возьмите ваш сериализуемый объект и поместите его в свою собственную сборку (то есть в свой собственный проект в VS). Теперь у вас есть две библиотеки. Один с вашей сборкой для динамической загрузки, а другой с вашим сериализуемым объектом.

Возьмите один с вашим сериализуемым объектом и поместите его в каталог bin любого приложения, которое динамически загружает вашу сборку плагина.

Теперь, когда ваша динамически загружаемая сборка пытается создать объект, сборка для создания этого объекта уже доступна в памяти - статически загружена.

Я не знаю, почему XmlSerializer не нравится работать при работе с динамически загруженной сборкой, но этот обходной путь, похоже, работает хорошо.

Надеюсь, это поможет кому-нибудь когда-нибудь.

...