多个配置文件:该过程从哪一个读取?

时间:2009-03-24 02:37:02

标签: .net web-config app-config

我有一个包含多个项目的解决方案。在每个项目中,我添加了一个.config文件,其中包含影响本地设置的设置。

当我尝试读取数据库连接的设置时,我得到了一些我不知道它们来自哪里的值。

这是DatabaseLayer解决方案的.config文件:

<configuration>
<configSections>
</configSections>
<connectionStrings>
    <add name="localDBConnection"
        connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Niko\Documents\Visual Studio 2008\Projects\GaitLinkServer\DatabaseLayer\GaitLinkDB.mdf;Integrated Security=True;User Instance=True"
        providerName="System.Data.SqlClient" />
</connectionStrings>

当我执行该行

private string connectionString = ConfigurationManager.ConnectionStrings["localDBConnection"].ToString();

我有空引用对象异常。所以我尝试执行以下命令:

ConfigurationManager.ConnectionStrings[0]

然后它返回

{data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true}
base {System.Configuration.ConfigurationElement}: {data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true}
ConnectionString: "data source=.\\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
Name: "LocalSqlServer"
ProviderName: "System.Data.SqlClient"

哪位不知道它来自哪里。

如果有人能够展示如何为包含多个项目的解决方案制作全局.config文件以及如何链接本地(Project).config文件,我将非常感激。

谢谢!

4 个答案:

答案 0 :(得分:1)

给定的AppDomain(实际上不是进程)总是从单个文件中读取配置数据。默认情况下,这是桌面应用程序的 applicationname .EXE.CONFIG,或asp.net应用程序的web.config。没有使用.DLL.CONFIG。您需要将此类文件中的任何设置复制到实际配置文件中。

答案 1 :(得分:1)

请注意,如果您使用ApplicationSettings,则属性将从App.Config文件属于该特定项目的任何内容中获取默认值。您可以在正在运行的应用程序中指定“应用程序设置”,它将覆盖默认值。

解释..

我有一个名为CatalogData的项目。使用Project属性屏幕/ Settings选项卡,我添加了一个名为test的属性,其值为test。

应用程序配置文件包含

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

...

<configSections>
    <sectionGroup name="userSettings" 
     type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    >
        <section name="CatalogModel.Properties.Settings"
         type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
         allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
</configSections>

<userSettings>
    <CatalogModel.Properties.Settings>
        <setting name="test" serializeAs="String">
            <value>test</value>
        </setting>
    </CatalogModel.Properties.Settings>
</userSettings>

...

</configuration>

为读取设置而生成的代码(通过My.Settings.test为VB.NET提供,或者如下所示在C#中

CatalogModel.Properties.Settings s = new CatalogModel.Properties.Settings();
string test = s.test;

在生成的代码中获取默认值,只要编译的设置正常,就可以有效地使app.config文件不需要部署。

在此片段中,您可以看到提供默认值的属性,该属性已编译。

...
    [global::System.Configuration.DefaultSettingValueAttribute("test")]

    public string test {
        get {
            return ((string)(this["test"]));
        }
    }

答案 2 :(得分:0)

您的所有配置设置都需要在app.config(或web.config)中找到可执行项目(您的控制台应用,网站等)。

如果您在app.config中为库(DLL)项目添加配置设置,则无法找到它们。您需要将所有设置复制到可执行文件的.config中。或者你可以搞乱你的DLL项目app.configs的构建操作,然后尝试从你的可执行app.config引用那些。通常最简单的方法是将所有设置放在一个地方。

答案 3 :(得分:0)

到目前为止,答案中没有提到的一件事是,在ASP.NET或WinForms应用程序中运行的任何程序集都将通过ConfigurationManager识别应用程序的web.config / app.config。因此,正如所建议的,当您将配置信息放入应用程序的配置文件时,应用程序中使用的程序集可以读取这些值。您必须做的唯一事情(并记录为良好实践)是确保app / web配置具有.DLL期望的命名元素。

例如,您在WinForms应用程序中有一个.DLL,它希望托管.DLL的应用程序在名为“MyAppConn”的条目中有一个条目。您的DLL代码将使用:

Dim cs as String = ConfigurtionManager.ConnectionStrings("MyAppConn").ToString

DLL可用于许多不同的托管应用程序,只要在托管应用程序的.config文件中定义了MyAppConn,DLL就会获得连接字符串。如果需要,MyAppConn可以指向每个托管应用程序中的不同数据库。