【问题标题】:What is a vNext console application?什么是 vNext 控制台应用程序?
【发布时间】:2015-06-16 00:35:58
【问题描述】:

我安装了 Visual Studio 2015 RC 来试用 ASP.Net vNext 模板。在“Web”部分,我注意到一个控制台应用程序显示为

我决定搞砸它,我发现了一些有趣的点:

  • 默认模板未将Main() 指定为static
  • System.CodeDomSystem.Net 等许多程序集不可用。
  • System.Console.ReadKey等很多方法都无法使用。

这些 vNext 控制台应用程序是什么?为什么会有这些限制,它们的用途是什么?

【问题讨论】:

  • 这是一篇精彩的文章:msdn.microsoft.com/en-us/magazine/dn913182.aspx
  • 微软在命名和版本控制方面很糟糕。 DNX 比 ASP.NET 大。可以创建针对 DNX(以及间接一个或多个受支持的框架)的应用程序或库。该应用程序或库可能与 ASP.NET 无关。在 C# 下拥有模板控制台应用程序 (DNX) 和类库 (DNX) 会更有意义。如果您仍然想知道为什么这些项目模板在 ASP.NET 下,请查看第一句话。在 RC 之前,该模板被命名为更糟糕的“ASP.NET 5 控制台应用程序”。

标签: c# asp.net-core


【解决方案1】:

答案

什么是 vNext 控制台应用程序?

这是一个在新的 .NET 运行时环境 (DNX) 中运行的控制台应用程序。

为什么会有这些限制以及它们的用途是什么?

出现这些限制是因为您的目标是 .NET Core (dnxcore50) 而不是(或除此之外)完整的 .NET Framework (dnx451)。据我所知,这些限制的使用是允许与许多不同的操作系统交叉兼容。也就是说,.NET Core 的功能比完整框架少,因为这样更容易与许多系统兼容。随着时间的推移,这些限制可能会随着完全跨平台的增加而消失。

默认模板没有将 Main() 指定为静态。

DNX 附带Microsoft.Framework.ApplicationHost。这个默认的应用程序宿主“知道如何找到public void Main 方法。这是用于设置ASP.NET 托管层的入口点……”它还知道如何找到传统的static void Main 方法。实例Main 方法的一个优点是它允许我们要求运行时环境将服务注入到我们的应用程序中。

System.CodeDom 和 System.Net 等许多程序集不可用。 System.Console.ReadKey等很多方法都无法使用。

System.Console.ReadKeydnx451 中可用,但在dnxcore50 中不可用。我上次检查时System.Net 也是如此。因此,如果您想使用这些,请确保定位到 dnx451 而不是 dnxcore50

想要取消限制?只需从您的project.json 文件中删除dnxcore50 条目即可。那么您将只针对完整的框架而没有限制。

另见

https://msdn.microsoft.com/en-us/magazine/dn913182.aspx

'Console' does not contain a definition for 'ReadKey' in asp.net 5 console App

Using System.Net.Mail in ASP NET MVC 6 project

【讨论】:

    【解决方案2】:

    这些控制台应用程序正在利用新的.NET execution environment(DNX,以前的 KRE)。它包括一个新的项目系统,并允许您定位different versions of the CLR

    其中一个版本是 CoreCLR,它是 .NET 的精简版本。这个版本是模块化的,它的libraries 是作为一堆 NuGet 包分发的。以 .NET Core 为目标时,您可能需要包含一些额外的包(project.json 文件中的依赖项部分)。

    尽管如此,某些限制可能源于并非所有 API 都已迁移到 .NET Core 的事实,或者因为 API 表面在 .NET Core 上更小,因此它们不会迁移。

    p>

    【讨论】:

      【解决方案3】:

      我正在慢慢体验新的运行时,并将使用相关参考更新这篇文章。

      Microsoft.Framework.Runtime.Sources.EntryPointExecutor->TryGetEntryPoint() 有一段代码正在挑选 Program 类及其 Main 函数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-31
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 1970-01-01
        • 2016-11-16
        • 1970-01-01
        • 2012-05-04
        相关资源
        最近更新 更多