2010-09-03 63 views
8

我想更改我的應用程序查找app.config文件的位置。我知道我可以使用ConfigurationManager.OpenExeConfiguration()訪​​問一個任意的配置文件 - 但是,當.Net Framework讀取配置文件(例如ConnectionStrings或EventSources)時,它會查看默認位置。我想實際改變整個.Net Framework的位置(當然,對於我的應用程序)。如何更改app.config的位置

我也知道,我可以使用AppDomainSetup改變的app.config的位置爲新的AppDomain。但是,這不適用於應用程序的主AppDomain。

我也知道,我可以覆蓋函數main(),並創建一個新的AppDomain如上並運行我的新AppDomain中的應用。但是,這具有其他副作用 - 例如,Assembly.GetEntryAssembly()將返回空引用。

考慮到.Net中的其他所有工作,我希望有一些方法來配置我的應用程序的啓動環境 - 通過應用程序清單或其他方式 - 但我一直無法找到一絲希望朝這個方向發展。

任何指針都會有幫助。也許有可能解決您的實際問題,不同的方法 -

大衛·穆林

回答

9

我所使用的方法與從開始主另一個應用程序域(),指定配置文件的「新」的位置。

GetEntryAssembly();沒有問題;它只返回null,當調用從非託管代碼 - 或者至少是不適合我,因爲我用ExecuteAssembly()創建/運行第二個AppDomain中,就像這樣:

int Main(string[] args) 
{ 
    string currentExecutable = Assembly.GetExecutingAssembly().Location; 

    bool inChild = false; 
    List<string> xargs = new List<string>(); 
    foreach (string arg in xargs) 
    { 
     if (arg.Equals("-child")) 
     { 
     inChild = true; 
     } 
     /* Parse other command line arguments */ 
     else 
     { 
     xargs.Add(arg); 
     } 
    } 

    if (!inChild) 
    { 
     AppDomainSetup info = new AppDomainSetup(); 
     info.ConfigurationFile = /* Path to desired App.Config File */; 
     Evidence evidence = AppDomain.CurrentDomain.Evidence; 
     AppDomain domain = AppDomain.CreateDomain(friendlyName, evidence, info); 

     xargs.Add("-child"); // Prevent recursion 

     return domain.ExecuteAssembly(currentExecutable, evidence, xargs.ToArray()); 
    } 

    // Execute actual Main-Code, we are in the child domain with the custom app.config 

    return 0; 
} 

請注意,我們正在有效地重新運行EXE,就像AppDomain和不同的配置一樣。另外請注意,你需要有一些「魔術」選項,防止這種情況不斷髮生。

我從代碼更大的(真正的)塊製作了這一點,所以它可能不是作爲是工作,但應該說明的概念。

+0

嗯。在我對這種方法的測試中(與您的方法不同),GetEntryAssembly確實返回null。但是,我沒有執行ExecuteAssembly - 我找到了我編寫並執行過的「第二主」。我會嘗試你的方法,看看它是否適合我。 – 2010-09-03 05:26:54

+0

我認爲ExecuteAssembly有所作爲。至少Docs說GetEntryAssembly返回可執行的,*或*傳遞給ExecuteAssembly()的那個。 – 2010-09-03 08:41:06

0

爲什麼你想改變你的配置文件的位置,我不知道。我有一個要求,我希望在相關應用程序中共享配置文件 - 我選擇使用自己的XML文件,因爲它給了我完全控制架構的額外好處。

在你的情況,很可能外部化您的配置文件的部分使用configSource屬性一個單獨的文件。請參閱「使用外部配置文件」下的here以檢查它是如何完成連接字符串部分的。也許,這可能對你有幫助。

+0

想要做到這一點的主要原因是應用程序通過ClickOnce安裝,它有效地隱藏了配置文件。但是,有些設置(如TraceSource條目)可以在客戶端計算機上進行配置,並可以在安裝之間保留(因爲ClickOnce更新可能會取代配置文件)。 – 2010-09-03 05:25:07

+0

我看到了 - 也許你可以使用AppSettings(http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx)?他們支持ClickOnce方案 - 請參閱http://msdn.microsoft.com/en-us/library/ms228995。ASPX。 – VinayC 2010-09-03 05:41:42

+0

我無法使用AppSettings,因爲.Net Framework不會在那裏尋找TraceSources(或任何其他特定於框架的配置)。 – 2010-09-03 16:07:16

0
var configPath = YOUR_PATH; 
if (!Directory.Exists(ProductFolder)) 
{ 
    Directory.CreateDirectory(ProductFolder); 
} 

if (!File.Exists(configPath)) 
{ 
    File.WriteAllText(configPath, Resources.App); 
} 

var map = new ExeConfigurationFileMap 
{ 
    ExeConfigFilename = configPath, 
    LocalUserConfigFilename = configPath, 
    RoamingUserConfigFilename = configPath 
}; 

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 

然後根據需要使用配置成員。

+0

這對其他一些用戶可能很有用,但沒有解決OP的問題。他明確說明爲什麼這種方法在這個問題上不適合他。具體來說,各種框架類(例如WCF配置)從默認位置的配置文件中獲取設置......您無法影響它們,而是在「config」變量中使用「Configuration」實例。 – TCC 2014-04-08 21:02:59