3つの異なるプロジェクトで1つのapp.configを使用したいと思います。
構成にアクセスする方法は?
ConfigurationManager.AppSettings["config1"]
次のフォルダ構造があるとします。
これを行う:
ソリューションエクスプローラーのプロジェクトごとに:
追加するために編集:
上記の方法では、ビルド時までファイルを共有しただけであると正しく述べています。実行時に共有ファイルを使用するには、この質問への回答を参照してください。
共通の設定ファイル
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section
name="appSettings"
type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
/>
</configSections>
<appSettings>
<add key="key1" value="value1"/>
</appSettings>
</configuration>
マップされた設定ファイルにアクセスするには
ConfigurationFileMap fileMap = new ConfigurationFileMap(file); //Path to your config file
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
string value = configuration.AppSettings.Settings["key1"].Value;
VS2008の[既存のアイテムの追加]ダイアログは次のとおりです。
[追加]ボタンの小さなドロップダウンインジケーターをクリックし、コンテキストメニューから[リンクとして追加]を選択します。
マーク
ボタンを見つけて、リンクとしてapp.configを開きましたが、ビルド時にプロジェクトごとに個別の構成ファイルが再度作成されるため、3つのプロジェクトを展開すると、3つの構成ファイルが作成されます。私がやりたかったのは、特定のソリューションですべてのプロジェクトに対して単一のファイルを保持することです。それをしてもいいですか?
はい-あなたはそれを行うことができますが、あなたはそれをすべきですか?
.NETアプリの基本的な前提は、1つのアプリ=1つの構成ファイルです。箱から出して、簡単な方法で、アプリケーション間で構成ファイルを共有することはできません。
独自のカスタム構成セクションを作成する場合は、それらを外部ファイルに「アウトソーシング」して、共有することができます。「MyConfiguration」という独自のカスタム構成セクションを作成すると、app.configは次のようになります。
<configuration>
<configSections>
<section name="MyConfiguration"
type="MyConfigurationSection, MyConfigurationAssembly" />
</configSections>
<MyConfiguration>
<nestedElement>
<dateTimeValue>10/16/2006</dateTimeValue>
<integerValue>1</integerValue>
</nestedElement>
</MyConfiguration>
</configuration>
「MyConfiguration」セクションを独自のファイルに入れて、アプリの構成から参照することができます。
<configuration>
<configSections>
<section name="MyConfiguration"
type="MyConfigurationSection, MyConfigurationAssembly" />
</configSections>
<MyConfiguration configSource="MyConfiguration.config" />
</configuration>
そして、「MyConfiguration.config」には次のものが含まれます。
<MyConfiguration>
<nestedElement>
<dateTimeValue>10/16/2006</dateTimeValue>
<integerValue>1</integerValue>
</nestedElement>
</MyConfiguration>
これを行うことで、「外部化」して、少なくとも構成設定の大部分を共有できます。ただし、それらが独自のカスタム構成セクションにある場合に限ります。
.NET 2.0以上の構成の謎の詳細と優れた紹介については、CodeProjectの.NET2.0構成に関するJonRistaの3部構成のシリーズを参照してください。
強くお勧めします、よく書かれていて、非常に役に立ちます!
マーク
設計オプションの1つは、クラスライブラリプロジェクトからapp.configに直接アクセスしないようにすることです。これにより、余分な外部依存関係を回避できます。
むしろ、実行可能プロジェクトのみが構成ファイルを認識しており、ライブラリからオブジェクトを作成したり初期化したりするときに、適切な構成情報をライブラリに明示的に渡すことができます。
これは古い質問だと理解していますが、これを達成するためのはるかに簡単な方法があります。Visual Studio 2008以降を使用している場合は、「共有プロジェクト」と呼ばれるプロジェクトタイプがあります。
共有プロジェクトには、他のタイプのプロジェクトに含めることができるほとんどすべてのものを含めることができます。これは、C#だけでなく、VS2015がサポートするすべての言語にも当てはまります。共有プロジェクトに何かが含まれている場合、それへの参照を追加すると、他のプロジェクトで使用できるようになります(以下を参照)。
共有プロジェクトと共有ライブラリのクラスとの主な違いは、プログラムをコンパイルすると、共有プロジェクトにあるすべてのものが、個別のファイル(.dll、.exe)としてではなく、プロジェクトに直接コンパイルされることです。共有プロジェクトにあるすべてのものが他のプロジェクトに挿入されているように考えてください。これを設定して使用するための小さなチュートリアルを次に示します。
[ファイル]->[新規]- >[プロジェクト]を選択するか、ソリューションエクスプローラーでソリューションを右クリックし、[追加]- > [新しいプロジェクト]を選択して、新しい共有プロジェクトを作成します。ダイアログが表示されたら、[共有プロジェクト]を選択し、この例ではプロジェクトにTestSharedという名前を付けます。
新しいプロジェクトを追加した後、他のプロジェクトで利用できるようにするために必要なものをすべて追加できます。この場合、app.configを追加します。共有プロジェクトを右クリックして、[追加]- >[新しいアイテム]を選択します。Visual C#-> Data-> XML Fileを選択し、明らかにapp.configに名前を付けます。
最後に、プロジェクトを共有する必要のあるプロジェクトを右クリックして、共有プロジェクトへの参照を追加し、[追加]->[参照]を選択します。[参照マネージャー]ダイアログで共有プロジェクトを選択すると、左側の[共有プロジェクト]アイテムの下に一覧表示されます。
これで、共有プロジェクトにあるすべてのものが他のプロジェクトで使用できるようになりました。インポートなどを使用して行う必要はありません。それは単に機能します。このパターンは、プログラムを開発していて、いくつかの異なるGUI(Windows、iOS、Androidなど)が必要な場合に非常に便利です。たとえば、「コア」機能用に1つの共有プロジェクトを作成し、プログラムでサポートするさまざまなオペレーティングシステムごとに個別のGUIプロジェクトを作成することができます。
これは古い質問だと思いますが、これはGoogleに表示されたので、他の人がこの非常に強力なVS機能について知っている同じことを探しているときに答えると思いました。
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config = ConfigurationManager.OpenExeConfiguration(Path.Combine(@"D:\", "config.exe"));
foreach (string key in config.AppSettings.Settings.AllKeys)
{
string value = config.AppSettings.Settings[key].Value;
ConfigurationManager.AppSettings.Set(key, value);
}