App.Configファイル全体をカスタムパスに再配置することは可能ですか?
Windowsの新しいapprocahがすべてのプログラム設定をc:\ ProgramDataおよびallに保存するため、設定ファイルがexeと同じフォルダーにあるのは少し奇妙に思えます。
追加の要件は、app.configファイルの場所をプログラムで指定することです。これは、同じexeからさまざまなサービスインスタンスを生成し、各サービスのapp.configをそのサービスの設定フォルダー(c:\ ProgramData \\の下)に保存するためです。
各AppDomainは、独自の構成ファイルを持つ/持つことができます。 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);
お役に立てば幸いです。
それでも関連性がある場合は、Stack Overflowの別の質問に対する別の提案された回答で見つけた次のものを使用しました...
AppDomain.CurrentDomain.SetData ("APP_CONFIG_FILE", "path to config file")
DLLからのみapp.configをロードするときに問題が発生したとき、私たちにとってはうまくいきました...
これは私にとってはうまくいきました。( 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;
またはアプリの設定を取得するための操作では、新しいパスが使用されます。
これが同じ問題を抱えている他の誰かを助けるかもしれないことを願っています!
私はこれが古い質問であることを知っていますが、ちょうどapp.configをバイナリ出力ビルドの場所とは異なる場所に置きたい場合、Microsoftが意図したとおりに動作します(したがって、ファイルをディスクに再読み取りおよび再書き込みする必要はありません)
実行時に、構成ファイルの設定が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>
file = "..\Config\settings.config"に注意してください。ユーザーが設定を変更する場所へのパスを自由に定義できます。
実際の構成ファイルの例
<?xml version="1.0" encoding="utf-8"?>
<appSettings>
<add key="port" value="1234"/>
</appSettings>
実行時に、設定port
の値は1234になります。
詳細は msdn を参照してください
これは古代の質問ですが、私はこれと同じ問題に遭遇し、リフレクターで数分からハッキーな回避策を思いつきました:
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私はそれを内部の迅速なものにのみ使用します。
OpenExeConfiguration
を呼び出すという傍観者のアプローチを使用できます。文字通り設定ファイルを再配置したい場合は、独自のアプリドメインを作成する必要があります。アプリドメインのセットアッププロセスでは、構成ファイルの場所を指定する機会があります。
ところで、.NET構成ファイルは、少なくともユーザーが変更できる種類ではなく、構成に適していません。INIファイルやレジストリとは異なります。設定は、個別に保存した方がいいです。