2011-10-19 10 views
1

を渡し、我々は我々がそれを使用してプラグインの多くを持ってアセンブリAに.NETプラグイン:共通のインターフェイスのバージョンが変更さは、データ

public class PluginData { public string Data { get; set; } } 
public interface IPlugin { public PluginData Get(); } 

をプラグインインターフェイスを定義するとします。次に、プラグインインタフェースを変更してもう1つのメソッドを追加すると、プラグインインタフェースアセンブリはv1.1になりました。

public class PluginData { public string Data { get; set; } } 
public interface IPlugin 
{ 
    public PluginData Get(); 
    public void Process(PluginData data); 
} 

さて、

var data = new PluginV10().Get(); 
new PluginV11().Process(data); 

を行う方法はありますか?

私が今見る唯一の解決策は、XML方式へ/からカスタムを持つ、それをデシリアライズ/シリアライズすることにより、手動データをマーシャリングすることで、リフレクションを使用して呼び出さなど

+0

私の場合、 'Get()/ Process()'メソッドが同じ 'PluginData'クラスを参照する限り、コードスニペットは問題ありませんか? – sll

+0

'assembly'タグは、.NETアセンブリではなく、低レベルプログラミング用です。 – harold

+0

コードスニペットの問題は、PluginData型が互換性がないことです。 PluginV11はPluginData v11バージョンを期待しています。逆も同様です。異なるアセンブリバージョンのタイプは互換性がありません。例えば。 http://blogs.msdn.com/b/thottams/archive/2007/04/11/two-versions-of-an-assembly-in-an-appdomain.aspx – queen3

答えて

0

あなたがやらなければならないことは、タイプを定義することですPluginDataは1か所にしかありません。つまり、インタフェースのバージョンと残りのコードがアセンブリAタイプPluginDataを参照する場合、すべてが正常に機能します。

EDIT:

IPluginDataV2がIPluginDataV1から継承されていない場合、私は考えることができるすべてはXMLとしてPluginDataV1インスタンスを保存し、XMLからデータをIPluginDataV2を移入することです。推測あなたは組み込みのXMLシリアライズを試すことができますが、PluginDataV1には存在しない新しいnullableでないプロパティに問題が発生する可能性があります。また、他のすべてのXMLシリアル化の制限が適用されます。シリアル化はパブリックプロパティとフィールドでのみ機能します。

XMLシリアル化を使用する場合は、優れたスレッド:XML serialization gotchasを参照してください。

編集#2:実際には、私はあなたの質問の最後の文で正確な答えを与えたと信じています。

+0

を参照してください。 PluginDataは、新しいプラグインバージョンで新しいフィールドを取得することもできます。 – queen3

+0

この追加の詳細はあなたの質問をもっと面白くしました:)私は答えを編集しました。 –

関連する問題