.NET类库项目中的多个App.Config文件

29

我正在创建一个类库项目。 默认情况下,我有一个App.Config文件,因此我将所有特定于环境的数据放入该配置文件中。

现在根据环境(开发/测试/生产),我计划在VS 2010中拥有三个App.Config文件,如下所示:

App.Dev.Config

App.Test.Config

App.Prod.Config

想知道应用程序如何知道要使用哪个配置文件。

有没有人实现过这种情况。任何代码示例/文章都会很有帮助。

谢谢


有关 VB .NET 解决方案,请参考帖子。 - RBT
3个回答

18

此应用程序将使用名为 YourExcecutable.exe.config 的配置文件,该文件默认为包含在您(可执行)项目中的 App.config 文件。

请注意,.NET仅为整个应用程序加载一个配置文件。如果不编码,则无法使用多个配置文件(即每个库项目一个)。

  1. 选项:您可以使用 postbuild 事件和不同的解决方案配置将一个或另一个 App.Config 文件复制到输出文件夹

  2. 选项:您可以使用 ConfigurationManager 类通过代码加载替代的配置文件。


7
很清楚的是,与组件项目相关联的配置文件将永远不会被使用。只有主项目的配置文件将被使用。你需要在那个级别上进行控制。 - NotMe
@NotMe:我知道这比你想象中的更明确,但是有办法包含库配置文件。给它们一个独特的名称,将它们设置为复制到输出目录,并让启动项目的app.config将它们作为外部链接引用。 - Flater

13

在运行时加载不同的应用程序配置文件可以使用映射配置文件的概念来完成。首先,您需要在项目中添加对System.Configuration.dll的引用。

Copy to Output Directory属性的值设置为Copy if newer(参见屏幕截图)。这仅适用于非默认配置文件,例如App1.config、App2.config等。将默认配置文件App.config保持原样。通过此更改,当构建项目时,所有非默认应用程序配置文件都将在项目输出目录(\bin\debug)中可用。此属性的默认值为Do not copy

enter image description here

以下是从非默认配置文件读取配置数据的代码片段:

ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();
configFileMap.ExeConfigFilename = "App1.config"; // app1.config should be present in root directory from where application exe is kicked off

 // Get the mapped configuration file
 var config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

 //get the relevant section from the config object
AppSettingsSection section = (AppSettingsSection)config.GetSection("appSettings");

//get key value pair
var keyValueConfigElement = section.Settings["appSettingsKey"];
var appSettingsValue = keyValueConfigElement.Value;
如果您有多个应用程序(也称为应用程序)配置文件,则可以在默认的 App.config 文件中保留设置,借助此设置,您可以在运行时决定要加载哪个非默认配置文件,例如 App1.config 。 注意:现在看一下下面的代码:
ConfigurationManager.AppSettings["DeployEnv"]

这段代码仍将从默认的App.config文件中读取数据。这种行为无法更改。没有办法禁止加载默认的App.config文件。您必须使用本帖讨论的其他方法来从非默认的配置文件中读取数据。


2
感谢您的解决方案!我已经为VB进行了转换:https://stackoverflow.com/questions/55547789/vb-get-configuration-from-different-configuration-file - Grufas
非常感谢在将应用程序从.NET Framework转换为.NET6时,sample.exe.config更改为sample.dll.config,但我的整个生态系统都希望直接使用exe配置文件。 - Jan Zahradník

11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接