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