在 ASP.NET 5 的 Visual Studio Online 构建过程中,预定义类型 'System.Void' 未被定义或导入。

26

当我尝试在Visual Studio Online构建项目时,出现了这个错误:

…\Frontend\Startup.cs(65,49): Error CS0518: Predefined type 'System.Void' is not defined or imported
…\Frontend\Startup.cs(65,49): DNXCore,Version=v5.0 error CS0518: Predefined type 'System.Void' is not defined or imported [C:\a\1\s\Frontend\src\Frontend\Frontend.xproj]

看起来错误发生在我引用另一个库(包类库)的地方。

附言:我曾在这里进行过一些讨论:Easy way to build and deploy (to Azure) ASP.NET 5 in Visual Studio Team Services,但最终没有答案,所以我仍然无法构建它...

Web project.json:

"dependencies": {
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
    "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
    "Web.Common": "1.0.0-*"
},

"frameworks": {
    "dnx451": { },
    "dnxcore50": { }
},

库项目 project.json

"frameworks": {
    "dnx451": { },
    "dnxcore50": {
        "dependencies": {
            "Microsoft.CSharp": "4.0.1-beta-23516",
            "System.Collections": "4.0.11-beta-23516",
            "System.Linq": "4.0.1-beta-23516",
            "System.Runtime": "4.0.21-beta-23516",
            "System.Threading": "4.0.11-beta-23516"
      }
    }
  },
"dependencies": {
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final"
  }

更新(问题和解决方案):

问题在于我的库引用不在同一个文件夹中,而且脚本默认情况下不会在那里运行dnu-restore,所以我必须向上走一级,并开始在那里递归查找project.json。

$SourceRoot = Split-Path -Path $PSScriptRoot -Parent

# run DNU restore on all project.json files in the src folder including 2>1 to redirect stderr to stdout for badly behaved tools
Get-ChildItem -Path $SourceRoot -Filter project.json -Recurse | ForEach-Object { & dnu restore $_.FullName 2>1 }

感谢Eddie - MSFT的帮助!


1
我认为你缺少了“System.Runtime”包的依赖。 - Pawel
我应该将这个依赖项放在哪里?它不是Web项目中project.json的默认设置,它存在于coreclr中,但在库中不存在clr。顺便说一下,所有东西在VS中都可以本地构建。 - Ilya Chernomordik
你能分享一下 project.json 文件中的 "dependencies" 和 "frameworks" 部分吗? - Eddie Chen - MSFT
我已将其添加到帖子中,我已更改库的目标框架以匹配Web框架,因为R#问题(否则它无法找到它们),但我尝试将其改回来并没有帮助。我猜想这些Web目标应该能够正常工作,因为据我所知,它们只是更加严格。 - Ilya Chernomordik
16个回答

24

重新启动 Visual Studio,它会解决这个问题。这在我的情况下有效。


1
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Yan Sklyarenko
4
说句实话,@YanSklyarenko 给了我重启 VS 的想法,我的“system.void 未定义”错误消失了。所以,谢谢你,Jean BIDI。 - PTansey
@YanSklyarenko - 对我来说也是个很好的答案。 - sdbbs

17

在我的问题中,我重新构建了整个解决方案,错误就消失了。

编辑:

这很可能是由于NuGet package的恢复导致的。


公平地说,我刚才也遇到了同样的问题(唯一的区别是我在使用 Visual Studio 桌面版),重建整个解决方案确实修复了这个“错误”。这个建议某种程度上有道理... 我担心这个问题只是由于 VS 对“错误缓存”存在一些 bug 引起的。 - SPArcheon
12
对我而言,执行清理、重建操作,然后重启Visual Studio有效。 - Martin Staufcik
我还需要更新一些NuGet包来解决这个问题。 - Tigerware

9

在终端中简单运行dotnet restore即可解决该问题。


