次の方法で共有


アプリケーション設定のアーキテクチャ

このトピックでは、アプリケーション設定アーキテクチャのしくみについて説明し、グループ化された設定や設定キーなどのアーキテクチャの高度な機能について説明します。

アプリケーション設定アーキテクチャでは、アプリケーションまたはユーザー スコープを使用して厳密に型指定された設定を定義し、アプリケーション セッション間で設定を保持できます。 このアーキテクチャでは、設定をローカル ファイル システムに保存してローカル ファイル システムから読み込むための既定の永続化エンジンが提供されます。 このアーキテクチャでは、カスタム永続化エンジンを提供するためのインターフェイスも定義されています。

カスタム コンポーネントがアプリケーションでホストされるときに独自の設定を保持できるようにするインターフェイスが用意されています。 設定キーを使用すると、コンポーネントの複数のインスタンスの設定を個別に保持できます。

設定の定義

アプリケーション設定アーキテクチャは、ASP.NET と Windows フォームの両方で使用され、両方の環境で共有される多くの基本クラスが含まれています。 最も重要なのは、コレクションを介して設定にアクセスできる SettingsBaseであり、設定を読み込んで保存するための低レベルのメソッドを提供します。 各環境は、その環境に追加の設定機能を提供するために、 SettingsBase から派生した独自のクラスを実装します。 Windows フォーム ベースのアプリケーションでは、すべてのアプリケーション設定を ApplicationSettingsBase クラスから派生したクラスで定義する必要があります。これによって、基本クラスに次の機能が追加されます。

  • 高レベルの読み込みと保存操作

  • ユーザー範囲設定のサポート

  • ユーザーの設定を定義済みの既定値に戻す

  • 以前のアプリケーション バージョンからの設定のアップグレード

  • 設定を変更する前または保存する前に検証する

この設定は、 System.Configuration 名前空間内で定義されている多数の属性を使用して記述できます。これらは、「 アプリケーション設定の属性」で説明されています。 設定を定義するときは、 ApplicationScopedSettingAttribute または UserScopedSettingAttributeを使用して適用する必要があります。この設定は、設定がアプリケーション全体に適用されるか、現在のユーザーにのみ適用されるかを示します。

次のコード例では、1 つの設定 ( BackgroundColor) を持つカスタム設定クラスを定義します。

using System;
using System.Configuration;
using System.Drawing;

public class MyUserSettings : ApplicationSettingsBase
{
    [UserScopedSetting()]
    [DefaultSettingValue("white")]
    public Color BackgroundColor
    {
        get
        {
            return ((Color)this["BackgroundColor"]);
        }
        set
        {
            this["BackgroundColor"] = (Color)value;
        }
    }
}
Imports System.Configuration

Public Class MyUserSettings
    Inherits ApplicationSettingsBase
    <UserScopedSetting()> _
    <DefaultSettingValue("white")> _
    Public Property BackgroundColor() As Color
        Get
            BackgroundColor = Me("BackgroundColor")
        End Get

        Set(ByVal value As Color)
            Me("BackgroundColor") = value
        End Set
    End Property
End Class

設定の永続化

ApplicationSettingsBase クラス自体が設定を保持または読み込むことはありません。このジョブは、SettingsProviderから派生したクラスである設定プロバイダーに適用されます。 ApplicationSettingsBaseの派生クラスがSettingsProviderAttributeを介して設定プロバイダーを指定しない場合は、既定のプロバイダーLocalFileSettingsProviderが使用されます。

.NET Framework で最初にリリースされた構成システムでは、ローカル コンピューターの machine.config ファイルまたはアプリケーションと共に展開する app.exe.config ファイル内で静的アプリケーション構成データを提供できます。 LocalFileSettingsProvider クラスは、次の方法でこのネイティブ サポートを拡張します。

  • アプリケーション スコープの設定は、machine.config ファイルまたは app.exe.config ファイルのいずれかに格納できます。 Machine.config は常に読み取り専用ですが、 app.exe.configはセキュリティ上の考慮事項によって、ほとんどのアプリケーションで読み取り専用に制限されます。

  • ユーザー スコープの設定は、 app.exe.config ファイルに格納できます。その場合、それらは静的な既定値として扱われます。

  • 既定以外のユーザー スコープ設定は、新しいファイル (user.config) に格納されます。 DefaultSettingValueAttributeを使用して、ユーザー スコープの設定の既定値を指定できます。 ユーザー スコープの設定は、多くの場合、アプリケーションの実行中に変更されるため、 user.config は常に読み取り/書き込みになります。 詳細については、「 ユーザー スコープ設定の格納場所」を参照してください。

