我有一个包含多个项目的解决方案。在每个项目中,我添加了一个.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文件,我将非常感激。
谢谢!
答案 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可以指向每个托管应用程序中的不同数据库。