“ConfigurationManager”名称在当前上下文中不存在。

519

我正在尝试从配置文件中访问connectionStrings。这是ASP.NET+C#的代码。我已经添加了System.Configuration进行引用并在使用中也提到了。但仍然无法接受该程序集。

我正在使用VSTS 2008。有任何想法是什么原因吗?

另一个奇怪的事情是程序集名称显示为"System.configuration",小写字母c,这不是其他系统程序集显示名称的方式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace Utility
{
    public class CommonVariables
    {
        public static String ConnectionString
        {
            get { return ConfigurationManager.ConnectionStrings["EmployeeEntities"].ConnectionString; }
        }  
    }  
}

配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="qbankEntities" connectionString="metadata=res://*/qbankModel.csdl|res://*/qbankModel.ssdl|res://*/qbankModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=qbank;Persist Security Info=True;User ID=**;Password=****;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

1
你能加入一些代码吗? 你说的“它不接受汇编”是什么意思? 你收到了具体的错误信息吗? - Joshua Belden
19个回答

884

不仅需要使用 命名空间 System.Configuration,还需要通过以下步骤添加对 程序集 System.Configuration.dll 的引用:

  1. 右键单击 引用 / 依赖项
  2. 选择 添加引用
  3. 找到并添加 System.Configuration

这样肯定能行。 关于 NameValueCollection,您需要编写:

using System.Collections.Specialized;

2
+1 谢谢Kieran。你知道为什么大多数其他程序集可以通过包含“using”语句来调用,而这个必须要这样做吗? - Dhaust
14
这是我理解的:可能是错的。当你添加引用时,你正在要求在编译/构建时将dll复制到bin文件夹中。有些被视为核心的dll在创建项目时就被添加了,例如当你点击“文件”->“新建项目”,那么引用就在那时设置好了。它们都必须经过相同的过程,只是有些是为你完成的,有些则需要手动完成。你可以通过删除对你的System dll的引用并观察所有代码失败来测试它。=) - Kieran
7
好的。我已经进行了一些研究,并发现上面的大部分内容是正确的。然而,一些文件在运行时不需要写入到bin文件夹中,因为它们在全局程序集缓存(GAC)中,而bin是本地程序集缓存,比如System.dll文件。 - Kieran
5
“System.Configuration”命名空间可以在“System” dll中找到,这就是为什么Intellisense会接受“using System.Configuration;”,但是除非项目引用了“System.Configuration.dll”,否则将无法找到ConfigurationManager,这可能会让人感到困惑。 - jaybro
为什么默认项目模板中没有添加System.Configuration作为引用,我不知道?是因为很少有人使用配置文件,所以决定需要手动添加引用来防止潜在的不必要的引用膨胀吗?我只是觉得这非常烦人,每个项目都要“添加引用”。 - LordWabbit
VS .net 可以像工具提示一样提供建议 :-( - khalidmehmoodawan

101
在你的项目中,右键点击“添加引用...”,在.NET选项卡中找到System.Configuration组件名称并单击确定。 using System.Configuration 告诉编译器/IntelliSense在该命名空间中搜索所使用的所有类。否则,每次都必须使用完整名称(System.Configuration.ConfigurationManager)。但如果你没有添加引用,则无法在任何地方找到该命名空间/类。
请注意, DLL 可以有任何命名空间,因此文件System.Configuration.dll 在理论上可以具有命名空间Some.Random.Name。为了清晰/一致,它们通常相同,但也有例外情况。

46

好的.. 在重启VSTS后它起作用了。这个链接提供了相同问题的解决方案。真希望我之前就看到它了。:)


21
七年过去了,仍然很可惜这通常是答案。 - Reinstate Monica Cellio
4
把自己的回复标记为答案,而它实际上并不是答案,这样做没有什么好处。可惜管理员不能编辑以获得真正正确的答案。那个人标记自己的答案来获得积分... - ggiaquin16
1
@ ggiaquin16 如果你接受自己,就不会得到积分;) - JAD
@calios,如果您阅读原始问题,您会发现提问者在第一个版本的问题中已经将程序集添加到项目中。对于这个特定的程序集和VS版本,必须重新启动IDE,否则错误将继续发生。那就是解决方案。这里的两个高评分答案实际上与所提出的问题无关,但您不会想知道为什么有人会在未阅读问题的情况下回答问题。(在只为得分而做事情的情况下,这似乎非常有效...) - ebyrob

36

System.Configuration作为所有项目的引用将解决此问题。

  1. 进入 项目 -> 添加引用

  2. 在弹出的窗口中,点击左侧列表中的所有程序集选项卡。

  3. 在中央列表中,滚动到System.Configuration并确保已勾选该框。

  4. 单击确定应用更改,现在您可以访问ConfigurationManager类了。


为什么不使用Nuget呢?你很可能已经在使用Nuget来管理依赖项了。 - Don Cheadle
不要忘记 using System.Configuration; - john k

22

只需安装

Install-Package System.Configuration.ConfigurationManager -Version 4.5.0

然后使用

using System.Configuration;

对于dotnet core,我必须运行dotnet add package System.Configuration.ConfigurationManager才能使其正常工作。 - oey

20

由于建议的解决方法都不适用于我,我来添加这个答案。

  1. 右键点击“引用”选项卡以添加引用。
  2. 点击“程序集”选项卡。
  3. 搜索“System.Configuration”。
  4. 单击“确定”。

13
  1. 右键单击项目
  2. 选择“管理 NuGet 包”
  3. 找到 System.Configuration
  4. 选择 Microsoft 的 System.Configuration.ConfigurationManager
  5. 安装

现在您可以:

using System.Configuration;

9
我为 configurationmanager does not exist in the current context 这个问题提供了更好的解决方案。
要从 web.config 中读取连接字符串,我们需要使用 ConfigurationManager 类及其方法。 如果要使用它,您需要添加命名空间,使用 System.Configuration;
虽然您已经使用了这个命名空间,但是当您尝试使用 ConfigurationManager 类时,系统会显示一个错误:“configurationmanager在当前上下文中不存在”。
要解决此问题:
ConfigurationManager.ConnectionStrings["ConnectionSql"].ConnectionString; 

9
如果你收到了很多警告(在我的情况下,是一个方案中的64个警告),比如

CS0618:'ConfigurationSettings.AppSettings'已过时:'此方法已过时,已被System.Configuration!System.Configuration.ConfigurationManager.AppSettings取代'

因为你正在升级一个旧项目,你可以按照以下步骤节省大量时间:

  1. References部分中添加System.Configuration作为引用。
  2. 将以下两个using语句添加到每个类(.cs)文件的顶部:

    using System.Configuration; using ConfigurationSettings = System.Configuration.ConfigurationManager;

通过这些更改,所有出现

ConfigurationSettings.AppSettings["mySetting"]

现在将引用正确的配置管理器,不再使用已弃用的版本,所有CS0618警告将立即消失。

当然,要记住这只是一个快速的hack。从长远来看,您应该考虑重构代码。


7

您确定已经添加了.NET程序集的引用而不是其他内容吗?建议您先移除引用,然后重新添加,并确保在Visual Studio的引用对话框中从.NET选项卡中选择 - 最新版本应该在GAC中为2.0.0.0。


属性窗口中的程序集细节: 名称:System.configuration 路径:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll 版本:2.0.0.0 运行时版本:v2.0.50727有什么看起来可疑的吗?谢谢! - pencilslate
不,这正是预料中的。太奇怪了 - 很抱歉,我以前从未见过这样的情况。祝你好运! - Dan Diplo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接