web-dev-qa-db-ja.com

単一のapp.configマルチプロジェクトc#

3つの異なるプロジェクトで1つのapp.configを使用します。

構成にアクセスする方法は?

ConfigurationManager.AppSettings["config1"]
44
ala

共通の構成ファイル

<?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;
18
ala

このフォルダ構造があるとしましょう:

  • 解決
    • Project1
    • Project2
    • Project3

これを行う:

  1. ソリューションレベルフォルダーにApp.configファイルを作成します。テンプレートからApp.configファイルを追加するオプションはないため、App.configという名前の新しい空のテキストファイルを作成し、通常のApp.configファイルの内容を貼り付けます。
  2. ソリューションエクスプローラーの各プロジェクト:

    1. 右クリックしてAdd> Existing Item
    2. ファイルを見つける
    3. 選択する Add as linkAddボタンの横にあるドロップダウンボックスから。

      Add as link

追加するために編集:

上記のメソッドはビルド時までファイルを共有するだけであると正しく述べています。実行時に共有ファイルを使用するには、 この質問に対する回答 を参照してください。

56
Jon Grant

VS 2008の[既存のアイテムを追加]ダイアログは次のとおりです。

Add existing item dialog

[追加]ボタンの小さなドロップダウンインジケーターをクリックし、コンテキストメニューから[リンクとして追加]を選択します。

マーク

8
marc_s

ボタンを見つけて、app.configをリンクとして開きましたが、ビルド時にプロジェクトごとに個別の構成ファイルが再度作成されるため、3つのプロジェクトを展開すると、3つの構成ファイルが作成されます。私がやりたかったのは、特定のソリューションのすべてのプロジェクトに対して単一のファイルを保持することです。それをしてもいいですか?

はい-あなたはcanできますが、shouldできますか?

.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のJon Ristaによる.NET 2.0構成の3部構成シリーズを参照してください。

強くお勧めし、よく書かれており、非常に役立ちます!

マーク

7
marc_s

設計オプションの1つは、クラスライブラリプロジェクトから直接app.configにアクセスすることを避け、余分な外部依存関係を避けることです。

むしろ、実行可能プロジェクトのみが設定ファイルについて知っており、ライブラリからオブジェクトを作成または初期化するときに、適切な設定情報をライブラリに明示的に渡すことができます。

6
Greg D

私はこれが古い質問であることを理解していますが、これを達成するはるかに簡単な方法があります。 Visual Studio 2008以降を使用している場合、「共有プロジェクト」というプロジェクトタイプがあります。

VS2015 C# Shared Project

共有プロジェクトには、別のタイプのプロジェクトに含めることができるものがほとんどあります。これは、C#だけでなく、VS2015がサポートするすべての言語用です。共有プロジェクトに何かが含まれている場合、それへの参照を追加した後、他のプロジェクトで使用できます(以下を参照)。

共有プロジェクトのクラスと共有ライブラリの主な違いは、プログラムをコンパイルすると、共有プロジェクトにあるすべてのものが個別のファイル(.dll、.exe)としてではなく、プロジェクトに直接コンパイルされることです。共有プロジェクトにあるすべてのものが他のプロジェクトに挿入されると考えてください。これを設定して使用するための小さなチュートリアルを次に示します。

Visual Studio 2015-共有プロジェクトチュートリアル:

File-> New-> Projectを選択するか、ソリューションエクスプローラーでソリューションを右クリックし、Add-> New Projectを選択して、新しい共有プロジェクトを作成します。 。ダイアログが表示されたら、「共有プロジェクト」を選択し、この例ではプロジェクトにTestSharedという名前を付けます。

Add Shared Project

新規プロジェクトが追加された後、他のプロジェクトで使用可能にするために必要なものを追加できます。この場合、app.configを追加します。共有プロジェクトを右クリックして、Add-> New Itemを選択します。 Visual C#-> Data-> XML Fileを選択して、明らかにapp.configに名前を付けます。

app.config

最後に、プロジェクトを共有する必要があるプロジェクトを右クリックして、共有プロジェクトへの参照を追加し、[追加]-> [参照]を選択します。 [参照マネージャー]ダイアログで共有プロジェクトを選択すると、左側の[共有プロジェクト]項目の下にリストされます。

Add Reference

これで、共有プロジェクトにあるすべてのものが他のプロジェクトで使用可能になり、インポートなどを使用する必要がなくなりました。それは単に機能します。このパターンは、プログラムを開発していて、いくつかの異なるGUI(Windows、iOS、Androidなど)が必要な場合に非常に便利です。たとえば、「コア」機能用に1つの共有プロジェクトを作成できますその後、プログラムでサポートするさまざまなオペレーティングシステムごとに個別のGUIプロジェクトを作成します。

これは古い質問であることを認識していますが、これはGoogleに表示されたため、他の人がこの非常に強力なVS機能について知っているのと同じことを探しているときに答えると思いました。

4
Andy Braham
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);
}
1
Kapil dev