6

applicationSettings に関する記事やフォーラムの投稿をほぼ 1 週間読んでいます。

ほとんどすべてのスレッドで、デプロイ時にクラス ライブラリに構成ファイルを含めることはできず、設計時に構成されたそれらの applicationSettings を、ホスト/ dll を消費します。

必ずしもそうではありません。

アセンブリでハードコードされた DefaultValueAttribute を使用して指定された既定値を "上書き" する方法をユーザーに提供する場合を除き、これらのクラス ライブラリ設定をマージすることはできますが、マージする必要はありません。

したがって、非常に単純で実用的な例です。VB.NET を使ってみよう 1. ClassLibrary というクラス ライブラリ プロジェクトを作成しました。2. すべてのファイルを表示して、MyProject を展開し、Settings.settings をダブルクリックします。3. 値が「Hello!」であるアプリケーション スコープのメッセージという設定を追加します。4. Class1.vb にプロパティを作成します (自動的に追加されたクラス)

Public Class Class1

    Public Shared ReadOnly Property Message As String
        Get
            Return My.Settings.Message
        End Get
    End Property

End Class
  1. VB WinForms プロジェクトを作成し、それを WinForm と呼びます。
  2. ClassLibrary プロジェクトへの参照を追加します。
  3. 作成済みの Form1 にボタンを追加し、それをダブルクリックします。8 Button1_Click ハンドラにいくつかのコードを追加します。このように見えるはずです。

    パブリック クラス Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        MessageBox.Show(ClassLibrary.Class1.Message)
    End Sub
    

    クラス終了

  4. WinFormを「スタートアッププロジェクトとして設定」する

これで、IDE ではすべてが美しく機能します。ソリューションを実行すると、予想される Hello! が表示されます。ボタンを押すと。ライブラリの app.config の設定を変更して、「さようなら!」と言うと、ソリューションを再度実行すると、「さようなら!」というメッセージが表示されます。

ただし、WinForm プロジェクトを右クリックして [エクスプローラーで開く] をクリックし、Debug フォルダーに移動します。WinForm.exe.config ファイルはまだありません。早速作成してみましょう。VS に戻り、WinForm プロジェクトが選択されている間に [すべてのファイルを表示] をクリックします。MyProject を展開し、Settings.settings を開き、設定を作成して (何でも構いません)、保存します。これで、App.config が作成されました。このソリューションをビルドすると、Debug フォルダーに WinForm.exe.config が含まれます。

クラス ライブラリ構成からメッセージ設定をマージする方法を教えてください

<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="ClassLibrary.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>

    <applicationSettings>
        <ClassLibrary.My.MySettings>
            <setting name="Message" serializeAs="String">
                <value>Hello!</value>
            </setting>
        </ClassLibrary.My.MySettings>
    </applicationSettings>
</configuration>

WinFormの構成に

<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WinForm.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
    </startup>
    <applicationSettings>
        <WinForm.My.MySettings>
            <!--<setting name="A" serializeAs="String">
                <value>A</value>
            </setting>-->
        </WinForm.My.MySettings>
    </applicationSettings>
</configuration>

そのため、WinForm.exe.config の Message 設定の値を別の値に変更すると、アプリケーションは DefaultValueAttribute をオーバーライドしてこの新しい値を表示します。

4

1 に答える 1

3

最近、この applicationSettings の問題についていくつかの調査を行いました。私が求めていたことを行うための 2 つの比較的便利な方法を見つけました。それについての私の考えをまとめて、ここにブログエントリを書きました。

  1. メイン アセンブリが依存するアセンブリは、個々のプロジェクトで定義した設定を使用できます。ただし、開発中にのみ使用できます。これは、それらがオンザフライでビルドされ、前回設定した値が含まれているためです。ただし、展開して各アセンブリに .config を配置できると考えると、設定の値を変更して実行時に反映させることを期待している場合、それらは機能しません。これは、最後の値がデフォルト値として設定され、ハードコードされているためです。
  2. そのため、すべての設定をメイン アセンブリの .config ファイルの appSettings に移動し、必要に応じて実行時にそれらを必要とするアセンブリに挿入する (引数として渡す) 必要があります。
  3. それ以外の場合は、これらが開発中の構成ファイルであるとしましょう:

ClassLibrary.dll.config2

Winform.exe.config3

展開するには、メインの構成ファイルに構成セクションを作成し、次の場所を指す必要があります。

変更された Winform.exe.config

変更した「ClassLibrary.dll.config」:

ここに画像の説明を入力

ただし、外部ファイルを指す必要はありません。構成セクションの宣言は、このようにメイン構成ファイルのさらに下の定義を指すことができます。

内部セクション

于 2012-04-17T02:50:13.890 に答える