AppDomainを使用していくつかのレガシーコードを管理するというアイデアを試していますが、マルチスレッド環境で静的フィールドが多数含まれています。それは非常に有望だと思ったし、組み立てたClassLibrary1.dllでは非常に単純なクラスでそれを試してみることにしました、How to use an AppDomain to limit a static class' scope for thread-safe use?:AppDomainの静的フィールド
私は答えにこの質問を読ん
namespace ClassLibrary1
{
public static class Class1
{
private static int Value = 0;
public static void IncrementAndPrint()
{
Console.WriteLine(Value++);
}
}
}
を、ここで2つの異なるassemblyintoをロードする私のコードですアプリドメインとIncrementAndPrintを(呼び出し)を数回:
var appDomain1 = System.AppDomain.CreateDomain("AppDomain1");
var appDomain2 = System.AppDomain.CreateDomain("AppDomain2");
var assemblyInAppDomain1 = appDomain1.Load("ClassLibrary1");
var assemblyInAppDomain2 = appDomain2.Load("ClassLibrary1");
var class1InAppDomain1 = assemblyInAppDomain1.GetType("ClassLibrary1.Class1");
var class1InAppDomain2 = assemblyInAppDomain2.GetType("ClassLibrary1.Class1");
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain2.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain2.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain2.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
私は出力があることを期待していた。
0
1
2
0
1
2
AppDomainの各インスタンスにローカルな静的フィールド値のコピーが存在するためです。しかし、代わりに私が得たことだった。
0
1
2
3
4
5
彼らはまだすべての静的フィールド値の同じコピーを共有している私に語っています。 誰でも私がここで間違ったことを教えてもらえますか?
更新:
私は以下に示すように、今私は)CreateInstanceAndUnwrap代わりにロード(呼び出しのアプリケーションドメインクラスの()メソッド)とはgettypeを(呼び出して、エリックの提案を試してみました。また、私はIncrementAndPrintを静的メソッドではなくインスタンスメソッドに変換しました。しかし、私はまだ同じ結果を得ています。
var appDomain1 = System.AppDomain.CreateDomain("AppDomain1");
var appDomain2 = System.AppDomain.CreateDomain("AppDomain2");
var class1InAppDomain1 = (Class1)appDomain1.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.Class1");
var class1InAppDomain2 = (Class1)appDomain2.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.Class1");
class1InAppDomain1.IncrementAndPrint();
class1InAppDomain1.IncrementAndPrint();
class1InAppDomain1.IncrementAndPrint();
class1InAppDomain2.IncrementAndPrint();
class1InAppDomain2.IncrementAndPrint();
class1InAppDomain2.IncrementAndPrint();
あなたは彼は現在のアプリドメインの静的メソッドです。クラス1クラスの静的メソッドを呼び出すインスタンスメソッドを作成する必要があります。 –
こんにちはErik、更新されたソースコードを見れば、IncrementAndPrint()をインスタンスメソッドに変換し、CreateInstanceAndUnWrap()を使用してそれぞれのアプリケーションドメインにインスタンスを作成しています。しかし、私はまだ同じ結果を得ています – oscarkuo
あなたのappDomainモデル上の 'MarhsalByRefObject'については完全に忘れてしまいました。 –