为什么app.config工作异常?

时间:2014-09-29 19:33:45

标签: c# .net winforms visual-studio

我的问题已经解决,但我不太了解解决方案及其工作原理。我在一个解决方案中创建了一个类库“Business Layer”,该解决方案还包含一个Windows窗体项目(C#)。在类库中,我放了一个app.config文件并在其中定义了一个连接字符串,我在业务层的SQL连接代码中使用了它。然后我在Windows窗体应用程序中调用了数据库逻辑,但项目在连接字符串部分失败(即,它返回null)。但是,当我将app.config复制到应用程序项目时,它开始工作。为什么?为什么如果我在业务层中使用粘贴应用程序项目中的代码的所有数据库代码?

代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
  </configSections>
  <connectionStrings>
    <add name="ConnectionString" connectionString="Data Source=HOME-PC;Initial Catalog=LMS;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

得到:

string conStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.ToString();

2 个答案:

答案 0 :(得分:5)

您在程序中使用以下代码:

string conStr = ConfigurationManager.ConnectionStrings["ConnectionString"]
    .ConnectionString.ToString();

那么,这是做什么的?为什么这很重要?

ConfigurationManager将查找与正在运行的程序对应的app.configweb.config(如果您正在创建网站)。例如,如果您有一个名为&#34; MyCoolProgram&#34;的程序,您将有两个名为&#34; MyCoolProgram.exe&#34;的输出文件。和&#34; MyCoolProgram.exe .config &#34;。

由于这种命名结构,ConfigurationManager能够正常工作。

但你已经制作了app.config,对吗?您在引用dll项目中创建了一个。为什么你必须使用相同的值创建另一个app.config?

因此,让我们在另一个项目中加入我们的示例。到目前为止,我们的示例解决方案如下所示:

  • MyCoolProject(exe)
  • CommonLogic(dll)

如果两个项目都有自己的app.config文件,MyCoolProjects&#39;中列出的文件bin文件夹看起来像这样:

  • MyCoolProject.exe
  • MyCoolProject.exe.config
  • CommonLogic.dll

首先,CommonLogic的配置文件在哪里?它不在那里。默认情况下,类库的配置文件不会与dll文件一起复制,但您可以看到它仍然存在于CommonLogic的bin目录中。

其次,让我们说你复制了CommonLogic的配置文件。您将在MyCoolProject的bin目录中有一个名为CommonLogic.dll.config的文件。但是,使用&#34; MyCoolProject.exe.config&#34;为空,您的代码仍然无法找到连接字符串。这很奇怪,因为,

  1. 连接字符串(仅在CommonLogic.dll.config
  2. 中设置)
  3. 尝试获取连接字符串的代码来自CommonLogic
  4. 那是什么给了什么?

    记住我之前说过的内容:ConfigurationManager将查找与正在运行的程序对应的app.config,而不是代码运行的程序集。无论您的代码在哪里,Configuration Manager都会查看&#34; MyCoolProject.exe.config&#34;任何价值观。它不会去看别的东西。出于所有意图和目的,它甚至知道关于任何其他库或配置文件。

    这意味着您需要将连接字符串(最好是唯一的)放在将消耗引用库的程序中。

    类库不应该负责设置连接字符串,这应该取决于使用它的程序。

答案 1 :(得分:2)

  

当我在实际应用程序项目中复制app.config时,它开始工作,为什么?

因为app.config适用于应用程序,而不适用于。 VS只为您提供了一个app.config,用于向您展示应该在应用程序配置文件中放置的内容。

假设一个库可以在具有不同配置的多个应用程序中使用是完全合理的,因此将配置绑定到库将使得在应用程序之间分离配置变得更加困难。