次のサンプルは、「appdomain 間で値をやり取りする」に基づいています。ここで、Marc Gravell は、appdomain 間の .Net リモート処理に関する質問に対して親切に非常に良い回答を提供してくれました。私が行ったことは、文字列の配列でも機能するはずであるという(非常に素朴な?)期待で拡張されています。
問題は、それが一方向にしか機能しないことです。作成された appdomain はアレイにアクセスできますが、読み取り専用にしかアクセスできません。私が望むのは、更新された配列要素を元の appdomain にも戻すことです。List<> および Dictionary<> オブジェクトでこれを行いたいと思います。これは可能ですか?
using System;
namespace StackoverflowSample
{
class MyBoundaryObject : MarshalByRefObject
{
public void SomeMethod(AppDomainArgs ada)
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + "; executing");
ada.MyString = "working!";
ada.MyStringArray[0] = "working!";
string s = ada.MyStringArray[0]; // s is assigned value "a"!!!
}
}
public class AppDomainArgs : MarshalByRefObject
{
public string MyString { get; set; }
public string[] MyStringArray { get; set; }
}
static class Program
{
static void Main()
{
AppDomain domain = AppDomain.CreateDomain("Domain666");
MyBoundaryObject boundary = (MyBoundaryObject)
domain.CreateInstanceAndUnwrap(
typeof(MyBoundaryObject).Assembly.FullName,
typeof(MyBoundaryObject).FullName);
AppDomainArgs ada = new AppDomainArgs();
ada.MyString = "abc";
ada.MyStringArray = new string[] { "a", "b" };
Console.WriteLine("Before: " + ada.MyString + " " + ada.MyStringArray[0]);
boundary.SomeMethod(ada);
Console.WriteLine("After: " + ada.MyString + " " + ada.MyStringArray[0]);
Console.ReadKey();
AppDomain.Unload(domain);
}
}
}