如何在解决方案中的项目之间共享单个配置?

Posted

技术标签:

【中文标题】如何在解决方案中的项目之间共享单个配置?【英文标题】:How can a single configuration be shared between projects in a solution? 【发布时间】:2016-10-07 10:40:40 【问题描述】:

我在 Visual Studio 中有一个解决方案 (S),其中包含 3 个项目,我将它们称为 CL、WPF 和 CFG;

S.CL 是一个用于控制台应用程序的项目。 S.WPF 是一个用于 WPF 应用程序的项目。 S.CFG 是一个包含配置文件的项目。

我创建了一个具有用户范围和公共可见性的设置文件。这两个项目使用相同的设置。

S.CL 只需要读取这些设置。 S.WPF 是用于编辑这些设置的表单,因此需要读写。它包含一个连接到事件处理程序的保存按钮。

S.CFG app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="S.CFG.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <S.CFG.Properties.Settings>
            <setting name="ExampleSetting" serializeAs="String">
                <value>ExampleValue</value>
            </setting>
        </S.CFG.Properties.Settings>
    </userSettings>
</configuration>

S.CL Execute.cs:

namespace S.CL

    public class Execute
    
        public static void Main(String[] args)
        
            Console.WriteLine(S.CFG.Properties.Settings.Default.ExampleSetting);
        
    

S.WPF MainWindow.xaml.cs:

namespace S.WPF

    public partial class MainWindow : Window
    
        public MainWindow()
        
            InitializeComponent();
        

        private void button_Click(object sender, RoutedEventArgs e)
        
            S.CFG.Properties.Settings.Default.ExampleSetting = "New value";
            Console.WriteLine(S.CFG.Properties.Settings.Default.ExampleSetting);
        
    

所以,重现步骤:

Run S.CL out> ExampleValue
Run S.WPF out> New value
Run S.CL out> ExampleValue

在 S.CL 的最后一次运行中,输出应该是“新值”。

我可以确认 S.WPF 每次运行时也会获得最新的值。在我的完整应用程序中,表单在点击保存之前会在文本框中显示最新值。

到目前为止,我已经设法发现 S.WPF 在用户的 AppData 文件夹中创建了一个包含这个新 app.config 的文件夹。 S.CL 使用它内置的默认配置副本,而 S.WPF 使用它内置的默认配置副本,直到它写入,然后它创建一个本地副本,只有可执行文件访问。

我只是希望能够在这两个可执行文件之间保留这些设置。我已经考虑过这样做的其他方法,另一种方法是将设置的 XML 文件保存在两个可执行文件的根目录中并仅解析该文件,但我宁愿使用 Visual Studio 的 app.config/Settings.Settings 功能来执行此操作(如果可能的话)。

提前致谢!

【问题讨论】:

【参考方案1】:

您可以在解决方案中添加一个 app.config 文件并链接此文件,而不是将 app.config 文件添加到每个项目一个文件到两个项目,如下所述:Share code with Add as Link。

编辑:

如果您希望能够加载外部app.config,您可以按照this post的说明进行检查,

【讨论】:

我没有为每个项目添加 app.config。我只有一个,它在 CFG 项目中。所有其他项目都在访问此 CFG 设置文件,但无论何时进行写入,都会在 AppData 中创建设置的本地副本。另外,我希望使用 C# 设置的任何内置功能(如果存在),而不是自己解析配置文件。 好的,如果我得到你,那么在构建三个应用程序之后,你就会拥有各自的 app.config 文件。由于每个应用程序在默认情况下在应用程序启动时(在每个应用程序的 AppData 文件夹中)加载自己的 app.config,因此您可以通过以下方式手动加载通用 app.config 文件给出公共文件as described here的确切路径

以上是关于如何在解决方案中的项目之间共享单个配置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在工作室中的多个 ASP.Net 项目之间共享内容文件夹?

如何在 Razor .cshtml 和 Html 文件之间共享 JS 变量值(同一解决方案中的 Html 解决方案)

WCF IIS 托管服务由单个服务实现的多个服务合同 - 如何通过配置在端点之间共享 uri

如何在 Monorepo 中的 VueJS 项目之间共享组件

如何在 ASP.NET MVC 中的 2 个不同项目/应用程序之间共享母版页?

如何在不同的解决方案之间共享相同的 Visual Studio 项目?不同的 app.config 和 settings.settings