1

我有一个包含多个项目的解决方案。在每个项目中,我添加了一个 .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 文件,我将不胜感激。

谢谢!

4

4 回答 4

1

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

于 2009-03-24T02:41:17.997 回答
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 文件不需要部署,只要编译的设置正常。

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

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

    public string test {
        get {
            return ((string)(this["test"]));
        }
    }
于 2009-03-24T03:15:38.600 回答
0

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

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

于 2009-03-24T02:42:43.143 回答
0

到目前为止给出的答案中没有提到的一件事是,在 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 可以指向每个托管应用程序中的不同数据库。

于 2009-03-24T03:30:13.387 回答