Search code examples
c#appdomain

How do I create an application domain and run my application in it?


I need to create a custom application domain to work around a bug in the .NET runtime's default behavior. None of the sample code I've seen online is helpful since I don't know where to place it, or what it needs to replace within my Main() method.


Solution

  • It should probably be noted that creating AppDomains just to get around something that can be fixed with a constant string is probably the wrong way to do it. If you are trying to do the same thing as the link you noted, you could just do this:

    var configFile = Assembly.GetExecutingAssembly().Location + ".config";
    if (!File.Exists(configFile))
        throw new Exception("do your worst!");
    

    Recursive Entry Point :o)

    static void Main(string[] args)
    {
        if (AppDomain.CurrentDomain.IsDefaultAppDomain())
        {
            Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
    
            var currentAssembly = Assembly.GetExecutingAssembly();
            var otherDomain = AppDomain.CreateDomain("other domain");
            var ret = otherDomain.ExecuteAssemblyByName(currentAssembly.FullName, args);
    
            Environment.ExitCode = ret;
            return;
        }
    
        Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
        Console.WriteLine("Hello");
    }
    

    Quick sample using a nonstatic secondary entry point and MarshalByRefObject...

    class Program
    {
        static AppDomain otherDomain;
    
        static void Main(string[] args)
        {
            otherDomain = AppDomain.CreateDomain("other domain");
    
            var otherType = typeof(OtherProgram);
            var obj = otherDomain.CreateInstanceAndUnwrap(
                                     otherType.Assembly.FullName,
                                     otherType.FullName) as OtherProgram;
    
            args = new[] { "hello", "world" };
            Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
            obj.Main(args);
        }
    }
    
    public class OtherProgram : MarshalByRefObject
    {
        public void Main(string[] args)
        {
            Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
            foreach (var item in args)
                Console.WriteLine(item);
        }
    }