我有一个在几个项目中使用的配置文件,general.config
,看起来像:
<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
<add key="mykey1" value="myvalue1"/>
<add key="mykey2" value="myvalue2"/>
</appSettings>
在其中一个项目中,我需要覆盖两个设置之一。所以这个项目的app.config
看起来像:
<?xml version="1.0"?>
<configuration>
<appSettings file="general.config">
<remove key="mykey1"/>
<add key="mykey1" value="anothervalue"/>
<add key="mykey3" value="myvalue3"/>
</appSettings>
</configuration>
但是remove
在这里不起作用。如何在不破坏mykey2
的情况下重写mykey1
?add
在这种情况下工作。我可以从ConfigurationManager
得到myvalue3
。
编辑:general.config
在编译时自动复制到输出文件夹。不要担心路径问题。目前我得到:
ConfigurationManager.AppSettings["mykey1"]
//I got "myvalue1", but I want "anothervalue" here
//that is, this item is "overrided", just like virtual methods in C#
ConfigurationManager.AppSettings["mykey2"]
//this setting will not be modified, currently it works fine
ConfigurationManager.AppSettings["mykey3"] //good
4条答案
按热度按时间3j86kqsm1#
MSDN有助于回答这个问题:
您可以使用file属性指定一个配置文件,该文件提供附加设置或重写在appSettings元素中指定的设置。可以在源代码管理团队开发方案中使用file属性,例如当用户希望重写在应用程序配置文件中指定的项目设置时。在file属性中指定的配置文件必须将appSettings元素而不是configuration元素作为根节点。
因此,
general.config
中的设置将覆盖app.config
中的项。这与您想要的相反(让app.config
项覆盖general.config
项)。你将不得不用C#代码来解决这个问题(它将不可避免地看起来很丑)。6vl6ewon2#
您使用
file
属性加载公共设置,并期望直接添加到<appSettings>
元素的键将覆盖这些公共设置,这是可以理解的,但不幸的是,这不是它的工作方式。微软的意图是让
file
属性加载覆盖单个应用程序设置的公共设置。Microsoft Documentation中对此进行了详细讨论
为了克服这个问题,我们偶尔会在公共文件中声明基本设置,然后在应用程序配置中适当地命名重写。然而,这确实需要额外的代码,这是一个有点丑陋。例如
eeq64g8w3#
子文件中的元素发生了变化,我的意思是,当前您的app.config是父文件,值被General.config中现有的值替换
由于你在父文件中使用了
remove
,它的有效作用是删除你在app.config中指定的元素,但之后来自general.config的元素被推入。现在说在General.config中,你说删除app.config上的mykey3
,你会看到最终的集合没有mykey3
这样的键。简而言之,这是行不通的。希望这对你有帮助。
kpbwa7wx4#
你可以添加另一个配置文件,比如Test.xml。
在app.config中,appsettings部分将如下所示: