预定义类型 'System.Object' 未在 .NET 4.6 中定义或导入。

214

我正在使用MVC 5和.NET 4.6创建一个Web API,供我的移动应用连接。

每当我构建项目时,会出现数百个错误,告诉我需要添加已经存在的引用,并且我的项目中每个类型都“不存在”。其中一些错误示例如下:(不包括标题中的错误)

ErrorList

我尝试过:

  • 通过NuGet添加对System.Runtime的引用。(从该问题推荐。)
  • 在project.json文件中的框架中删除aspnetcore50。(另一个建议,该问题。)
  • 重新启动VS2015和我的机器。
  • 通过NuGet软件包管理器升级项目中的所有软件包到最新版本。
  • 确保我可以在解决方案资源管理器的引用节点中看到引用。

更新: -我的project.json文件如下所示。(根据Karl的回答进行修改。错误列表现在减少到十个,但仍然是以前的那些错误。)

{
  "commands": {
    "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"
  },
  "dependencies": {
    "Microsoft.AspNet.Server.IIS": "1.0.0-beta5",
    "Microsoft.AspNet.Server.WebListener": "1.0.0-beta5",
    "Microsoft.AspNet.Diagnostics": "1.0.0-beta5",
    "Microsoft.AspNet.Mvc": "6.0.0-beta5",
    "System.Runtime": "4.0.20-beta-23019"
  },
  "exclude": [
    "wwwroot",
    "node_modules",
    "bower_components"
  ],
  "frameworks": {
    "dnx451": {
      "frameworkAssemblies": {
        "System.Data": "4.0.0.0",
        "System.Data.DataSetExtensions": "4.0.0.0",
        "System.Data.Linq": "4.0.0.0"
      }
    }
  },
  "publishExclude": [
    "node_modules",
    "bower_components",
    "**.xproj",
    "**.user",
    "**.vspscc"
  ],
  "version": "1.0.0-*",
  "webroot": "wwwroot"
}

你可以移除aspnet50aspnetcore50,它们在beta3版本中被重命名为dnx/dnxcore并且现在已经没有用处了(除非它们与其他内容产生干扰,如果是这样,它们就是无用且有害的)。 - Karl-Johan Sjögren
去掉那两个后,错误列表减少到了450个,变得更好了! - KidCode
22个回答

278

删除 binobj 文件夹并重新构建。


19
谢谢,那个方法有效,我还需要卸载并重新加载这些项目。 - Manfred Wippel
1
救命稻草。我在 Docker 容器中遇到了这个问题。 - Francisco Cardoso
6
此外,我必须在之后清理并构建解决方案。 - alamoot
2
方便的脚本来删除 objbin 文件夹... ;) https://dev59.com/qnRA5IYBdhLWcg3w_DHF#755433 - Jess
仅删除OBJ文件夹对我有效。删除BIN文件夹也没有问题,但是当我尝试删除它时,出现了一个消息,说无法删除该文件夹,因为我正在运行该项目。我懒得关闭并重新启动Visual Studio,所以我就这样...不管它,我会忍受红色波浪线。令我惊讶的是,它们消失了。我现在可以编写没有红色波浪线的代码:D - c0d3p03t
多年过去了,删除 bin 和 object 文件夹的技巧仍然对我有用 - 谢谢。 - kdoerak

242

这浪费了我很多时间。关闭 Visual Studio。删除 .vs 文件夹并重新启动 Visual Studio。一切应该正常工作。

通常这种情况发生在您更改或合并分支时。


2
我在我的applicationhot.config文件中有一些我不想丢失的东西,所以我所做的就是关闭VS,删除.suo文件,然后重新启动VS,这对我也起了作用。 - East of Nowhere
8
类似的解决方法对我也起了作用——我删除了.vs目录下的DesignTimeBuild文件夹(符号缓存),而不是删除suo文件(那样会丢失解决方案级别的设置、断点等内容)。当然,我也删除了binobj目录。这个错误是在我手动将一个项目转换为新式的csproj格式并移除解决方案配置后出现的。参见https://dev59.com/9lUL5IYBdhLWcg3wb3pz。 - Mike Rosoft
2
请提及当删除该文件夹时可能会发生什么变化。 - NeWi-SL
4
我在2022年7月的“补丁星期二”之后遇到了这个问题,其中包括一个.NET更新。仅重新启动VS并没有帮助,但重命名.vs文件夹并重新启动VS解决了问题。 - Moby Duck
1
@MobyDuck 是的,我也在更新到17.2.6后遇到了这个问题。删除 .vs 文件夹解决了它。 - Vivelin
显示剩余6条评论

65

我在包管理器控制台上运行了dotnet restore命令,问题得到了解决。


尽管问题是缺少软件包,但该命令并没有帮助。实际上,我注意到有些东西阻止了PackageManager解析nuget.org源,并且它试图在没有所需框架的情况下构建(在我的情况下是Microsoft.Net.Test.Sdk和Microsoft.NETCore.UniversalWindowsPlatform)。为了解决这个问题,我不得不检查代理是否被禁用以及任何VPN连接,并从头开始重新创建测试项目,只有这样它才会自动安装所有必需的软件包。 - LaoR

