views:

1610

answers:

4

We are loading an assembly (a DLL) which reads a configuration file. We need to change the configuration file and then re-load the assembly. We see that after loading the assembly the 2nd time, there is no change in the configuration. Anyone see what is wrong here? We left out the details of reading in the configuration file.

AppDomain subDomain;
string assemblyName = "mycli";
string DomainName = "subdomain"; 
Type myType;
Object myObject;

// Load Application domain + Assembly
subDomain = AppDomain.CreateDomain( DomainName,
                                    null,
                                    AppDomain.CurrentDomain.BaseDirectory,
                                    "",
                                    false);

myType = myAssembly.GetType(assemblyName + ".mycli");
myObject = myAssembly.CreateInstance(assemblyName + ".mycli", false, BindingFlags.CreateInstance, null, Params, null, null);

// Invoke Assembly
object[] Params = new object[1];
Params[0] = value;
myType.InvokeMember("myMethod", BindingFlags.InvokeMethod, null, myObject, Params);

// unload Application Domain
AppDomain.Unload(subDomain);

// Modify configuration file: when the assembly loads, this configuration file is read in

// ReLoad Application domain + Assembly
// we should now see the changes made in the configuration file mentioned above

+1  A: 

I believe the only way to do this is to start a new AppDomain and unload the original one. This is how ASP.NET has always handled changes to web.config.

John Saunders
+4  A: 

You can't unload an assembly once it's been loaded. However, you can unload an AppDomain, so your best bet would be to load the logic into a seperate AppDomain and then when you want to reload the assembly you'll have to unload the AppDomain and then reload it.

Sean
+1  A: 

If you are just changing some sections you can use ConfigurationManager.Refresh("sectionName") to force a re-read from disk.

static void Main(string[] args)
    {
        var data = new Data();
        var list = new List<Parent>();
        list.Add(new Parent().Set(data));

        var configValue = ConfigurationManager.AppSettings["TestKey"];
        Console.WriteLine(configValue);

        Console.WriteLine("Update the config file ...");
        Console.ReadKey();

        configValue = ConfigurationManager.AppSettings["TestKey"];
        Console.WriteLine("Before refresh: {0}", configValue);

        ConfigurationManager.RefreshSection("appSettings");

        configValue = ConfigurationManager.AppSettings["TestKey"];
        Console.WriteLine("After refresh: {0}", configValue);

        Console.ReadKey();
    }

(Note that you have to change the application.vshost.exe.config file if you are using the VS hosting process, when testing this.)

Richard Hein
+2  A: 

Please see the following 2 links for an answer:

Dynamic Plugins by Jon Shemitz Using AppDomain to load and unload dynamic assemblies by Steve Holstad

Mr. T.