3 つの構成ファイルはすべて、設定を XML 形式で格納します。 アプリケーション スコープ設定の最上位レベルの XML 要素は <appSettings>され、 <userSettings> はユーザー スコープの設定に使用されます。 アプリケーション スコープの設定とユーザー スコープ設定の既定値の両方を含む app.exe.config ファイルは次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </sectionGroup>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <WindowsApplication1.Properties.Settings>
            <setting name="Cursor" serializeAs="String">
                <value>Default</value>
            </setting>
            <setting name="DoubleBuffering" serializeAs="String">
                <value>False</value>
            </setting>
        </WindowsApplication1.Properties.Settings>
    </applicationSettings>
    <userSettings>
        <WindowsApplication1.Properties.Settings>
            <setting name="FormTitle" serializeAs="String">
                <value>Form1</value>
            </setting>
            <setting name="FormSize" serializeAs="String">
                <value>595, 536</value>
            </setting>
        </WindowsApplication1.Properties.Settings>
    </userSettings>
</configuration>

構成ファイルのアプリケーション設定セクション内の要素の定義については、「 アプリケーション設定スキーマ」を参照してください。

設定のバインド

アプリケーション設定では、Windows フォーム のデータ バインディング アーキテクチャを使用して、設定オブジェクトとコンポーネントの間で設定の更新の双方向通信を提供します。 Visual Studio を使用してアプリケーション設定を作成し、コンポーネントのプロパティに割り当てると、これらのバインドが自動的に生成されます。

アプリケーション設定は、 IBindableComponent インターフェイスをサポートするコンポーネントにのみバインドできます。 また、コンポーネントは、特定のバインドされたプロパティの変更イベントを実装するか、 INotifyPropertyChanged インターフェイスを介してプロパティが変更されたことをアプリケーション設定に通知する必要があります。 コンポーネントが IBindableComponent を実装せず、Visual Studio を介してバインドする場合、バインドされたプロパティは最初に設定されますが、更新されません。 コンポーネントが IBindableComponent を実装しているが、プロパティ変更通知をサポートしていない場合、プロパティが変更されても、バインディングは設定ファイルで更新されません。

ToolStripItemなどの一部の Windows フォーム コンポーネントでは、設定バインドがサポートされていません。

設定のシリアル化

LocalFileSettingsProvider設定をディスクに保存する必要がある場合は、次の操作を実行します。

  1. リフレクションを使用して、 ApplicationSettingsBase 派生クラスで定義されているすべてのプロパティを調べ、 ApplicationScopedSettingAttribute または UserScopedSettingAttributeで適用されているプロパティを見つけます。

  2. プロパティをディスクにシリアル化します。 最初に、型の関連付けられているConvertToStringConvertFromStringまたはTypeConverterを呼び出そうとします。 これが成功しない場合は、代わりに XML シリアル化が使用されます。

  3. 設定の属性に基づいて、どの設定がどのファイルに含まれるかを決定します。

独自の設定クラスを実装する場合は、 SettingsSerializeAsAttribute を使用して、 SettingsSerializeAs 列挙型を使用してバイナリシリアル化またはカスタム シリアル化の設定をマークできます。 コードで独自の設定クラスを作成する方法の詳細については、「 方法: アプリケーション設定を作成する」を参照してください。

設定ファイルの場所

app.exe.configファイルとユーザー.config ファイルの場所は、アプリケーションのインストール方法によって異なります。 ローカル コンピューターにコピーされた Windows フォーム ベースのアプリケーションの場合、 app.exe.configはアプリケーションのメイン実行可能ファイルのベース ディレクトリと同じディレクトリに配置され、 ユーザー.config は Application.LocalUserAppDataPath プロパティで指定された場所に存在します。 ClickOnce を使用してインストールされたアプリケーションの場合、これらの両方のファイルは、%InstallRoot%\Documents and Settings\username\Local Settings の下の ClickOnce データ ディレクトリに配置されます。

ユーザーがローミング プロファイルを有効にしている場合、これらのファイルの保存場所は少し異なります。これにより、ユーザーはドメイン内の他のコンピューターを使用しているときに、異なる Windows とアプリケーションの設定を定義できます。 その場合、ClickOnce アプリケーションと ClickOnce 以外のアプリケーションの両方に、 app.exe.configファイルと ユーザー.config ファイルが %InstallRoot%\Documents and Settings\username\Application Data に格納されます。

新しい配置テクノロジでのアプリケーション設定機能の動作の詳細については、「 ClickOnce とアプリケーションの設定」を参照してください。 ClickOnce データ ディレクトリの詳細については、「 ClickOnce アプリケーションでのローカル およびリモート データへのアクセス」を参照してください。

アプリケーションの設定とセキュリティ

