質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

7177閲覧

app.configのカスタムセクションへの、プログラムからの書き込み

zip

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/06/02 08:01

C#でアプリケーションを開発しています。

app.configに、下記のようにカスタムセクションCommonを追加しています。
(質問用に簡易化しただけで、実際には複数のカスタムセクションがあります)

xml

1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <section name="Common" type="System.Configuration.NameValueFileSectionHandler" restartOnExternalChanges="false"/> 5 </configSections> 6 7 <Common> 8 <add key="key1" value="value1" /> 9 <add key="key2" value="value2" /> 10 <add key="key3" value="value3" /> 11 </Common> 12 </configuration>

この定義ファイルから値を取得する際には、下記のようなコードで実現できました。

C#

1 var cs = (NameValueCollection) ConfigurationManager.GetSection("Common"); 2 string value = cs["key1"];

しかし、逆にコード上から定義ファイルにデータを保存する方法が分かりません。
単に定義ファイルへ書き込むだけならこのようなページが見つかったんですが、
この方法はカスタムセクションには対応していないようです。

app.configのカスタムセクションに、コード上から値を設定する方法があれば教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/06/02 08:58

直接、質問には関係ないのですが、App.configは多くの場合でアプリ固有の設定をしておくもので、読み取りのみが主な使い方になるかと思います。(もちろん、書いていけない訳ではないですが) そのアプリのインストーラーが"C:\Program Files"配下にアプリの実行ファイルと共にApp.configを保存してしまうケースでは、書き込みが行えないかもしれません。
dodox86

2021/06/02 09:03

「デバッグ環境ではApp.configに設定を書けて、保存できていた。"C:\Program Files"下にインストールするようなインストーラー込み、製品版を作ったら動かなくなって大騒ぎ!」と言うケースがありがちなので、コメントしたものです。
退会済みユーザー

退会済みユーザー

2021/06/02 09:06

settings.settings を使わないのには何か理由があるのですか? 単に知らなかったということなら、それを使いましょう。
zip

2021/06/03 02:06

セクションAのkey1,key2,key3… セクションBのkey1,key2,key3… のように複数のセクションを用意してそれぞれに対して同名のキーを設定するような使い方がしたいのですが、settings.settingsでそれは可能ですか?
退会済みユーザー

退会済みユーザー

2021/06/03 02:41

使い方次第だと思います。例えば、StringCollection を使って、 key1:aaa key2:bbb key3:ccc のようにするとか。
zip

2021/06/03 04:27

userisgodさん ありがとうございます。 実現したいこととはかなり近いです。 ただ作成するクラス内に各セクションが保持するkeyと同じだけのプロパティを作る必要があるとなると、今後app.configにkey,valueを増やすたびにクラスの編集も必要となるので、顧客の要件には合わなそうです。
zip

2021/06/03 04:28

dodox86さん ありがとうございます。リリースの際には留意するようにいたします。
guest

回答1

0

ベストアンサー

質問に対するコメント、

settings.settings を使わないのには何か理由があるのですか?

・・・に返事がないので使わない理由があるのかどうか不明ですが、プログラムから情報を settings.settings に書き込んで、それを再利用する方法を書いた記事を紹介しておきます。

Settings を使った WPF でのアプリケーション設定の保存 (ウィンドウの表示位置、サイズの保存)
http://yohshiy.blog.fc2.com/blog-entry-253.html

Visual Studio でアプリケーション開発の際、自動的に App.config というファイルが生成され、それに接続文字列などの情報が保存でき、アプリを実行するときに使われる構成ファイルは App.config とは別に生成され、別の場所に保存されるので注意してください。詳しくは以下の記事を見てください。

構成ファイルの保存場所
http://surferonwww.info/BlogEngine/post/2019/09/01/where-are-configuration-files.aspx

【追記】

下のコメント欄の 2021/06/03 15:48 の私のコメントで「上のコメントのレスは回答欄に追記します」と書いて件です。

settings.settingsを編集するとapp.configが生成されるとあるんですが、これはどこに生成されてるんでしょうか…

そのあたりは先に紹介した記事「構成ファイルの保存場所」に書いたはずですが・・・

App.config は最初からプロジェクトに含まれているはずです。そこで例えば以下のように settings.settings を編集すると、

