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

Can't compile Environment.Exit in .NET Core

相关:

我正在尝试编译一个在 .NET Core 中使用 Environment.Exit 的程序。我使用 yo aspnet 创建默认控制台应用程序,安装 System.Runtime.Extensions 然后添加对 Environment.Exit(1) 的调用(完整示例 on 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'

据我所知,this corefx pull request 应该意味着 Environment.Exit 暴露了,所以我不知道我还缺少什么。

有什么想法吗?

首先我想确认问题存在于当前稳定版本的DNX:1.0.0-rc1-update1与Visual Studio 2015 Update 1一起安装。问题是已经已在当前不稳定版本 1.0.0-rc2-16343 中修复

下面我尽量详细的描述一下大家是如何一步步重现问题的。在下一步中,我将展示如何安装最新的 unstable 版本的 DNX(今天是 1.0.0-rc2-16343)并成功编译演示.最后我展示了如何卸载 DNX 的 unstable build 回到 1.0.0-rc1-update1.

首先,重要的是要了解可以安装 多个 版本的 DNX。另一方面,在项目上下文菜单中使用 "Restore Packages" 或使用 "dnu restore" 命令解析的所有包都将保存(缓存)在 公共文件夹 %USERPROFILE%\.dnx\packages。将从 NuGet 解析依赖项。确切地说,文件 %APPDAT%\NuGet\NuGet.Config 包含 NuGet 的配置,其中 URLs 用于解析依赖项。因此,在 "playing" 之后,使用不同的 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 中检查上述来源:"Tools" / "NuGet Package Manager" / "Package Manager Settings" 并选择 "Package Sources"终于。

1) 我删除了 %USERPROFILE%\.dnx\packages 下的所有文件 2) 使用 "dnvm list" 验证我只有 1.0.0-rc1-final1.0.0-rc1-update1 版本的 DNX。我使用 "dnvm uninstall 1.0.0-rc2-16343 -r coreclr -arch x86" 之类的东西卸载了一些不需要的版本,并验证了 1.0.0-rc1-update1 是默认使用 "dnvm upgrade"。之后 "dnvm list" 显示:

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

使用 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":

并保存更改。之后我做了 "Restore Packages" 并再次构建项目。我得到以下版本的依赖项:

并且程序可以执行 没有任何错误

值得一提的是,即使我们将 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。