C# .NET AppDomains, How to check if Unloaded

This hack is a quick and easy way to determine if a specific domain is loaded or unloaded.

namespace AppDomains
{
    class Program
    {
        static void Main(string[] args)
        {
            string domainName = "MY DOMAIN NAME";

            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(domainName);

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


            //Processes which complete quickly and unload themselves, before DoCallBack completes, throw AppDomainUnloadedException 
            try
            {
                //Invoke, or start, the STATIC method via callback
                domain.DoCallBack(MyDomainCallback);
            }
            catch (System.AppDomainUnloadedException e)
            {
                System.Console.WriteLine("The appdomain " + domainName + " exited before DoCallBack completed.");
            }


            //HACK: To check if the appdomain is running.
            try
            {
                System.Console.WriteLine();
                // Note that the following statement creates an exception because the domain no longer exists.
                System.Console.WriteLine("Child domain: " + domain.FriendlyName);
            }
            catch (System.AppDomainUnloadedException e)
            {
                System.Console.WriteLine("The appdomain " + domainName + " does not exist.");
            }

            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);


            //Self unloading
            System.AppDomain.Unload(domain);
        }
    }




    //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