如何为 .NET 应用程序域重新加载程序集?

Posted

技术标签:

【中文标题】如何为 .NET 应用程序域重新加载程序集?【英文标题】:How to reload an assembly for a .NET Application Domain? 【发布时间】:2009-06-21 14:48:01 【问题描述】:

我们正在加载读取配置文件的程序集(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

【问题讨论】:

为什么更新配置文件后需要重新加载程序集?它是否包含动态创建的类型定义? 【参考方案1】:

程序集一旦加载就无法卸载。但是,您可以卸载 AppDomain,因此最好的办法是将逻辑加载到单独的 AppDomain 中,然后当您想要重新加载程序集时,您必须卸载 AppDomain,然后重新加载它。

【讨论】:

【参考方案2】:

我相信这样做的唯一方法是启动一个新的 AppDomain 并卸载原来的 AppDomain。这就是 ASP.NET 一直以来处理 web.config 更改的方式。

【讨论】:

【参考方案3】:

如果您只是更改某些部分,则可以使用 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 文件。)

【讨论】:

以上是关于如何为 .NET 应用程序域重新加载程序集?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 .NET 库配置具有依赖注入的日志记录提供程序

如何为 localhost 网站配置 IIS 7?

将外部程序集加载到新的应用程序域并调用“基类”的方法

如何为 dotnet core(web Api) 代码更改以及 TypeScript 代码更改启用实时重新加载

如何为指向两个不同域的一个 Laravel 应用程序设置不同的语言环境?

如何为指向 Heroku 应用程序的***域(无 www)设置 DNS?