動的プロパティの概要 (Visual Studio)

注意

動的プロパティのためのユーザー インターフェイスは、Visual Studio 2005 から削除されました。 ただし、動的プロパティは現在でもサポートされています。 Visual Studio の旧バージョンからプロジェクトをインポートすると、動的プロパティの設定はコードに保存されて、実行時に機能します。 ただし、アプリケーション設定を指定するには、代わりにプロジェクト デザイナーを使用することをお勧めします。 詳細については、「[設定] ページ (プロジェクト デザイナー)」および「アプリケーションの設定の管理」を参照してください。

動的プロパティを使用すると、アプリケーションのプロパティ値の一部または全部を、アプリケーションのコンパイル済みコードではなく外部の設定ファイルに格納するようにアプリケーションを設定できます。 管理者に対して、後で変更が必要になったプロパティ値を更新する手段を提供することにより、配置後のアプリケーションを維持するための総コストを低減できます。 たとえば、開発中はテスト データベースを使用してアプリケーションを構築し、アプリケーションを配置する段階で、実際に使用するデータベースに切り替える場合を考えます。 プロパティ値をアプリケーション内に格納した場合は、配置する前にすべてのデータベース設定を手動で変更してから、ソース コードを再コンパイルする必要があります。 これらの値を外部に格納した場合は、外部ファイルを一度変更するだけで、アプリケーションが次に実行されるときに新しい値を読み取ります。

セキュリティに関するメモセキュリティに関するメモ

構成ファイルに格納されたプロパティ値は、セキュリティで保護されていません。 パスワードやクレジット カード情報などの重要情報は、動的プロパティとして格納しないでください。

動的プロパティは、.exe ファイルにコンパイルされるすべてのアプリケーションで使用できます。 DLL をコンパイルするプロジェクトでは動的プロパティを直接使用できませんが、DLL のプロパティは、その .dll を参照する .exe によって動的に設定できます。 このようなアプリケーションのコンポーネント、フォーム、コントロールのプロパティはいずれも動的に処理できますが、他よりもさらに動的プロパティに適しているプロパティがあります。 データベース、イベント ログ、パフォーマンス カウンターなどの、変更の可能性がある外部リソースに接続するプロパティを格納し、取得する場合です。 これらのプロパティの多くは、既定の候補として動的プロパティが指定されています。

注意

このトピックで示すプログラム例は、SqlConnection オブジェクトと構成ファイルが存在することを前提としています。オブジェクトと構成ファイルが存在しない場合は、コンパイル エラーになります。

動的プロパティと構成ファイル

プロパティを "設定可能" に設定するとその値は設定ファイルに書き込まれ、プロパティ値を外部リソースから取得するように指示するコードがクラスに挿入されます。 設定ファイルは、アプリケーションの種類によって異なります。Web ベースのアプリケーションは Web.config ファイルを使用し、Windows ベースのアプリケーションは拡張子が .config である同様のファイルを使用します。 アプリケーション内のすべてのフォームとコンポーネントが 1 つの設定ファイルを使用します。 1 つのアプリケーション内で別の設定ファイルに切り替えたり、複数のファイルを使用したりすることはできません。

設定ファイル内では、プロパティは XML を使用して永続化されます。 たとえば、データ接続用の ConnectionString プロパティを設定ファイルに格納するように設定したとします。 コード エディターでは、値が外部に格納されていることが次のコードによって示されます。

Me.SqlConnection1.ConnectionString =
  System.Configuration.ConfigurationManager.
  AppSettings.Get("SqlConnection1.ConnectionString")
        this.sqlConnection1.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString");
セキュリティに関するメモセキュリティに関するメモ

セキュリティ保護されたデータ接続の作成の詳細については、「接続情報の保護 (ADO.NET)」を参照してください。

設定ファイルでは、フォームのコードに示されているキーを使用して、このプロパティの値が XML によって格納されます。

<configuration>

<appSettings>

<add key="sqlConnection1.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />

</appSettings>

</configuration>

設定ファイル内の各値に対して、値の格納と取得に使用されるキーが割り当てられます。 キーの最初の部分は、この値を含んでいるコンポーネントを示します。 たとえば、次の 2 つのキーは、1 つのアプリケーション内の 2 つの異なるデータ接続に対する ConnectionString プロパティを示しています。

<configuration>

<appSettings>

<add key="sqlConnection1.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />

<add key="sqlConnection2.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />

</appSettings>

</configuration>

設定ファイルの内容を直接変更することで、アプリケーションのプロパティ値を動的に変更できます。 アプリケーションが次に起動されたときに、値が更新されます。

ある意味では、設定ファイルはリソース ファイルに似ています。両方とも、コンパイルされたアプリケーションの外部に値を格納するために使用され、両方とも XML を使用して情報を格納します。 しかし、リソース ファイルは設定ファイルとはまったく異なる目的に使用されます。 リソース ファイルは文字列やその他のローカライズ可能なリソースを翻訳の目的で格納するために使用されますが、設定ファイルは (動的プロパティに関しては) プロパティ値を更新するために使用されます。 リソース ファイル内の値は翻訳することを意図していますが、通常は変更されません。しかし、設定ファイル内の動的値は必要に応じて変更できます。 また、プロジェクトには複数のリソース ファイルを関連付けることができますが、アプリケーションに対しては 1 つの設定ファイルしか使用できません。 リソース ファイルの詳細については、「ローカリゼーション用リソースの階層編成」を参照してください。

