多个程序的C#集中设置

多个程序的C#集中设置,c#,app-config,C#,App Config,我最近得到了一堆要维护的程序,我正试图在采用一些最佳实践方面找到一些帮助。它们本质上是三个独立的软件,它们使用一个公共DLL来管理所有应用程序共享的一系列设置。DLL的工作方式是这样的:它将用户设置文件(深埋在Windows中用户配置文件夹中的XML文件)与由硬编码(egad!)路径指定的修复文件交换 将其保留为用户设置而非应用程序设置的基本原理是,DLL可以在多个位置找到(每个将使用它的应用程序一个),因此用户设置文件是通用的(如果DLL的所有副本都是相同的),而通过使用应用程序设置,app.

我最近得到了一堆要维护的程序,我正试图在采用一些最佳实践方面找到一些帮助。它们本质上是三个独立的软件,它们使用一个公共DLL来管理所有应用程序共享的一系列设置。DLL的工作方式是这样的:它将用户设置文件(深埋在Windows中用户配置文件夹中的XML文件)与由硬编码(egad!)路径指定的修复文件交换

将其保留为用户设置而非应用程序设置的基本原理是,DLL可以在多个位置找到(每个将使用它的应用程序一个),因此用户设置文件是通用的(如果DLL的所有副本都是相同的),而通过使用应用程序设置,app.config文件的数量将与DLL的副本数量相同


我正试图想出一种更好的方法来集中这些配置并结束毫无意义的文件交换。一种方法(实际上,最有可能是最好的方法)是重新设计所有3个应用程序,使它们都使用一个带有自己“app.config”的中央dll。还有其他更值得推荐的场所吗?

您考虑过使用Windows注册表吗?我们都讨厌它,但在这种情况下,它可能是最好的选择,因为它是集中的,您可以轻松地在应用程序之间共享设置

编辑:如果您不喜欢注册表(我也不怪您),可以在Application Data special文件夹下的目录中创建XML或其他配置文件。据我所知,这些天就是这样做的

string appData = Environment.GetFolderPath(
    Environment.SpecialFolder.LocalApplicationData));
string folder = "MyApplicationName";
string fileName = "settings.xml";
string path = Path.Combine(Path.Combine(appData, folder), fileName);

对于这个精确的问题,如果它是.Net DLL,您可以使用GAC,这将集中您的DLL。所有软件都知道在哪里可以访问此DLL。通过这种方式,可以减少重构的工作量

这只是针对此问题的修补程序。对于新的开发,我不推荐这个


您可以使用公用文件中的设置-很可能存储在用户设置文件夹中的AppData下

这里的优点是,您不必修改任何代码

应用程序会将其设置存储在其正常配置文件中,并参考公共文件了解dll设置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings file="commondll.config">
    <add key="KeyToOverride" value="Original" />
    <add key="KeyToNotOverride" value="Standard" />
  </appSettings>
</configuration>

然后在公共文件commondll.config中:

<appSettings>
  <add key="KeyToOverride" value="Overridden" />
  <add key="KeyToBeAdded" value="EntirelyNew" />
</appSettings>


可能会包含有用的信息。

有,但宁愿没有。我以为总的想法是离开登记处。这是个不错的主意,但我想看看其他的选择。我不想再给注册中心一个机会,但这可能是最好的答案。胜过我的@MPelletier:就集中式配置而言,我认为注册表是最好的选择。您可以使用数据库,编写自己的配置框架,并以自定义方式存储配置,等等。事实是,注册表在windows中无处不在……它就在那里,并且易于访问。很难出错。我建议您围绕注册表访问编写一个包装器,以防将来您会想出更好的解决方案。这样对应用程序的影响较小。运行应用程序时,将只加载.exe的app.config。对于您使用的每个dll,设置不是从单独的.config文件加载的。您是否检查过,如果将dll的设置设置为计算机,则每个dll有多个设置?我现在在macbook上,无法确认。@ScottS:本例中的设置属于DLL,而不是应用程序。@SixlettVariables:不,没有。天哪,我会的@姆佩莱蒂埃,我明白。在IDE中,您将拥有一个dll类库项目,该项目具有自己的app.config。但是,当您在.exe中使用该dll时,将从exe的配置文件中读取设置。您需要将dll的设置添加到exe的配置文件中。不同的应用程序仍然有单独的工作目录和配置文件,因此定位设置的问题仍然存在。据我所知,dll是配置的中心点。因为如果他被放入GAC,所有的数据都驻留在DLL中,所以所有数据都将集中