从App.config而不是AppName.exe.config读取配置

时间:2017-10-24 13:40:44

标签: c# .net winforms connection-string

我开发了一个小型Windows服务,它可以执行很少的数据库操作。我必须为用户提供一个选项,以便在部署后更改服务器名称。如果用户在app.config中更改它不会影响服务,它仍然从AppName.exe.config读取连接字符串。

这是我尝试过的。

<connectionStrings>
<add name="testString" connectionString="Data Source=ServerAddresss;Initial Catalog=DatabaseName;Integrated Security=True;" />
</connectionStrings>

C#代码,

ConfigurationManager.ConnectionStrings [&#34; ProjectName.Properties.Settings.testString&#34]。ConnectionString中);

这将从AppName.exe.config文件返回服务器连接字符串,但我想从App.config文件中访问它。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

App.config和AppName.exe.config不是完全分开的 - AppName.exe.config是app.config的构建输出。

换句话说,一旦部署了服务,甚至不应该更改app.config,如果有,更改它将不会做任何事情。 AppName.exe.config ,您的应用程序将获得“app.config”值。

如果您需要针对不同环境使用不同的配置值,请查看config transformations。它们允许您更改或替换不同配置的部分或单个值,例如调试,发布或其他自定义配置。

这很有用,因为它意味着所有连接字符串都是项目的一部分并且处于源代码管理中。您可以不使用此操作,只需在服务器上编辑配置文件,但源控件中没有任何内容可指示连接字符串的来源。然后,如果您重新部署服务,则更改将被覆盖,除非有人记得每次都进行相同的更改。在源代码管理中使用它会好得多。

由于某些我不明白的原因,您可以右键单击web.config并选择“添加配置转换”,但不能使用app.config执行此操作。也许这是一个很好的理由。

您可以安装this extension,这会为app.config启用相同的行为。然后,您可以右键单击app.config并为其他配置添加转换,例如Release。

在该文件(app.Release.config)中添加:

<connectionStrings xdt:Transform="Replace">
    <add name="testString" connectionString="...your Release connection string..." />
</connectionStrings>

使用Release配置构建和部署时,它会将connectionStrings部分替换为此部分,而将其他所有部分保留原样。您也可以右键单击app.Release.config并选择“预览配置转换”以与原始文件并排查看转换后的文件。

答案 1 :(得分:0)

您应该能够使用ConfigurationFileMap

拉入任意文件
System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

此问题可能与以下内容重复:Using ConfigurationManager to load config from an arbitrary location

此外,您必须确保在更新配置文件(配置文件)后重新启动该服务。