Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to reload an assembly for a .NET Application Domain?

Tags:

c#

.net

appdomain

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

like image 809
Mr. T. Avatar asked Jun 21 '09 14:06

Mr. T.


3 Answers

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 separate AppDomain and then when you want to reload the assembly you'll have to unload the AppDomain and then reload it.

like image 109
Sean Avatar answered Nov 08 '22 20:11

Sean


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.

like image 31
John Saunders Avatar answered Nov 08 '22 21:11

John Saunders


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

like image 33
Richard Anthony Freeman-Hein Avatar answered Nov 08 '22 20:11

Richard Anthony Freeman-Hein