6

我正在阅读有关 applicationSettings 的文章和论坛帖子将近一周了。

在几乎每个线程中,似乎都有人正确地指出,类库在部署时不能有配置文件,并且它们在设计时配置的 applicationSettings 必须在托管/的应用程序的可执行.exe.config 配置文件中指定/合并消耗 dll。

不一定是真的。

您可以但您不需要合并它们的类库设置,除非您想为用户提供一种“覆盖”默认值的方法——这些默认值是使用在程序集中硬编码的 DefaultValueAttribute 指定的。

所以,举一个非常简单实用的例子。让我们使用 VB.NET 1。我创建了一个名为 ClassLibrary 的类库项目。2. 显示所有文件,展开 MyProject,双击 Settings.settings。3. 添加一个名为 Message 的设置,其值为“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 处理程序。应该是这样的。

    公开课形式1

    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 问题做了一些研究。我找到了两种相对方便的方法来做我要求的事情。我把我的想法放在一起,在这里写了一篇博客文章。

  1. 您的主程序集所依赖的程序集可以并且将使用您在其各个项目中定义的设置,但仅在开发期间只是因为它们是动态构建的并且包含您上次设置的任何值。但是,当您部署并认为可以为每个程序集放置 .config 时,如果您希望更改设置的值并在运行时反映该值,那么它们将不起作用,这是因为最后一个值被设置为默认值并且是硬编码的。
  2. 因此,您必须将所有设置移动到主程序集的 .config 文件中的 appSettings 并在运行时根据需要将它们注入需要它们的程序集(将它们作为参数传递)。
  3. 否则,假设这些是您在开发中的配置文件:

类库.dll.config2

Winform.exe.config3

对于部署,您必须在主配置文件中创建一个配置部分并指向

修改Winform.exe.config

您修改后的“ClassLibrary.dll.config”:

在此处输入图像描述

不过,您不必指向外部文件,配置部分的声明可以像这样在主配置文件中进一步指向它们的定义。

内部部分

于 2012-04-17T02:50:13.890 回答