14

我之前也遇到了同样的问题。我花了两天时间尝试解决这个问题。我尝试重新安装Visual Studio,清除它的缓存,卸载Visual Studio或重新设置Windows 10 => 但都没有成功。

你可以尝试按照以下步骤来解决:

  1. 关闭Visual Studio
  2. 在解决方案文件夹中删除packages文件夹
  3. 重新打开Visual Studio并重新构建解决方案

祝你好运!


3
重新启动 VS 就解决了我的问题,谢谢 :)。 - jamie

9
我刚刚以管理员身份打开了Visual Studio,它正常工作了!

3
尝试以管理员身份打开VS,它可以工作。关闭它...正常打开,仍然可以工作。不知道实际上改变了什么来修复它。 - seagulledge

9
我遇到了同样的问题(在VS2022中),试图删除binobj文件夹来解决它,但这没有起作用。
因此,我通过右键单击出现问题的项目并选择Load Entire Dependency Tree来强制重新加载依赖项,这为我解决了问题! Load Entire Dependency Tree

4

在我的情况下,我的项目仍然设置为使用beta版本的dnx进行构建。将它更改为使用我在其他项目中使用的版本进行构建,问题就得以解决。


3
在我的情况下,我按照以下步骤进行操作:
  1. 删除 bin 和 obj 并重新构建。(没有解决问题)
  2. 卸载项目。(结果出现“未找到项目.assets.json文件,请运行NuGet包还原”)
  3. 通过Visual Studio 2017 >> 工具 >> NuGet软件包管理器 >> 包管理器控制台运行 dotnet restore 命令。
  4. 重新构建解决方案。(问题解决了)

3
我猜测一下,您现在使用的是常规的System.Data.*工具来为dnx451提供支持,但是在dnxcore50中却没有任何补充。您是同时针对核心版进行开发还是只是项目创建时留下的东西?如果您想同时针对核心版进行开发并且仍然使用旧的System.Data.*工具,那么您需要像这样包装那些程序集中的任何内容。
#if DNX451
// Do some DNX451 specific stuff here
#endif

同样也可以反过来实现。
#if DNXCORE50
// Do some DNXCORE50 specific stuff here
#endif

但是,如果你还没有考虑支持它,我建议将dnxcore50从框架列表中删除,这样你的错误可能会消失。


它们只是项目创建的剩余物,已经删除了大部分错误,谢谢。还剩下10个!唯一的问题是错误仍然像上面描述的那样,即预定义类型'System.String'未定义或导入。 - KidCode
如果你已经移除了dnxcore50,那么这些错误就不应该存在了,因为它们是简单的内置类型。在dnxcore中,你可能需要导入它们(但是一旦你添加了其他包,你会隐式地得到引用,所以通常情况下你不需要手动添加)。你正在运行VS 2015 RC(Release Candidate),还是仍在使用其中一个beta版本? - Karl-Johan Sjögren
我更新了我的问题,展示了你的更新后文件的状态。我还在运行VS2015 RC。 - KidCode
你的错误列表中应该有一个“项目”列,它对于当前的错误显示了什么?它应该会提示是dnx451还是dnxcore错误。如果你看不到它,可以通过在列表上右键单击并在“显示列”下选择它来启用它。 - Karl-Johan Sjögren
2
啊,移除DNXCORE50将错误列表减少到了十个,重新启动后又将其减少到4个。然后移除我之前添加的System.Runtime引用,所有的错误都被消除了...谢谢! - KidCode
1
很高兴听到这个消息。正如我先前所说,System.Runtime几乎总是会随着另一个程序集一起被包含进去,所以除非你正在编写一些非常基础的东西(例如甚至不包括Console.WriteLine),否则你不需要自己来包含它。这可能是需要记住的事情 :) - Karl-Johan Sjögren

2
花了将近两天的时间才修复。尝试了多次VS卸载/重新安装,但没有用。最终成功的方法是...运行VS安装程序进行修复。由于出现了错误,我不得不手动卸载所有实例的MS .NET Core SDK - 2.1xxx。再次运行VS安装程序进行修复,没有出现错误。删除bin、obj并重新构建。在包管理器控制台上运行dotnet restore命令,问题解决了。

在这里列出的解决方案中,唯一有效的方法是进行VS Installer修复。由于显而易见的原因(需要很长时间并撤消所有自定义设置),我一直在避免这样做。但如果我一开始就这样做了,那么就可以节省我尝试所有无效方法的时间。我不需要卸载SDK 2.1xxx,但在修复过程中收到了有关2.1xxx的错误提示(如果您没有卸载2.1xxx,则几乎可以预期会出现有关2.1的错误,这个问题已经向Microsoft报告了成千上万次)。 - unbob

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