Как перезагрузить сборку для домена приложений .NET? - PullRequest
6 голосов
/ 21 июня 2009

Мы загружаем сборку (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

Ответы [ 4 ]

11 голосов
/ 21 июня 2009

Вы не можете выгрузить сборку после ее загрузки. Однако вы можете выгрузить домен приложений, поэтому лучше всего загрузить логику в отдельный домен приложений, а затем, когда вы захотите перезагрузить сборку, вам придется выгрузить домен приложений, а затем перезагрузить его.

4 голосов
/ 23 июня 2009
3 голосов
/ 21 июня 2009

Если вы просто изменяете некоторые разделы, вы можете использовать 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();
    }

(Обратите внимание, что при тестировании этого процесса необходимо изменить файл application.vshost.exe.config, если вы используете хостинг VS).

3 голосов
/ 21 июня 2009

Я считаю, что единственный способ сделать это - запустить новый домен приложений и выгрузить исходный. Именно так ASP.NET всегда обрабатывал изменения в web.config.

...