为什么app.config工作异常

本文关键字:异常 工作 config app 为什么 | 更新日期: 2023-09-27 18:24:56

我的问题已经解决了,但我不太了解解决方案以及它为什么有效。我在一个解决方案中制作了一个类库"业务层",该解决方案还包含一个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();

为什么app.config工作异常

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

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

那么,这有什么作用呢?为什么这很重要?

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

正是由于这种命名结构,ConfigurationManager才得以工作。

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

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

  • MyCoolProject(exe)
  • CommonLogic(dll)

如果两个项目都有自己的app.config文件,则MyCoolProjects的bin文件夹中列出的文件如下所示:

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

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

其次,假设您确实复制了CommonLogic的配置文件。您将在MyCoolProject的bin目录中有一个名为CommonLogic.dll.config的文件。但是,在"MyCoolProject.exe.config"为空的情况下,您的代码仍然找不到连接字符串。这很奇怪,因为

  1. 连接字符串在CommonLogic.dll.config中设置(仅)
  2. 试图获取连接字符串的代码来自CommonLogic

那是什么呢?

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

这意味着您需要将连接字符串(最好是排他地)放入将使用引用库的程序中。

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

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

因为app.config用于应用程序,而不是。VS只是为库提供了一个app.config,以向您显示应用程序配置文件中应该放什么。

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