2009-12-03 135 views
19

是否可以將整個App.Config文件重定位到自定義路徑?將app.config文件重定位到自定義路徑

配置文件與exe文件位於同一個文件夾中似乎有點奇怪,Windows的新程序將所有程序設置保存在c:\ ProgramData和全部文件中。

我們有一個額外的要求是以編程方式指定在哪裏找到app.config文件。原因是我們從同一個exes產生了不同的服務實例,並且希望將每個服務的app.config存儲在c:\ ProgramData \\下的該服務的設置文件夾中。

+0

默認品行是一個程序具有1個默認的配置文件在其自己的導演和每個用戶有他們自己的配置文件存儲在他們的用戶區,Bu默認任何設置設置爲用戶將從用戶配置拉,除非不存在,那麼它將使用程序config – MikeT

回答

14

每個應用程序域擁有所有 應用/可具有其自己的配置文件。由CLR主機創建的默認AppDomain使用programname.exe.config;如果你想提供你自己的配置文件,創建單獨的AppDomain。例如:

// get the name of the assembly 
string exeAssembly = Assembly.GetEntryAssembly().FullName; 

// setup - there you put the path to the config file 
AppDomainSetup setup = new AppDomainSetup(); 
setup.ApplicationBase = System.Environment.CurrentDirectory; 
setup.ConfigurationFile = "<path to your config file>"; 

// create the app domain 
AppDomain appDomain = AppDomain.CreateDomain("My AppDomain", null, setup); 

// create proxy used to call the startup method 
YourStartupClass proxy = (YourStartupClass)appDomain.CreateInstanceAndUnwrap(
     exeAssembly, typeof(YourStartupClass).FullName); 

// call the startup method - something like alternative main() 
proxy.StartupMethod(); 

// in the end, unload the domain 
AppDomain.Unload(appDomain); 

希望有幫助。

+0

我試過這個使用WCF的應用程序,但它不會工作(糾正我,如果我錯了)。有關如何重新定位使用WCF的應用程序的app.config的任何想法? – Contango

+0

@Gravitas:如果它仍然與你有關:我找到了一個解決方案:http://stackoverflow.com/questions/6150644/change-default-app-config-at-runtime/6151688#6151688 –

+0

有用的是瞭解programName .exe.config是app.config結束的地方。感謝您的信息。 –

1

我很抱歉,如果我誤解你的要求,但你能不能用

ConfigurationManager.OpenExeConfiguration Method (String)

基礎上的變化,是有可能,你可以使用

AppDomainSetup.ConfigurationFile Property

+2

這對我手動從配置中讀取設置的情況有所幫助,但不適用於.NET自己讀取的部分,如WCF設置和ConnectionStrings等。 – Ries

+0

AppDomainSetup.ConfigurationFile屬性看起來很有前途;我將調查... – Ries

+1

您只能在創建新應用程序域的過程中修改AppDomainSetup.ConfigurationFile。一旦您的應用程序域正在運行,您將無法修改它。 –

1

你可以使用旁觀者的方法叫OpenExeConfiguration。如果你真的想要重新定位你的配置文件,你必須創建你自己的應用程序域。在設置你的應用程序域的過程中,你有機會指定配置文件的位置。

順便說一句,.NET配置文件不適合配置,至少不是用戶可以修改的類型:它們不像INI文件或註冊表。如果您希望靈活配置您的配置,那麼最好單獨存儲它。

-1

MSDN可能會幫助...

元素 簡化了組件 組件服務。如果一個或多個 應用使用具有 駐留在 衆所周知的位置的配置文件的組件,使用該 組件可以使用 元件 的應用程序的配置 文件包括組件配置 文件,而不是直接包含 配置信息。 當組件裝配是 服務,更新所述共同 配置文件提供更新 配置信息,以使用該組件

+0

只適用於AssemblyBinding –

2

這是一個古老的問題,但我遇到了同樣的問題,並與來自幾分鐘的反射哈克解決方法上來:

static public class ConfigHack { 
    static public void OverrideAppConfig(string path) { 
     ((AppDomainSetup) 
      typeof(AppDomain) 
       .GetField("_FusionStore", BindingFlags.NonPublic | BindingFlags.Instance) 
       .GetValue(AppDomain.CurrentDomain)) 
     .ConfigurationFile = path; 
    } 

    static public void ResetConfigManager() { 
     typeof(ConfigurationManager) 
      .GetField("s_initState", BindingFlags.Static | BindingFlags.NonPublic) 
      .SetValue(null, 0); 
    } 
} 

我只用它在.NET2,但它在反射鏡中看起來與4相同。當然我不會推薦運送這個:P我只用它來快速內部的東西。

+1

如果使用.NET 4.5,則可以使用「AppDomain.CurrentDomain.SetData(」APP_CONFIG_FILE「,」配置文件的路徑「)替換此代碼(請參閱下面的答案)。我已經驗證了這一點,它完美地工作(它將一個新的app.config加載到當前的應用程序域)。 – Contango

+0

是的,APP_CONFIG_FILE適合我。仍然必須使用ResetConfigManager()hack和RefreshSection(「appSettings」)。這整個.NET配置的東西要求完全重寫! – Rbjz

32

如果仍然相關,我們使用了我的另一建議答案在這裏對堆棧溢出的另一個問題發現以下...

AppDomain.CurrentDomain.SetData ("APP_CONFIG_FILE", "path to config file") 

爲我們偉大的工作,當我們不得不從加載DLL的app.config問題只有...

+0

如果使用該技術,則不會應用某些配置部分。例如[''](https://msdn.microsoft.com/en-us/library/6bs4szyc(v = vs.110).aspx)。 –

4

這爲我工作。(從http://msdn.microsoft.com/en-us/library/system.configuration.appsettingssection.aspx拍攝)

// open config 
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

// update appconfig file path 
config.AppSettings.File = "C:\\dev\\App.config"; 

// Save the configuration file. 
config.Save(ConfigurationSaveMode.Modified); 

// Force a reload in memory of the changed section. 
ConfigurationManager.RefreshSection("appSettings"); 

然後當你調用

NameValueCollection settings = System.Configuration.ConfigurationManager.AppSettings; 

或任何操作來獲取應用程序配置,使用新的路徑。

希望這可以幫助其他有同樣問題的人!

5

我知道這是一個老問題,但對於那些誰只是想擁有自己的app.config在不同的位置,然後他們的二進制輸出生成位置,下面的作品如微軟預期它(並因此沒有必要再 - 讀取和重新寫入文件到磁盤)

  • 定義一個app.config,就像你一直這樣做。
  • 要具有實際的配置文件
  • 更改的app.config定義另一個配置文件,以便它指的是配置文件

在運行時,設置從配置文件將覆蓋設置在app.config中(如果存在)。你完成了。

實施例的app.config

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
    <appSettings file="..\Config\settings.config"> 
    <add key="port" value="1001"/> 
    </appSettings> 
</configuration> 

注意文件= 「.. \配置\的settings.config」。您完全可以自由定義您希望用戶更改設置的位置的路徑。實際配置文件

<?xml version="1.0" encoding="utf-8"?> 
<appSettings> 
    <add key="port" value="1234"/> 
</appSettings> 

在運行時的

實施例的設置port將具有值1234。

更多信息見msdn

+3

注意:這僅用於從單獨的文件加載'appSettings'部分。它不會從另一個位置加載整個app.config –

相關問題