2009-06-21 2 views
6

Мы загружаем сборку (DLL), которая считывает файл конфигурации. Нам нужно изменить файл конфигурации, а затем снова загрузить сборку. Мы видим, что после загрузки сборки в 2-й раз, изменений в конфигурации нет. Кто-нибудь видит, что здесь не так? Мы не учитывали детали чтения в файле конфигурации.Как перезагрузить сборку для домена .NET?

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

почему вы урожденная d перезагрузить сборку после обновления файла конфигурации? Он содержит определения типов, которые динамически создаются? –

+0

Mitch - да, они делают –

ответ

4

Пожалуйста, смотрите следующие 2 ссылок для ответа :

+1

Ссылка динамических плагинов нарушена (по состоянию на 20.05.2014 в 11:13 PDT). Возможно, это намеревается указать на что-то вроде этого: https://bmark.us/bmark/readable/9503538d6bab80 – devinbost

+0

обе ссылки, кажется, сломаны :( –

3

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

11

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

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

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

Смежные вопросы