トップ回答者
動的に読み込んだDLLでどうすればデシリアライズできるのでしょうか

質問
-
Serializableを適用し、ISerializableインターフェースを実装しているクラスを含むDLLを、動的に読み込んでいるのですが、デシリアライズができません。
シリアライズ、デシリアライズは、BinaryFormatterクラスのSerialize()メソッド、Deserialize()メソッドを使用していますが、デシリアライズ時に、動的に読み込んでいるDLLが読み込まれていないと、Exceptionが発生してしまいます。
DLLの動的読み込みは、Assembly.LoadFrom()メソッドで実装しています。
DLLを読み込むときに、他にも何かする必要がありますでしょうか?
どうかよろしくお願いいたします。
回答
-
動的に読み込むDLLは、アプリケーションフォルダ(プライベートフォルダ)のサブフォルダということですが、そのことを、アプリケーション構成ファイルの <probing privatePath>でアプリケーション(CRL)には教えているでしょうか?Deserializeメソッド内部では、独自にDLLをLoadしてDeserialize対象の型を探しているはずなので、プローブさせたい独自のサブフォルダをアプリケーション構成ファイルで指定してあげないと、アセンブリのロードエラーになるはずです。尚、ISerializableを実装した型には、(SerializationInfo info, StreamingContext context)をパラメータとするコンストラクタも必要になります。試してみてください。
すべての返信
-
もうちょっと整理して頂けますか?
前提
・ISerializeを実装したクラスを含むDLLがある。
・SerializeをするときはこのDLLをAssembly.LoadFromメソッドで読み込んでいる。
ここまでは問題ないと思います。問題は次の項目です。
「DeserializeするときはDLLを事前に(Assembly.LoadFromメソッドで)読み込んでいない。」
この認識で問題ないでしょうか?
以下はこの認識に基づいて記述します。
----------------------------------------
アセンブリ(DLL)が読み込まれていない場合、そのクラスの詳細は分かりません。
その状態でDeserializeしても、自動的にアセンブリ(DLL)が読み込まれるようなことはありません。
Deserializeするためにはそのクラスを含むアセンブリ(DLL)を予め(Assembly.LoadFromメソッド等で)読み込んでおく必要があります。
-
ご回答ありがとうございます。
・ISerializeを実装したクラス(仮にクラス名A)を含むDLLを動的にAssembly.LoadFormで読み込んでいます。
・上記と同じDLLにSerialize,Deserializeをさせるクラス(仮にクラス名B)も実装しています。
クラスA、クラスBが同一のDLLですので、読み込まれているはずなのですが、読み込まれていないとエラーとなってしまいます。
エラーとの関連はないかもしれませんが、動的に読み込むDLLは、アプリケーション(EXE)とは別のフォルダに格納しています。
・アプリケーションは、”フォルダXXX”に格納しています。
・動的に読み込むDLLは、”フォルダXXX/YYY”に格納しています。
・”フォルダXXX/YYY”には、上記DLLのみ格納されています。
よろしくお願いいたします。
-
動的に読み込むDLLは、アプリケーションフォルダ(プライベートフォルダ)のサブフォルダということですが、そのことを、アプリケーション構成ファイルの <probing privatePath>でアプリケーション(CRL)には教えているでしょうか?Deserializeメソッド内部では、独自にDLLをLoadしてDeserialize対象の型を探しているはずなので、プローブさせたい独自のサブフォルダをアプリケーション構成ファイルで指定してあげないと、アセンブリのロードエラーになるはずです。尚、ISerializableを実装した型には、(SerializationInfo info, StreamingContext context)をパラメータとするコンストラクタも必要になります。試してみてください。