在C#应用程序中动态使用多个配置文件

在C#应用程序中动态使用多个配置文件,c#,config,app-config,C#,Config,App Config,我在这方面做了很多研究,尝试了很多方法,但我开始认为我想做的事情是做不到的。也就是说,我正在构建一个将由多个客户端使用的应用程序。每个客户机都有自己的数据库连接要求,以及自己的一组自定义设置,以控制应用程序的某些行为 我要做的是为每个客户端创建一个.config文件,然后使用一个命令行参数指定要加载的.config文件。每个配置文件都有自己的节,以及自己的。我已经阅读了许多文档con ConfigurationManager和配置类,并尝试了许多不同的方法,但都失败了 基本问题是“当我打开.co

我在这方面做了很多研究,尝试了很多方法,但我开始认为我想做的事情是做不到的。也就是说,我正在构建一个将由多个客户端使用的应用程序。每个客户机都有自己的数据库连接要求,以及自己的一组自定义设置,以控制应用程序的某些行为

我要做的是为每个客户端创建一个.config文件,然后使用一个命令行参数指定要加载的.config文件。每个配置文件都有自己的节,以及自己的。我已经阅读了许多文档con ConfigurationManager和配置类,并尝试了许多不同的方法,但都失败了

基本问题是“当我打开.config文件时,如何告诉应用程序将此.config设置为默认配置?”例如,当我稍后引用appSettings中的值或数据库连接字符串时,如何确保这些引用都映射到我加载的自定义配置,而不是VisualStudio默认创建的


我已经找到了加载配置文件的各种引用,但是没有任何东西告诉我如何用刚加载的配置文件动态替换标准配置文件。我总是以空引用异常而告终,并一头撞到砖墙上。

您可以在配置文件中定义多个连接字符串,然后按名称引用它们。 例如:


...
您可以通过以下方式在c代码中引用它们:


为什么要使用配置文件?为什么不将配置存储在数据库中?无法将app.config替换为程序集的名称。但是您可以在启动时加载一个特定的配置文件,并让整个应用程序通过单例或类似的方式访问它?根据您拥有的项目/客户端数量,一种简单的方法是只使用一个配置,并使用客户端ID为每个应用程序设置的键添加前缀。然后使用前缀键字符串访问应用程序设置项目:
'CLIENT1-ConnectionString'
'CLIENT2-ConnectionString'
,等等…你不能告诉一个.net应用程序使用另一个.config文件。也许一个小的引导程序应用程序可以将.config文件复制到适当的位置,但您肯定会争取访问权。这个选项听起来没什么用处。不要认为这不是你真正想要的特征。您的客户端会在您不知道的情况下自行修改此文件,可能是在您停止关注很久之后。将所有客户的连接字符串存储在一个配置文件中,可能所有客户都可以访问,这听起来是个坏主意。在使用配置文件转换构建应用程序时为特定客户生成Web.config:我完全了解一个配置文件中的多个连接字符串,以及如何使用它们。多年来我一直在用C#开发web应用程序,但这不是一个web应用程序。不,这正是我所建议的。它不仅限于Web应用程序,您还可以在app.config中使用它。我们有一个类似的情况,应用程序只传递一个客户端ID。然后我们有一个到配置数据库的连接字符串。然后,我们可以从配置数据库中的表中查找客户机连接字符串。一旦我们连接到客户机数据库,每个客户机都有一个配置表,用于它们自己独特的配置值。它不必与web应用程序有太多关系。我有一些纯粹基于控制台的应用程序,其中包含连接到多个数据库的设置。@安德鲁·哈里斯:我明白你的建议,尽管这会增加复杂性,但也会起作用。我不能使用标准的ConfigurationManager,这会使它不那么优雅。该应用程序将有自己的支持数据库,因此我可以将所有配置数据(包括连接字符串)塞入其中。这些连接字符串将指向用户数据库,我可以存储任意数量的唯一配置值。这不是我所希望的,但它是完全可行的。也许MS将来会添加类似的东西(.NET 9,也许)。关于不使用内置的ConfigurationManager类的问题,它们并不特别复杂。在我前面提到的应用程序中,我们构建了自己的等效管理器工厂,它允许您只要求一个特定的配置选项,并返回一个类型化的值。让你的想象力尽情发挥吧。
string client1ConnStr = System.Configuration.ConfigurationManager.ConnectionStrings["client1Connection"].ConnectionString;
string client2ConnStr = System.Configuration.ConfigurationManager.ConnectionStrings["client2connection"].ConnectionString;