イメージ説明

その結果は以下のように App.config に反映されます。

イメージ説明

アプリをビルドする際、生成される .exe ファイルと同じ場所に、App.config の内容をそのままコピーして <アプリケーション名>.exe.config という名前のファイルが作られます。実際にアプリが使うのはそれです。

settings.settings でスコープがユーザーになっている項目はプログラムで書き換えることができます。(ただし、スコープがアプリケーションとなっている項目はそのプロパティが読み取り専用なのでダメです。Settings.Designer.cs を見てください)

例えば以下のように書き換えて保存すると、

var secA = Properties.Settings.Default.SectionA; secA.RemoveAt(1); secA.Add("key2:new data"); Properties.Settings.Default.Save();

その結果は C:\Users<ユーザー名>\AppData\Local<アプリケーション名> フォルダ下に user.config という名前で保存されます。

イメージ説明

このとき、「名前」部分を文字列で指定することは可能でしょうか?

それはできないと思います。「名前」部分は Settings.Designer.cs に定義されているプロパティなので、それを何とかする手段を質問者さんが見つけることができれば話は違うかもしれませんが・・・

上に書いたように、中身を書き換えることはできるので、それで対応する他なさそうです。

ご自分でいろいろやってみればすぐわかると思いますのでやってみてください。

投稿2021/06/03 00:08

編集2021/06/03 07:21
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zip

2021/06/03 05:35 編集

ありがとうございます。 定義ファイルのフォーマットはやや変わりますが、やりたいことがおおよそ実現できるであろうということは分かりました。 本題と少しズレてしまうのですが追加で2つ質問したいことがあります。 1つ目 settings.settingsを編集するとapp.configが生成されるとあるんですが、これはどこに生成されてるんでしょうか… 2つ目 私が当初やりたかったことをsettings.settingsにおいて対応させると、 カスタムセクション名が「名前」であり key,valueの組み合わせをStringCollectionの「値」に格納する感じになると思います。 そして最終的にソースから呼び出す際には「Properties.Settings.Default.名前」として呼び出すことになります。 このとき、「名前」部分を文字列で指定することは可能でしょうか? それができないと、今後セクションを追加することがあったときに毎回C#のソース側に修正が必要になるなと感じています。
退会済みユーザー

退会済みユーザー

2021/06/03 06:48

上のコメントのレスは回答欄に追記します。
zip

2021/06/03 07:32

>>App.config は最初からプロジェクトに含まれているはずです。 うーん。含まれていないんですよね。もしかして最初に選ぶソリューションの種類によって違ったりするんでしょうか >>それはできないと思います。「名前」部分は Settings.Designer.cs に定義されているプロパティなので、それを何とかする手段を質問者さんが見つけることができれば話は違うかもしれませんが・・・ こちらに関しては承知しました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/06/03 07:53 編集

> もしかして最初に選ぶソリューションの種類によって違ったりするんでしょうか ASP.NET でない .NET Framework のアプリなら最初から存在するはずですが? (ASP.NET は web.config ですが) Visual Studio でプロジェクト生成後プログラマが全くさわってない&使ってない場合でも以下の内容のファイルが自動生成されているはずなのですが・・・ <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /> </startup> </configuration> VSCode とかですと分かりませんが。
TN8001

2021/06/03 08:30

>>このとき、「名前」部分を文字列で指定することは可能でしょうか? >それはできないと思います。 インデクサがあるので↓という書き方は可能です(objectになってしまいますが) Properties.Settings.Default["名前"] [SettingsBase.Item[String] プロパティ (System.Configuration) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.configuration.settingsbase.item#System_Configuration_SettingsBase_Item_System_String_ SettingsPropertyで名前も型も取れますので、約束の範囲内であれば増えていっても対応できるとは思います。 [SettingsBase.Properties プロパティ (System.Configuration) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.configuration.settingsbase.properties#System_Configuration_SettingsBase_Properties [SettingsProperty クラス (System.Configuration) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.configuration.settingsproperty
zip

2021/06/03 08:47

回答ありがとうございました。 定義ファイルの設定一つにもいろいろな方法があり勉強になりました。 回答だけでなく質問にコメントいただいた方々の内容も含め、お客さんとどういう定義方法が望ましいか話し合ってみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問