2012-02-10 18 views
2

Assembly.loadを使用して動的にプラグインアセンブリをロードするCMS用のプラグインを作成しています。動的にロードされたアセンブリのXML逆シリアル化に関するNullReferenceException

注:フロントエンドはアセンブリに静的にロードしますが、管理環境では動的にロードされます。

マイプラグインには、初めてプラグインクラスが使用されるときに読み込まれる独自の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に渡しているが、正しい文書が移入されました - それは空ではありません。

+0

これはデバッガで手を汚す必要がある場所です。 – Zenexer

+0

あなたは私に言いました、私は昨日すべてを一歩踏みとどめてしまいました。私はそれを理解できません。 –

+0

BinaryFormatterを試しましたか?とにかくXmlSerializerで大したことはありませんでした。 – Zenexer

答えて

4

私はそれを考え出しました!

誰かがこの問題に遭遇した場合は、ここで解決する方法があります。

シリアライズ可能なオブジェクトを持って、それを独自のアセンブリ(VS内の独自のプロジェクト)に配置します。今、あなたは2つのdllを持っています。 1つはアセンブリを動的にロードし、もう1つは直列化可能オブジェクトを格納します。

シリアル化可能なオブジェクトを使用して、プラグインアセンブリを動的にロードするアプリケーションのbinディレクトリに配置します。

ダイナミックにロードされたアセンブリがオブジェクトを作成しようとすると、そのオブジェクトを作成するためのアセンブリがメモリ上で既に使用可能になっています(静的にロードされています)。

なぜXmlSerializerが動的に読み込まれたアセンブリで作業するときにうまくいかないのか分かりませんが、この回避策はうまくいくようです。

これはいつか誰かを助けることを願っています。

関連する問題