2011-12-05 5 views
1

C#の画像処理アプリケーションでプラグインを使用するオプションを追加しようとしています。クラスのインターフェイスのみがわかっているときにシリアル化されたオブジェクトをロードする

私はAssembly.LoadFromメソッドを使用してクラスライブラリを読み込んだ後、インターフェイスを探してActivator.CreateInstanceを使用してプラグインのインスタンスを作成しました。これはIPluginインターフェイスから継承したクラスで、両方で参照されていますアセンブリ。 (like in the following example)IPluginインターフェイスを実装するときにアセンブリを読み込むと問題はありません。

画像処理のための別のクラスライブラリに抽象クラスを持っている私はまた、私はImageProcessingActionそれを呼びました。イメージ処理ライブラリを使用して、イメージに対して実行するアクションのリストを作成し、シリアル化されたファイルに保存することもできますが、この抽象クラスを実装するプラグインを作成するオプションを追加することもできます(ImageProcessingAction)別の方法で新しいアクションを作成します(これもうまく動作します)。

実際の問題は、このアクションのリストをシリアル化するときです。プラグインのImageProcessingAction実装のリストをシリアル化すると動作しますが、逆シリアル化すると、 "Unable to find assembly Plugin1"という例外がスローされ、IPluginを実装し、インスタンスを作成してシリアル化しましたそのフィールドのです。

私はpictureとのより良い自分自身を説明できると思う: enter image description here

私はちょうど直列化復元もプラグイン内から動作しないことに気づきました!同じ例外、「アセンブリPlugin1が見つかりません」。デシリアライズするように変更する前に、アセンブリがアンロードされている可能性がありますか?何らかの理由でシリアライズすることができます...

私はすべてを試しましたが、私はまだ無知です。

+1

デシリアライゼーションルーチンの例はありますか? –

+0

特別なものはありませんが、私は[Serializable]属性を使用しました。 http://pastebin.com/Nt5A0tYj 元々、プラグイン内から作成されたImageProcessingActionオブジェクトであるplugin.Actionをシリアル化しようとしました。どちらの方法でも動作していないようです。たとえ、IPluginオブジェクトをシリアル化しても、同じことがシリアル化され、デシリアライズが失敗します。 – Symbol

+0

私が投稿したリンクから解決策を試してください。 –

答えて

2

BinaryFormatterの「アセンブリが見つかりません」は、おそらく専用のBinderを使用して解決できます。

http://spazzarama.wordpress.com/2009/06/25/binary-deserialize-unable-to-find-assembly/

+0

あなたの答えをありがとうが、それは動作していないようです。拘束力はいつ必要ですか?私は文字列をシリアル化しようとしましたが、オーバーライドされたメソッドは呼び出されませんでした。私は同じasssemblyからImageProcessingActionをseralizingしようとし、それが呼び出され、デシリアライズが働いた。しかし、それはプラグインにバインドしようとしている型nullを返します...私はアセンブリが読み込まれていない静的ライブラリのように読み込まれていると思う。どのように正しくシミュレートできますか? – Symbol

+0

私はその周りに道を見いだしましたが、私はまだ誰かが知っているかどうかを知りたいのですか? Wiktorのリンクのように、SerializationBinderを継承してオーバーライドされたクラスを実装しました)BindToTypeメソッド。 Type.GetTypeは動的にロードされたアセンブリから型を見つけることができなかったので、すべてのアセンブリからすべての型をチェックし、BinaryFormatterが正しくデシリアライズするために必要なすべての情報を持つTypeオブジェクトを見つけました。 奇妙なのはタイプです。GetTypeは静的に参照されるライブラリから型を見つけます...ありがとう。 – Symbol

関連する問題