首先,我想确认问题存在于当前稳定版本的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-final
和1.0.0-rc1-update1
版本。我使用类似于“dnvm uninstall 1.0.0-rc2-16343 -r coreclr -arch x86”这样的命令卸载一些不需要的版本,并使用“dnvm upgrade”验证1.0.0-rc1-update1
是默认版本。之后,“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.json
的sdk.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.0.0-rc1-update1
中确实不存在Environment.Exit
,但它确实存在于当前最新版本中。如果您想要,我可以发布答案,其中我将逐步描述如何安装和编译您的演示项目,使用最新的夜间构建(今天是1.0.0-rc2-16343
),以及如何返回到当前最后稳定的1.0.0-rc1-update1
。 - Oleg