2009-06-21 151 views
6

我們加載組件(一個DLL)讀取一個配置文件。我們需要更改配置文件,然後重新加載程序集。我們發現第二次加載程序集後,配置沒有任何變化。 有人看到這裏有什麼問題嗎?我們在配置文件中省略了閱讀的細節。如何重新加載.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在更新配置文件後重新加載組件?它是否包含動態創建的類型定義? – 2009-06-21 14:52:05

+0

米奇 - 是的他們做 – 2009-06-23 07:49:48

回答

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

(請注意,你必須改變,如果你使用的是VS宿主進程,測試這個時候application.vshost.exe.config文件。)

相關問題