web-dev-qa-db-ja.com

app.configファイルをカスタムパスに再配置する

App.Configファイル全体をカスタムパスに再配置することは可能ですか?

Windowsの新しいapprocahがすべてのプログラム設定をc:\ ProgramDataおよびallに保存するため、設定ファイルがexeと同じフォルダーにあるのは少し奇妙に思えます。

追加の要件は、app.configファイルの場所をプログラムで指定することです。これは、同じexeからさまざまなサービスインスタンスを生成し、各サービスのapp.configをそのサービスの設定フォルダー(c:\ ProgramData \\の下)に保存するためです。

26
Ries

各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);

お役に立てば幸いです。

16
mYsZa

それでも関連性がある場合は、Stack Overflowの別の質問に対する別の提案された回答で見つけた次のものを使用しました...

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

DLLからのみapp.configをロードするときに問題が発生したとき、私たちにとってはうまくいきました...

38
newby

これは私にとってはうまくいきました。( 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;

またはアプリの設定を取得するための操作では、新しいパスが使用されます。

これが同じ問題を抱えている他の誰かを助けるかもしれないことを願っています!

6
namford

私はこれが古い質問であることを知っていますが、ちょうどapp.configをバイナリ出力ビルドの場所とは異なる場所に置きたい場合、Microsoftが意図したとおりに動作します(したがって、ファイルをディスクに再読み取りおよび再書き込みする必要はありません)

  • いつものように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>

file = "..\Config\settings.config"に注意してください。ユーザーが設定を変更する場所へのパスを自由に定義できます。

実際の構成ファイルの例

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

実行時に、設定portの値は1234になります。

詳細は msdn を参照してください

5
bas

これは古代の質問ですが、私はこれと同じ問題に遭遇し、リフレクターで数分からハッキーな回避策を思いつきました:

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私はそれを内部の迅速なものにのみ使用します。

2
wrmsr

誤解して申し訳ございませんがご利用いただけません

ConfigurationManager.OpenExeConfigurationメソッド(文字列)

変更に基づいて、使用できる可能性はありますか

AppDomainSetup.ConfigurationFileプロパティ

1
Adriaan Stander

OpenExeConfigurationを呼び出すという傍観者のアプローチを使用できます。文字通り設定ファイルを再配置したい場合は、独自のアプリドメインを作成する必要があります。アプリドメインのセットアッププロセスでは、構成ファイルの場所を指定する機会があります。

ところで、.NET構成ファイルは、少なくともユーザーが変更できる種類ではなく、構成に適していません。INIファイルやレジストリとは異なります。設定は、個別に保存した方がいいです。

0
Tim Robinson