如何重新加载.NET应用程序域的组件?(How to reload an assembly for

2019-06-23 18:51发布

我们正在加载组件(DLL),它读取配置文件。 我们需要改变配置文件,然后重新加载该程序集。 我们看到,加载程序集的第二次后,出现在配置没有变化。 任何人看到这里有什么问题? 我们冷落的配置文件中读取信息。

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

Answer 1:

一旦它被加载无法卸载的组件。 但是,您可以卸载一个AppDomain,所以最好的办法是将逻辑加载到一个单独的AppDomain,然后当你要重新加载组件,你必须卸载的AppDomain,然后重新装入。



Answer 2:

请参阅回答以下2个链接:

  • 动态插件由Jon Shemitz
  • 使用AppDomain中由史蒂夫Holstad加载和卸载动态组件


Answer 3:

我认为,要做到这一点的唯一方法是开始一个新的AppDomain和卸载原来的一个。 这是ASP.NET如何始终办理更改web.config文件。



Answer 4:

如果你只是改变某些部分,您可以使用ConfigurationManager.Refresh(“sectionName”)强制从磁盘中读取重。

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

(请注意,你必须改变,如果你使用的是VS宿主进程,测试这个时候application.vshost.exe.config文件。)



文章来源: How to reload an assembly for a .NET Application Domain?