Visual Studio Code Dotnet Core C#中的错误:“找不到类型或命名空间名称'System'”,但是构建成功。

62

在尝试使用 Visual Studio Code 开发 C# DotNet Core MVC 应用程序时,我遇到了很多问题。它无法找到任何与 C# 有关的内容,甚至将“Using System;”标记为无效,并说找不到它。

但是,当我运行 Dotnet build 时,它成功完成且没有警告或错误,并且项目运行良好。

我的 project.json 文件:

 {
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.1.0",
      "type": "platform"
    },
    "Microsoft.EntityFrameworkCore.Sqlite": "1.1.0",
    "Microsoft.EntityFrameworkCore.Design": {
      "version": "1.1.0",
      "type": "build"
    },
    "Microsoft.AspNetCore.Mvc": "1.1.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.1.0",
    "Microsoft.Extensions.Configuration.Json": "1.1.0",
    "Microsoft.Extensions.Logging": "1.1.0",
    "Microsoft.Extensions.Logging.Console": "1.1.0",
    "Microsoft.Extensions.Logging.Debug": "1.1.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
    "Microsoft.AspNetCore.StaticFiles": "1.1.0"
  },

  "frameworks": {
    "netcoreapp1.1": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.1.0"
        }
      },
      "imports": "dnxcore50"
    }
  }
}

有任何想法吗?我对这个问题真是焦头烂额。

10个回答

141
有时候,Visual Studio Code中的C#插件(OmniSharp)会出现混乱。
尝试重新启动OmniSharp,有两种方法:
1. 关闭并重新打开Visual Studio Code,或者 2. 打开命令面板(Command Pallet),输入“Restart Omnisharp”。
如果我们从命令行而不是在Visual Studio Code内恢复依赖项,OmniSharp往往会变得混乱。

11
我尝试重启omnisharp,但没有成功。我甚至尝试重新安装整个.net core SDK和Runtime。我认为项目中有一些奇怪的问题,但我找不到原因。我希望我能调试omnisharp,以便知道它为什么找不到System... - MStudley
4
有时在执行 dotnet build 前,你需要先在 VS Code 中 保存所有 文件。 - Shaiju T
我曾经遇到过一个不存在的命名空间一直在出现的问题,这个帮助了我。 - Anton Toshik
确实,就像大多数微软产品一样,它需要重新启动。太糟糕了,VScode有潜力,但这些行为使其无用。事实上,我所做的大多数代码更改都没有被捕捉到,就像在IntelliJ或Eclipse中对Java所做的那样。所以最好使用vim ;)。谢谢您的答案,它起作用了。请注意,添加命令面板快捷方式很方便,即ctrol + shift + P。 - Vincent Gerris
非常顺利,谢谢。在重启命令之后还有一步,右下角弹出一个窗口询问是否要重新构建依赖项。我点击了重新构建按钮,所有的库都被再次识别。 - Azurespot

19
在Fedora 30上使用.NET Core 3.0的VS Code中,我在创建Worker项目后遇到了相同的问题,使用了dotnet new worker命令。第一个问题是OmniSharp服务器找不到Sdks文件夹,解决方法是将以下行包含到~/.bashrc中:
export MSBuildSDKsPath="/usr/share/dotnet/sdk/$(dotnet --version)/Sdks"

然后重新启动VS Code,但C#扩展程序显示了一些消息,例如:

'Collections'类型或命名空间在命名空间'System'中不存在(是否缺少程序集引用?)

解决方案是首先在终端运行:

dotnet build

然后使用命令面板(Ctrl+Shift+P)重启OmniSharp服务器:

OmniSharp: Restart OmniSharp

然后我重新启动了VS Code和C#扩展程序,所有依赖项都正常工作。


是的,重启OmniSharp在构建之后是关键。 - Adam Klein

3
如果您正在使用微软的VS Code扩展程序'C#',请尝试以下操作:
对我来说,执行以下两个步骤解决了问题:
1. 转到文件 -> 首选项 -> 设置 2. 搜索omnisharp.useModernNet并将其设置为false 3. 搜索dotnet.server.useOmnisharp并将其设置为true 然后按Ctrl+Shift+P
-> 开发人员:重新加载窗口

1
非常感谢!这个修复了一个让我疯狂的错误,每次都让检查器都会把整个文件都标记出来! - undefined

1
如果你遇到这个错误,可能是缺少了一个包。
“找不到名称为'System'的类型或命名空间”
要添加一个包,可以在终端中运行以下命令:
dotnet add package

示例:将Newtonsoft.Json NuGet包添加到项目中:

dotnet add package Newtonsoft.Json

之后,转到波浪线,并通过点击灯泡来添加缺失的引用。

您还可以安装Nuget包管理器扩展程序以找出您需要的软件包。请参阅此答案以了解更多信息:

在Visual Studio Code中安装Nuget包


1
我正在Mac上使用VS Code,配合OmniSharp和mono使用。在执行以下操作后,问题已经解决:
对于安装了Mono的MacOS和Linux用户,这意味着您需要将omnisharp.useGlobalMono设置为never,直到一个带有MSBuild 16.7的版本的Mono发布。

1

好的,我已经找到了导致问题的原因。我在project.json文件的框架部分引用了错误的导入。

这个:

"frameworks": {
    "netcoreapp1.1": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.1.0"
        }
      },
      "imports": "dnxcore50"
    }
  }

应该是这样的:

应该是这样的:

"frameworks": {
    "netcoreapp1.1": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  } 

我在一台Windows 8机器上,某种原因下 "dnxcore50" 不可用,但 "dotnet5.6" 和 "portable-net45+win8" 可以使用。我会继续研究这个问题的原因,但如果有人遇到了这个问题,我现在就发布这个答案。

0
在我的情况下,vscode 只显示了一个文件的错误。通过将缺失的文件添加到 Assembly-CSharp.csproj 中解决了这个问题。我不确定何时会自动添加文件,何时需要手动添加,但这解决了这个问题。
...
<ItemGroup>
    <Compile Include="Assets/Scripts/data/MissingFile.cs" />
...

0

我也遇到了同样的问题很多次...

在我的情况下,我以管理员身份打开了Visual Studio Code, 然后运行终端命令donet buid 如果需要,重新启动OmniSharp(ctrl + shift + p)

然后就可以正常工作了!!!


0

通过在工作区 settings.json 中添加配置 "omnisharp.useModernNet": true 解决了我的问题。

TL;DR

在我的情况下,我使用预安装的 Visual Studio 2017/2019 的开发环境,但是没有新的 .NET 6.0。

为了解决缺少 .NET 6.0 的问题,我在 "用户设置 (JSON)" 中将变量 omnisharp.useModernNet 设置为 false。很长一段时间过去了,我忘记了它...

后来,我安装了 .NET 6.0 SDK 并创建了一个新项目。但是,由于 useModernNet 被设置为 false,vscode (OmniSharp) 无法解析丢失的程序集,以适应(现在新的).NET 6.0 SDK。

简而言之,在我的特殊情况中,将值设置为 true 在我的工作区 settings.json 中为我解决了这个问题。


-1

出现关于“using System”的错误的另一个可能原因是将.vscode目录存储在git仓库中(可能没有将其添加到.gitignore中)。

使用VSCode打开解决方案文件夹可能会导致跨版本问题,就像上面所述的那样,可以通过删除.vscode目录来解决。


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