【问题标题】:Multiple config files: Which one do the process read from?多个配置文件:进程从哪个文件读取?
【发布时间】:2009-03-24 11:30:13
【问题描述】:

我有一个包含多个项目的解决方案。在每个项目中,我都添加了一个 .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 文件以及如何链接本地(项目).config 文件,我将不胜感激。

谢谢!

【问题讨论】:

    标签: .net web-config app-config


    【解决方案1】:

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

    解释一下..

    我有一个名为 CatalogData 的项目。使用项目属性屏幕/设置选项卡,我添加了一个名为 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 文件不需要部署,只要编译的设置正常。

    在这个sn-p中,你可以看到给出默认值的属性,它是被编译的。

    ...
        [global::System.Configuration.DefaultSettingValueAttribute("test")]
    
        public string test {
            get {
                return ((string)(this["test"]));
            }
        }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我知道这有点老了,但是如果从来没有使用过,为什么要创建一个 dll.config 文件?我有一个带有 web.config 文件的 asp.net 应用程序。当我构建项目时,我最终会在 /bin 文件夹中得到一个 MyAppName.dll.config 文件。看起来它没有被使用(并且它与 web.config 文件相同)所以我想知道为什么首先创建它。
      • 它存储需要合并到适当的 .exe.config 或 web.config 中的设置。否则,设置将存储在哪里?
      • 我有点困惑:我有一个 web.config 文件,只有在我构建了 asp.net 应用程序之后,我才会在 /bin 文件夹中得到一个 MyAppName.dll.config 文件基本上我最终得到 1 个 web.config 文件和 1 个 MyAppName.dll.config 文件。它们是相同的,显然没有使用第二个。这仅在我开始使用 Visual Studio 2013 时发生。在升级之前,我只有 web.config 文件。
      • @Anthony:您的 web.config 文件不太可能与您的 MyDll.dll.config 文件相同。
      • 我可以向您保证这两个配置文件是相同的(我刚刚再次比较了它们)。实际上,一个称为 web.config(如预期的那样),另一个称为 MyWebApp.dll.config 这就像 Visual Studio 正在获取 web.config 文件并在放入 /bin 文件夹之前将其重命名为 MyWebApp.dll.config。显然不需要,因为当我删除它时,网络应用程序按预期工作。我只是想知道为什么要创建这个额外的配置文件,如果没有必要,我如何防止这种情况发生。
      【解决方案3】:

      您的所有配置设置都需要进入可执行项目(您的控制台应用程序、网站等)的 app.config(或 web.config)中。

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-20
          • 1970-01-01
          • 2015-11-20
          • 1970-01-01
          • 1970-01-01
          • 2017-10-12
          相关资源
          最近更新 更多