アプリケーション設定は、インターネットまたはイントラネット経由でホストされる Windows フォーム アプリケーションの既定の制限された環境である部分信頼で動作するように設計されています。 既定の設定プロバイダーでアプリケーション設定を使用するために、部分信頼以外の特別なアクセス許可は必要ありません。

ClickOnce アプリケーションでアプリケーション設定を使用すると、 user.config ファイルは ClickOnce データ ディレクトリに格納されます。 アプリケーションの user.config ファイルのサイズは、ClickOnce によって設定されたデータ ディレクトリ クォータを超えることはできません。 詳細については、「 ClickOnce とアプリケーションの設定」を参照してください。

カスタム設定プロバイダー

アプリケーション設定アーキテクチャでは、 ApplicationSettingsBaseから派生したアプリケーション設定ラッパー クラスと、 SettingsProviderから派生した関連する設定プロバイダー間に疎結合があります。 この関連付けは、ラッパー クラスまたはその個々のプロパティに適用される SettingsProviderAttribute によってのみ定義されます。 設定プロバイダーが明示的に指定されていない場合は、既定のプロバイダー LocalFileSettingsProviderが使用されます。 その結果、このアーキテクチャでは、カスタム設定プロバイダーの作成と使用がサポートされます。

たとえば、すべての設定データを Microsoft SQL Server データベースに格納するプロバイダーである SqlSettingsProvider を開発して使用するとします。 SettingsProvider派生クラスは、Initialize型のパラメーターとして、System.Collections.Specialized.NameValueCollection メソッドでこの情報を受け取ります。 次に、 GetPropertyValues メソッドを実装してデータ ストアから設定を取得し、 SetPropertyValues して保存します。 プロバイダーは、SettingsPropertyCollectionに指定されたGetPropertyValuesを使用して、プロパティの名前、型、スコープ、およびそのプロパティに対して定義されているその他の設定属性を決定できます。

プロバイダーは、実装が明確でない可能性がある 1 つのプロパティと 1 つのメソッドを実装する必要があります。 ApplicationName プロパティは、SettingsProviderの抽象プロパティです。次を返すようにプログラムする必要があります。

public override string ApplicationName
{
    get
    {
        return (System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }
    set
    {
        // Do nothing.
    }
}
Public Overrides Property ApplicationName() As String
    Get
        ApplicationName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
    End Get
    Set(ByVal value As String)
        ' Do nothing.
    End Set
End Property

派生クラスでは、引数を受け取らず、値を返さないInitializeメソッドを実装しなければなりません。 このメソッドは、 SettingsProviderによって定義されていません。

最後に、プロバイダーに IApplicationSettingsProvider を実装して、設定の更新、設定の既定値への戻し、アプリケーション バージョン間での設定のアップグレードのサポートを提供します。

プロバイダーを実装してコンパイルしたら、既定ではなくこのプロバイダーを使用するように設定クラスに指示する必要があります。 これを行うには、 SettingsProviderAttributeを使用します。 設定クラス全体に適用される場合、プロバイダーはクラスが定義する各設定に使用されます。個々の設定に適用される場合、アプリケーション設定アーキテクチャではそれらの設定にのみそのプロバイダーが使用され、残りの設定には LocalFileSettingsProvider が使用されます。 次のコード例は、カスタム プロバイダーを使用するように設定クラスに指示する方法を示しています。

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

namespace ApplicationSettingsArchitectureCS
{
    [SettingsProvider("SqlSettingsProvider")]
    class CustomSettings : ApplicationSettingsBase
    {
        // Implementation goes here.
    }
}
Imports System.Configuration

<SettingsProvider("SqlSettingsProvider")> _
Public Class CustomSettings
    Inherits ApplicationSettingsBase

    ' Implementation goes here.
End Class

プロバイダーは複数のスレッドから同時に呼び出される場合がありますが、常に同じストレージの場所に書き込まれます。そのため、アプリケーション設定アーキテクチャでは、プロバイダー クラスのインスタンスが 1 つだけインスタンス化されます。

重要

プロバイダーがスレッド セーフであり、一度に 1 つのスレッドのみが構成ファイルに書き込まれるようにする必要があります。

プロバイダーは、 System.Configuration 名前空間で定義されているすべての設定属性をサポートする必要はありませんが、少なくとも ApplicationScopedSettingAttributeUserScopedSettingAttributeをサポートする必要があり、 DefaultSettingValueAttributeもサポートする必要があります。 サポートされていない属性の場合、プロバイダーは通知なしで機能を停止する必要があります。例外を発生させるべきではありません。 ただし、同じ設定に ApplicationScopedSettingAttributeUserScopedSettingAttribute を適用するなど、設定クラスで無効な属性の組み合わせを使用する場合、プロバイダーは例外をスローして操作を中止する必要があります。

こちらも参照ください