C# .NET AppDomains

Create a single instance of an application domain.

/* Dirt simple usage:
 *  1. AppDomain.Create 
 *  2. AppDomain.SetData
 *  3. AppDomain.DoCallBack
 *  4. AppDomain.Unload
 */

namespace AppDomains
{
    class Program
    {
        static void Main(string[] args)
        {
            MySerializedData serialData = new MySerializedData();

            //Create domain and assign a name.  The spawned domain can read it's own name.
            System.AppDomain domain = System.AppDomain.CreateDomain("MY NEW DOMAIN");

            //SetData applies a dictionary like Key, Value pairs to the domain.
            domain.SetData("MyDataObj", serialData);
            domain.SetData("stringData", "Hi there.");
            domain.SetData("intData", 999);

            //Invoke, or start, the STATIC method via callback
            domain.DoCallBack(MyDomainCallback);

            //clean up
            System.AppDomain.Unload(domain);

            System.Console.ReadLine();
        }

        //Static Callback method for AppDomain.DoCallBack
        public static void MyDomainCallback()
        {
            //Get current domain
            System.AppDomain domain = System.AppDomain.CurrentDomain;

            string name = domain.FriendlyName;
            string threadID = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();

            //Get my data passed via key value pairs
            MySerializedData d = (MySerializedData)domain.GetData("MyDataObj");
            string stringData = (string)domain.GetData("stringData");
            int intData = (int)domain.GetData("intData");

            //Display in consoles
            System.Console.WriteLine("MyData={{{0},{1},'{2}'}}, stringData='{3}', and intData={4} were passed to {5}, on thread ID: {6}",
                d.a.ToString(),
                d.b.ToString(),
                d.d,
                stringData,
                intData.ToString(),
                name,
                threadID);
        }
    }

    //Simple class used to pass data to the callback
    [System.Serializable]
    class MySerializedData
    {
        public int a = 3, b = 5;
        public string d = "xxx";
    }
}

David Gregory Medina

Post created by: David Gregory Medina

Leave a Reply