1
简单而有用的解决方案! - Vanderwood
对我来说起作用了。但我仍然不确定问题出在哪里。 - undefined

8

根据我的经验,删除bin和obj文件夹有助于解决问题。如果bin和obj文件夹被锁定,请尝试关闭Visual Studio。但是,对于我的同事来说,他删除了整个解决方案文件夹,并从TFS获取了最新版本。然后重新编译和构建解决方案,这种方法也有效。


1
那对我在Visual Studio 2022方面有所帮助。 - RalfP

4

我在升级VS2022后遇到了这个问题,我的解决方案是:

  1. 关闭Visual Studio
  2. 删除.vs文件夹
  3. 重新启动Visual Studio
  4. 从.sln文件启动项目

这样应该能够正常工作。


4

我在一个包含多个 .NET Core 6 库的 Asp.NET Core 6 解决方案中遇到了这个问题。

重启 VS 2022 并没有解决这个问题。

是什么解决了这个问题?删除主项目的 Bin 和 Obj 目录下的内容,然后重新启动 Visual Studio。


删除文件夹并没有解决问题。 - Emanuele
对我来说确实有效。根据这里的答案范围,我怀疑可能有几个不同的根本原因会导致相同的错误。因此,如果删除Bin和Obj文件夹的内容无法解决问题,那么也许其他解决方案对您有用。 - RonC
对我来说工作!我的问题发生在VS 2022更新之后。 - undefined

2
请删除 bin 和 obj 文件夹并重新构建。

2

我刚更新了“PreBuild.ps1”脚本中的代码,只为 Web 项目恢复“project.json”文件,然后就出现了这个问题。

原始代码(构建成功):

Get-ChildItem -Path $PSScriptRoot\src -Filter project.json -Recurse | ForEach-Object { & dnu restore $_.FullName 2>1 }

更新的代码(构建失败:预定义类型'System.Void'未定义或导入):

Get-ChildItem -Path $PSScriptRoot\src\WebProjectName -Filter project.json -Recurse | ForEach-Object { & dnu restore $_.FullName 2>1 }

因此,您需要检查 PreBuild.ps1 脚本和构建日志以检查 PowerShell 步骤,以确定 Web 项目和 Library 项目的 project.json 文件是否都已还原。


很抱歉,我在 Prebuild.ps1 中有完整的 \src:Get-ChildItem -Path $PSScriptRoot\src -Filter project.json -Recurse | ForEach-Object { & dnu restore $_.FullName 2>1 }。 - Ilya Chernomordik
@IlyaChernomordik 是的。默认情况下,Web 项目和库项目都放置在“src”文件夹下。因此,PreBuild.ps1 脚本默认可以为它们恢复 project.json。如果库项目放置在其他位置,则该脚本不会默认恢复 project.json 文件。 - Eddie Chen - MSFT
我想那就是问题所在了...关于如何做这件事的手册并没有提及这些细节...我把它放在一个公共文件夹中,因为这是一个将在不同解决方案之间重复使用的库,所以不太正确...在日志中,我有这样的记录:"恢复包 C:\a\1\s\Frontend\src\Frontend\project.json",但对于另一个包则没有,我想我得稍微修改一下脚本。 - Ilya Chernomordik
真的很奇怪,这个dnu restore不能正确地处理引用,你必须自己考虑...就像在旧版本中,你只需要引用一个项目,然后如果你的项目依赖于它,它就会被构建。 - Ilya Chernomordik
非常感谢您的帮助!这解决了空问题,因此构建通过了,但是在预发布步骤中使用npm时出现了许多错误:( - Ilya Chernomordik
显示剩余2条评论

1

更新 NuGet 包对我解决了这个问题。 项目 > 管理 NuGet 包 > 更新 > 更新全部


0

我想分享一下我对这个错误/问题的经验。

就我而言,我不得不从项目json中删除“System.Xml.XDocument”:“4.0.10”来解决这个问题。


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