web-dev-qa-db-ja.com

構成モードに応じて異なるアプリケーション設定

アプリケーションの現在の開発モードを条件として、.Netアプリケーションでアプリケーション(またはユーザー)レベルの設定を行う方法を知っている人はいますか? IE:デバッグ/リリース

具体的には、アプリケーション設定で保持されているWebサービスへのURL参照があります。リリースモードでは、これらの設定が指すようにします http://myWebservice.MyURL.com デバッグモードでは、これらの設定を http://myDebuggableWebService.MyURL.com)にします。

何か案は?

17

私はこれが何年も前に尋ねられたことを知っていますが、誰かが私が使用するシンプルで効果的な解決策を探している場合に備えて。

  1. プロジェクトのプロパティの[設定]タブに移動します(WebサービスのURLまたはその他の設定がここに既に表示されています)。

  2. [設定]ページにある[コードの表示]ボタンをクリックします。

  3. これをコンストラクターに入力します。

    this.SettingsLoaded += Settings_SettingsLoaded;
    
  4. コンストラクターの下に次の関数を追加します。

    void Settings_SettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e)
    {
        #if(DEBUG)
        this["YOUR_SETTING_NAME"] = VALUE_FOR_DEBUG_CONFIGURATION;
        #else
        this["YOUR_SETTING_NAME"] = VALUE_FOR_RELEASE_CONFIGURATION;
        #endif
    }
    

これで、プロジェクトを実行するたびに、現在のビルド構成に一致する行のみがコンパイルされます。

15
dotNET

これはパーティーにやや遅れていますが、私はweb.transformファイルに対してapp.configアプローチを実装する素晴らしい方法に出くわしました。 (つまり、名前空間http://schemas.Microsoft.com/XML-Document-Transformを利用します)

これは純粋なxmlアプローチであり、サードパーティのソフトウェアを必要としないため、「いい」と思います。

  • 親/デフォルトのApp.configファイルは、さまざまなビルド構成に応じて派生します。
  • これらの子孫は、必要なものだけをオーバーライドします。

私の意見では、これは、他の回答のように、全体がコピーされるx個の構成ファイルを維持する必要があるよりもはるかに洗練されて堅牢です。

ウォークスルーはここに投稿されています: http://mitasoft.wordpress.com/2011/09/28/multipleappconfig/


お母さん、見てください-私のIDEには明示的なビルド後のイベントはありません!

17
ne1410s

私の知る限り、これを行うための組み込みの方法はありません。私たちのプロジェクトでは、4つの異なる設定ファイルを維持し、ビルドのビルド前のステップでそれぞれをアクティブファイルにコピーすることでそれらを切り替えます。

copy "$(ProjectDir)properties\settings.settings.$(ConfigurationName).xml" "$(ProjectDir)properties\settings.settings"
copy "$(ProjectDir)properties\settings.designer.$(ConfigurationName).cs" "$(ProjectDir)properties\settings.Designer.cs"

これは私たちにとって数年間完璧に機能してきました。ターゲットを変更するだけで、設定ファイル全体も切り替わります。

編集:ファイルの名前は次のとおりです。 settings.settings.Debug.xmlsettings.settings.Release.xmlなど。

Scott Hanselmanは、わずかに「よりスマートな」アプローチについて説明しました。唯一の違いは、ファイルが変更されたかどうかを確認するチェックがないことです。 http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

6
hhravn

すべてを1つの構成ファイルに保持する場合は、カスタム構成セクションをapp.settingsに導入して、デバッグモードとリリースモードのプロパティを保存できます。

開発モード固有の設定を保存するオブジェクトをアプリに永続化するか、デバッグスイッチに基づいて既存のアプリ設定を上書きすることができます。

次に、コンソールアプリの簡単な例(DevModeDependencyTest)を示します。

App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="DevModeSettings">
      <section name="debug" type="DevModeDependencyTest.DevModeSetting,DevModeDependencyTest" allowLocation="true" allowDefinition="Everywhere" />
      <section name="release" type="DevModeDependencyTest.DevModeSetting,DevModeDependencyTest" allowLocation="true" allowDefinition="Everywhere" />
    </sectionGroup>
  </configSections>
  <DevModeSettings>
    <debug webServiceUrl="http://myDebuggableWebService.MyURL.com" />
    <release webServiceUrl="http://myWebservice.MyURL.com" />
  </DevModeSettings>
  <appSettings>
    <add key="webServiceUrl" value="http://myWebservice.MyURL.com" />
  </appSettings>
</configuration>

カスタム構成を保存するオブジェクト(DevModeSettings.cs):

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace DevModeDependencyTest
{
    public class DevModeSetting : ConfigurationSection
    {
        public override bool IsReadOnly()
        {
            return false;
        }

        [ConfigurationProperty("webServiceUrl", IsRequired = false)]
        public string WebServiceUrl
        {
            get
            {
                return (string)this["webServiceUrl"];
            }
            set
            {
                this["webServiceUrl"] = value;
            }
        }
    }
}

カスタム構成設定にアクセスするためのハンドラー(DevModeSettingsHandler.cs):

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace DevModeDependencyTest
{
    public class DevModeSettingsHandler
    {
        public static DevModeSetting GetDevModeSetting()
        {
            return GetDevModeSetting("debug");
        }

        public static DevModeSetting GetDevModeSetting(string devMode)
        {
            string section = "DevModeSettings/" + devMode;

            ConfigurationManager.RefreshSection(section); // This must be done to flush out previous overrides
            DevModeSetting config = (DevModeSetting)ConfigurationManager.GetSection(section);

            if (config != null)
            {
                // Perform validation etc...
            }
            else
            {
                throw new ConfigurationErrorsException("oops!");
            }

            return config;
        }
    }
}

そして最後に、コンソールアプリ(DevModeDependencyTest.cs)へのエントリポイント:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace DevModeDependencyTest
{
    class DevModeDependencyTest
    {
        static void Main(string[] args)
        {
            DevModeSetting devMode = new DevModeSetting();

            #if (DEBUG)
                devMode = DevModeSettingsHandler.GetDevModeSetting("debug");
                ConfigurationManager.AppSettings["webServiceUrl"] = devMode.WebServiceUrl;
            #endif

            Console.WriteLine(ConfigurationManager.AppSettings["webServiceUrl"]);
            Console.ReadLine();
        }
    }
}
4
jadusty

SlowCheetahは、App.configだけでなく、プロジェクト内のXMLファイルにも必要な機能を追加します http://visualstudiogallery.msdn.Microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

3
Konrad Brodzik

私は解決すべき同様の問題を抱えていて、XDT(web.config)変換エンジンを使用することになりました。これは、ここにあるne1410sからの回答ですでに提案されています: https://stackoverflow.com/a/ 27546685/410906

しかし、彼のリンクで説明されているように手動で行う代わりに、このプラグインを使用しました: https://visualstudiogallery.msdn.Microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

プラグインは構成のセットアップを支援するだけであり、ビルドする必要はありません。ソリューションは、プラグインや他のツールを必要とせずに、他のマシンまたはビルドサーバー上でビルドできます。

1
TGasdf