无法在.NET Core中编译Environment.Exit

7

相关链接:.NET Core 中的 System.Environment

我正在尝试编译一个使用 Environment.Exit 的 .NET Core 程序。我使用了 yo aspnet 创建了默认的控制台应用程序,安装了 System.Runtime.Extensions,然后添加了对 Environment.Exit(1) 的调用(完整示例在github 上)。在运行 dnu build 时,我收到以下错误:

C:\git\environmentexit\ConsoleApplication\Program.cs(13,25): DNXCore,Version=v5.0 error CS0117: 'Environment' does not contain a definition for 'Exit'

据我所知,这个 corefx pull request 应该意味着 Environment.Exit 已经被公开,所以我无法弄清楚还缺少什么。

有什么想法吗?


那个拉取请求很新,很不可能被整合到5.0中。除了跟上快速变化的步伐外,你可以使用FailFast()代替。 - Hans Passant
@HansPassant 有没有关于目前可用内容的参考资料?我找到了http://dotnet.github.io/api/System.Environment.html(经过大量搜索),但那里只列出了`Environment.Exit`。是的,我现在正在使用`FailFast`,但它看起来像是崩溃,所以并不理想。 - nyctef
它是开源的,源代码就是参考。我使用Reflector来查看参考程序集,效果不错。这可能会被整合到MSDN中,但必须先稳定下来。现在它变化得太快了,无法实现这个目标。 - Hans Passant
我可以确认在1.0.0-rc1-update1中确实不存在Environment.Exit,但它确实存在于当前最新版本中。如果您想要,我可以发布答案,其中我将逐步描述如何安装和编译您的演示项目,使用最新的夜间构建(今天是1.0.0-rc2-16343),以及如何返回到当前最后稳定的1.0.0-rc1-update1 - Oleg
@Oleg 我认为那可能会是答案。我仍然很好奇为什么它不在rc1中(根据存储库中的源代码,它似乎存在 - 请参见Lex的回答中的评论),但听起来使用夜间版本现在可以解决它,这对其他人可能是有用的信息。 - nyctef
1个回答

14

首先,我想确认问题存在于当前稳定版本的DNX中:1.0.0-rc1-update1,该版本与Visual Studio 2015 Update 1一起安装。问题已经在当前不稳定的构建版本1.0.0-rc2-16343中得到解决。

我将尽可能详细地描述如何逐步重现该问题。在下一步中,我将展示如何安装最新的不稳定版本的DNX(今天是1.0.0-rc2-16343),并成功编译您的演示。最后,我将展示如何卸载不稳定版本的DNX并返回1.0.0-rc1-update1

首先,重要的是要了解可以安装多个版本的DNX。另一方面,在项目上下文菜单中使用“还原软件包”或使用“dnu restore”命令解析的所有软件包都将保存(缓存)在公共文件夹%USERPROFILE%\.dnx\packages中。依赖项将从NuGet解析。确切地说,有一个文件%APPDAT%\NuGet\NuGet.Config,其中包含用于解析依赖项的URL的NuGet配置。因此,使用不同的NuGet配置和不同版本的DNX可能会导致错误的结果。我认为这是DNX今天的一个重大设计问题。我希望很快能得到修复。

无论如何,我强烈建议删除%USERPROFILE%\.dnx\packages中的所有文件,以获得确定性结果。此外,还应验证NuGet配置,只从标准NuGet源https://api.nuget.org/v3/index.json(或https://www.myget.org/F/aspnetvnext/api/v2/)加载文件,并可选地https://www.myget.org/F/aspnetvnext/api/v3/index.json(或https://www.myget.org/F/aspnetmaster/api/v2)加载文件,其中可以包含其他ASP.NET稳定软件包。可以手动编辑文件%APPDAT%\NuGet\NuGet.Config,或在Visual Studio中通过菜单“工具”/“NuGet软件包管理器”/“软件包管理器设置”选择“软件包源”来检查上述描述的源。

1) 我删除了 %USERPROFILE%\.dnx\packages下的所有文件。

2) 使用“dnvm list”验证我只有DNX的1.0.0-rc1-final1.0.0-rc1-update1版本。我使用类似于“dnvm uninstall 1.0.0-rc2-16343 -r coreclr -arch x86”这样的命令卸载一些不需要的版本,并使用“dnvm upgrade”验证1.0.0-rc1-update1是默认版本。之后,“dnvm list”显示:

enter image description here

3) 在我的初始配置中仅设置了https://api.nuget.org/v3/index.json

enter image description here

在使用Program.cs构建您的演示程序之后。

using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Goodbye, cruel world");
            Environment.Exit(1);
        }
    }
}

以及 project.json

{
  "version": "1.0.0-*",
  "description": "ConsoleApplication Console Application",
  "authors": [
    ""
  ],
  "tags": [
    ""
  ],
  "projectUrl": "",
  "licenseUrl": "",
  "tooling": {
    "defaultNamespace": "ConsoleApplication"
  },
  "commands": {
    "ConsoleApplication": "ConsoleApplication"
  },
  "dependencies": { },
  "frameworks": {
    "dnx451": { },
    "dnxcore50": {
      "dependencies": {
        "System.Console": "4.0.0-*",
        "System.Runtime": "4.0.21-*",
        "System.Runtime.Extensions": "4.0.11-*"
      }
    }
  }
}

我解决了以下依赖关系

输入图片说明

以及错误消息

输入图片说明


现在我使用最新的不稳定版DNX进行安装。

dnvm upgrade -u -r coreclr -arch x64
dnvm upgrade -u -r clr -arch x64
dnvm upgrade -u -r coreclr
dnvm upgrade -u -r clr

运行命令"dnvm list"将显示:

图片描述

接下来,我修改了NuGet配置,额外使用了https://www.myget.org/F/aspnetvnext/api/v3/index.json

图片描述

然后在Visual Studio的GUI中将global.jsonsdk.verison"1.0.0-rc1-update1"修改为"1.0.0-rc2-16343"

图片描述

并保存更改。然后我执行了"还原包"并重新构建了项目。我得到了以下依赖项版本:

图片描述

该程序可以无错误地执行。

非常重要的一点是,即使我们将sdk.verison更改回"1.0.0-rc1-update1",我们仍将从rc2-16343中使用缓存的软件包分辨率,因为它将使用%USERPROFILE%\.dnx\packages中的软件包。真的很重要,将NuGet配置更改回原始状态(取消选中URL https://www.myget.org/F/aspnetvnext/api/v3/index.json)并删除所有%USERPROFILE%\.dnx\packages。我建议您使用以下命令卸载不需要的DNX夜间构建:

dnvm upgrade
dnvm uninstall 1.0.0-rc2-16343 -r coreclr -arch x64
dnvm uninstall 1.0.0-rc2-16343 -r clr -arch x64
dnvm uninstall 1.0.0-rc2-16343 -r coreclr
dnvm uninstall 1.0.0-rc2-16343 -r clr

完成所有步骤后,"dnvm list" 显示的状态应该与最初相同。可以验证 %USERPROFILE%\.dnx\runtimes 中不包含任何带有 1.0.0-rc2-16343 的目录,文件 %USERPROFILE%\.dnx\alias\default.txt 包含 dnx-clr-win-x86.1.0.0-rc1-update1,PATH 仅包含 %USERPROFILE%\.dnx\runtimes\dnx-clr-win-x86.1.0.0-rc1-update1\bin,且没有引用 1.0.0-rc2-16343。换句话说,我们已完成测试,并回到稳定的 rc1-update1。


1
哇,这是一个非常好的回答!感谢您提供的所有细节 :) - nyctef

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