15

文字列などの変数がある場合、その値を新しいアプリドメインに渡す方法を知りたいです。

static string _str;

static void Main(string[] args) {
    _str = "abc";
    AppDomain domain = AppDomain.CreateDomain("Domain666");
    domain.DoCallBack(MyNewAppDomainMethod);
    AppDomain.Unload(domain);
    Console.WriteLine("Finished");
    Console.ReadKey();
}

static void MyNewAppDomainMethod() {
    Console.WriteLine(_str); //want this to print "abc"
}

ありがとう

4

3 に答える 3

27

最初の要件と2番目の要件の両方に対処する(値を渡し、別の値を取得する)、これは非常に単純な解決策です。

static void Main(string[] args)
{
    AppDomain domain = AppDomain.CreateDomain("Domain666");
    domain.SetData("str", "abc");
    domain.DoCallBack(MyNewAppDomainMethod);
    string str = domain.GetData("str") as string;
    Debug.Assert(str == "def");
}

static void MyNewAppDomainMethod()
{
    string str = AppDomain.CurrentDomain.GetData("str") as string;
    Debug.Assert(str == "abc");
    AppDomain.CurrentDomain.SetData("str", "def");
}
于 2013-09-25T08:36:13.560 に答える
14

AppDomainSetup引数を取るAppDomain.CreateDomainのバリエーションの1つを使用します。AppDomainSetupオブジェクトで、AppDomainInitializerArgumentsメンバーを、新しいアプリドメインに渡す文字列配列に設定します。

http://msdn.microsoft.com/en-us/library/system.appdomainsetup.appdomaininitializerarguments.aspxのサンプルコードを参照してください。

問題のコードを使用すると、変更は次のようになります(テストされていません)。

static voide Main(string[] args) {
    _str = "abc";

    AppDomainSetup setup = new AppDomainSetup();
    setup.AppDomainInitializer = new AppDomainInitializer(MyNewAppDomainMethod);
    setup.AppDomainInitializerArguments = new string[] { _str };

    AppDomain domain = AppDomain.CreateDomain(
        "Domain666",
        new Evidence(AppDomain.CurrentDomain.Evidence),
        setup);

    Console.WriteLine("Finished");
    Console.ReadKey();
}

static void MyNewAppDomainMethod(string[] args) {
    ...
}
于 2009-08-09T05:14:34.153 に答える
6

これは古いスレッドであることを私は知っていますが、おそらくこれは主題を研究している他の人々を助けるでしょう。

この記事では、ライターは、値によるマーシャルまたは参照によるマーシャルオブジェクトをサポートするデータオブジェクトの基本的な交換にアプリケーションドメインSetDataとメソッドを使用することを提案します。GetData

于 2011-06-15T21:09:35.230 に答える