同じキーに対する複数のプロパティの設定

設定ファイル内では、複数のプロパティで同じキーと値のペアを参照できます。 たとえば、クラスに 3 つのコンポーネントがあり、そのすべてが同じデータベースにアクセスする場合は、それぞれのコンポーネントに対する ConnectionString プロパティを同じキーと値のペアに格納できます。 これは、データベースが変更された場合に、設定内の 1 つの値を更新することによって 3 つのコンポーネントすべてに対して変更を適用できることを意味します。 そのためには、次のように、それぞれのプロパティを同じキーに設定します。

Me.SqlConnection1.ConnectionString =
  System.Configuration.ConfigurationManager.
  AppSettings.Get("SqlConnection1.ConnectionString")

Me.SqlConnection2.ConnectionString =
  System.Configuration.ConfigurationManager.
  AppSettings.Get("SqlConnection1.ConnectionString")

Me.SqlConnection3.ConnectionString =
  System.Configuration.ConfigurationManager.
  AppSettings.Get("SqlConnection1.ConnectionString")
        this.sqlConnection1.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString");

        this.sqlConnection2.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString"); 

        this.sqlConnection3.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString"); 

使用するコンポーネントが異なっても、すべてが sqlConnection1.ConnectionString に対するキーを参照します。

複数のプロパティに対して同じキーを選択した場合、設定ファイルには 1 つのエントリしか作成されません。 格納される初期値は、そのキーが割り当てられた最初のプロパティに対する値です。

データ型と動的プロパティ

XML は、すべての情報を文字列として格納します。 格納するプロパティ値が文字列でない場合は、プロパティ値のデータ型を示す追加情報がコード エディターに表示されます。 たとえば、Timer コンポーネントの Interval プロパティと Enabled プロパティの値を動的に格納するとします。 設定ファイルには、このプロパティが次のように格納されます。

<appSettings>

<add key=timer1.Interval" value="100" />

<add key=timer1.Enabled" value="True" />

</appSettings>

コード エディターにこのコードが表示された場合には、取得した値をなんらかの 倍精度浮動小数点数型 (Double) (Visual Basic) に変更する必要があります。

Me.Timer1.Enabled = (New System.Configuration.
AppSettingsReader()).GetValue("timer1.Enabled", GetType(Boolean))

Me.Timer1.Interval = (New System.Configuration.
AppSettingsReader()).GetValue("Timer1.Interval", GetType(Double))
        this.timer1.Enabled = (bool)(new System.Configuration.
          AppSettingsReader().GetValue("timer1.Enabled", typeof(bool)));

        this.timer1.Interval = (System.Double)(new System.Configuration.
          AppSettingsReader().GetValue("timer1.Interval", typeof(System.Double)));

注意

タイマーは 2 種類あります。1 つは Windows フォーム用、もう 1 つはサーバー ベースのアプリケーション用で、これらはプログラミング モデルがわずかに異なります。 この例では、サーバー ベースのタイマーを使用しています。

動的プロパティのパフォーマンスとセキュリティに関する注意事項

動的プロパティを使用するときには、次の 2 つの点に注意する必要があります。 1 つ目は、動的プロパティの格納と取得によって、アプリケーションのパフォーマンスに何らかの影響が出るという点です。 コンパイル済みアプリケーション内からプロパティ値を取得する方が、設定ファイルからプロパティ値を取得するよりも少しだけ高速です。 アプリケーションが設定ファイルの値に初めてアクセスするときには、アプリケーションのファイル読み取りにより、パフォーマンスに多少の影響が出ます。 ただし、この影響はごく小さなもので、ほとんど目立ちません。 それ以降、同じプロパティや他のプロパティを取得するときには、パフォーマンスへの影響はずっと小さくなり、ハッシュ テーブルから値を読み取るときと同じ程度になります。

2 つ目は、ユーザー ID やパスワードなどのプロパティ値を外部ファイルに格納する場合は、そのファイルおよびファイル内に含まれる値へのアクセスを制限する必要があるという点です。 そのための 1 つの方法は、Windows のアクセス制御リスト (ACL: Access Control List) を使用してファイルを保護することです。 アクセス制御リストは、特定のファイルおよびディレクトリに対して各ユーザーが実行できる操作を指定します。 また、Web ベースのアプリケーションを使用している場合は、Windows、IIS (Internet Information Services)、および SQL Server によって提供される統合セキュリティ オプションを利用できます。 このモデルでは、ローカル ネットワークに対するユーザーの認証情報がデータベース リソースへのアクセス時にも使用され、接続文字列に明示的なユーザー名やパスワードは使用されません。

セキュリティの詳細については、Windows のドキュメントまたは以下のページを参照してください。

参照

その他の技術情報

動的プロパティによるアプリケーションの設定