如何将类库的applicationSettings合并到主机可执行文件的配置文件中

Mir*_*Ion 6 application-settings settings.settings visual-studio

我正在阅读有关applicationSettings的文章和论坛帖子,差不多一个星期了.

在几乎每个线程中都有人似乎正确地指出类库在部署时不能有配置文件,并且必须在主机/的应用程序的可执行文件 .exe.config配置文件中指定/合并其设计中的applicationSettings.消耗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
Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

    结束班

  4. 让WinForm"设置为启动项目"

现在,在IDE中,一切都很美妙.运行解决方案,您将获得预期的Hello!当你按下按钮.如果你去更改库的app.config中的设置,说"再见!" 然后你再次运行解决方案,你会得到一个"再见!"

但是,右键单击WinForm项目并"在资源管理器中打开"并转到Debug文件夹.还没有WinForm.exe.config文件.让我们快速创建一个.切换回VS并在选择WinForm项目时单击以显示所有文件.展开MyProject,打开Settings.settings,创建一个设置(doens't what what)并保存.我们去了,创建了一个App.config,如果我构建了这个解决方案,Debug文件夹将包含一个WinForm.exe.config.

告诉我如何从类库配置中合并我的Message设置

<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>
Run Code Online (Sandbox Code Playgroud)

进入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>
Run Code Online (Sandbox Code Playgroud)

所以我可以将WinForm.exe.config中的Message设置值更改为其他内容,应用程序将显示覆盖DefaultValueAttribute的新值.

Mir*_*Ion 3

我最近针对这个应用程序设置问题做了一些研究。我找到了两种相对方便的方法来完成我的要求。我把我的想法放在一起并在这里写了一篇博客文章。

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

类库.dll.config2

Winform.exe.config3

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

修改Winform.exe.config

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

在此输入图像描述

不过,您不必指向外部文件,配置节声明可以在主配置文件中进一步指向它们的定义,如下所示。

内部部分