2017-06-30 14 views
0

私のプロジェクトでサードパーティのライブラリを使用しています。私のプロジェクトでは、ユーザーが実行時に動的にロードされ、独自のプラグインを作成することを可能にするプラグインシステムがあります。2つの外部ライブラリから参照される静的クラス - それぞれが独自のバージョンを参照できますか?

var plugin = Assembly.LoadFrom(pathToPluginDLL); 
// later on, the constructor from the user plugin is loaded 
pluginConstructor.Invoke(); 

私はこれらのユーザーのプラグインの一つが、その私の同じサードパーティのライブラリを参照しているというシナリオを持っています主なプロジェクトの使用。そのサードパーティライブラリには、メインプロジェクトで一意で、ユーザープラグイン固有の静的オブジェクトがあります。同じサードパーティのDLLを参照するユーザーのプラグインの一つで

// This is a class within a 3rd party DLL, referenced directly from the main project 
public class SomeClassWithStaticObjects 
    public static string staticString {get; set;} 
} 

// In the main project 
SomeClassWithStaticObjects.staticString = "main project static string"; 

:ここ

は何が起こるかの迅速な不自然なコード例です

SomeClassWithStaticObjects.staticString = "plugin project static string"; 

SomeClassWithStaticObjects.staticStringが参照しているという問題リフレクションを使用して読み込まれたメインプロジェクトとプラグインとの間の同じ静的オブジェクト。ユーザープラグインを自分のメモリ空間に「隔離」して静的クラスの独自のバージョンを持つことができる方法はありますか?

+0

非静的オブジェクト:) ie ....グローバルを避ける –

+0

何が問題なのですか(解決されていないと悪い結果になります)? –

+0

アダプターのパターンを使用して、それをラップすることができます。これにより、これらの外部オブジェクトもすべてコード内でより直交して見えるようになります。あなたのアプリケーション内でもっと統一的なコードのセットを促進すると、私は望むでしょう... – code4life

答えて

3

別々のapplication domainsにある場合は、静的クラスの2つの別々のインスタンスを持つことができます。

多くの古くなったドキュメントがあります。 Here's something a little more recent

This answerも参考になる場合があります。

このライブラリがこの問題を引き起こすのは本当に不思議です。それはちょうど外に見えます。

+0

"唯一の"というのは明らかに間違っています。なぜなら、異なる場所からロードする(GACからロードする)ことができれば、強く型付けされたバージョンを必要なだけ多く持つことができるからです。 –

関連する問題