我的应用程序是一个服务应用程序,它需要加载一组用户可以更改的配置。我正在使用System.Configuration类来设置app.config文件,然后我将为用户提供编辑此文件以更改配置的选项。
我可以将此文件移动到自定义目录,例如C:\ settings \ app.config吗?还是被迫驻留在app目录中?
谢谢
答案 0 :(得分:2)
看一下这个链接:
How to read app.config from a custom location, i.e. from a database in .NET
特别是这个答案:
What about using:
System.Configuration.ConfigurationManager.OpenExeConfiguration(string exePath)
That should let you open an arbitrary app.config file.
答案 1 :(得分:1)
您现在看到的文件app.config将命名为myservice.exe.config,并且可以在可执行文件myservice.exe的同一文件夹中找到,因为我对Windows应用程序的了解与ASP.NET应用程序相反,当程序运行时,您无法手动编辑.config文件,将被锁定,如果您使用记事本打开它,则无法保存。即使你做了一些魔法来解锁它,你仍然应该停止并重新启动Windows服务以从那里获取最新的值。我不知道你是否可以将它放在另一个文件夹中,我猜不是。您仍然可以在一些其他文件,xml或数据库中保存所需的设置,例如,.config文件将包含一个带有这些自定义XML文件路径的密钥。
答案 2 :(得分:0)
另一种方法是将配置文件保留为可执行文件,并将相关的可更改部分移动到外部xml文件,这些文件可以位于您选择的任何位置。
如果您以只读容量使用配置文件,则可以使用XML Inlcude将相关块添加到不同位置的XML文件中。如果您尝试使用Configuration.Save方法将值直接写回app.config,那么这将无法工作。
的app.config:
<?xml version="1.0"?>
<configuration xmlns:xi="http://www.w3.org/2001/XInclude">
<appSettings>
<xi:include href="AppSettings.xml"/>
</appSettings>
<connectionStrings>
<xi:include href="ConnectionStrings.xml"/>
</connectionStrings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/></startup>
</configuration>
&#13;
ConnectionStrings.xml:
<?xml version="1.0"?>
<add name="Example1ConnectionString"
connectionString="Data Source=(local)\SQLExpress;Initial Catalog=Example1DB;Persist Security Info=True;User ID=sa;Password=password"
providerName="System.Data.SqlClient" />
<add name="Example2ConnectionString"
connectionString="Data Source=(local)\SQLExpress;Initial Catalog=Example2DB;Persist Security Info=True;User ID=sa;Password=password"
providerName="System.Data.SqlClient" />
&#13;
AppSettings.xml:
<?xml version="1.0"?>
<add key="Setting1" value="Value1"/>
<add key="Setting2" value="Value2"/>
&#13;
文件URI如下所示:
file:///C:/whatever.txt
您甚至可以定义故障转移文件,以防您尝试引用的文件丢失。此模式来自https://www.xml.com/pub/a/2002/07/31/xinclude.html:
<xi:include href="http://www.whitehouse.gov/malapropisms.xml">
<xi:fallback>
<para>
This administration is doing everything we can to end the stalemate in
an efficient way. We're making the right decisions to bring the solution
to an end.
</para>
</xi:fallback>
&#13;