我正在努力理解所有这些框架如何交互和相互依赖:.NET Core、.NET Framework、ASP.NET Core、MVC 等。
This discussion 让我相信我的 MVC 应用程序使用 ASP.NET Core 和 .NET Framework,而不是 .NET Core。如果这是真的,我可以在没有 .NET Core 运行时的情况下运行 MVC 应用程序吗?如果不是,为什么这个应用仍然依赖于 .NET Core 运行时?
我的尝试
我在 Visual Studio 2017 中创建了一个新项目,如下所示:
我发布的应用如下:
dotnet publish --self-contained false
(防止包含运行时)该应用程序此时无法运行。我收到了错误代码为 500.19
的 0x8007000d
。我通过安装 Hosting Bundle 让它工作。我手动删除了一些随托管包安装的东西,发现需要“Microsoft .NET Core 2.1.28 - Windows Server Hosting”。我不知道那到底是什么,但我觉得这里好像涉及到 .NET Core 运行时。
更新
当我安装 Hosting Bundle 时,我看到安装了一些重要的东西:
C:\Program Files\dotnet\dotnet.exe
C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All\
C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\
当我卸载 .NET Core Runtime 时,我只剩下以下内容:
C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All\
C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\
此时该应用程序仍然有效。我假设剩下的是 ASP.NET Core 运行时,它与 .NET Core 运行时不同。我只是想确认此应用程序仅依赖于 ASP.NET Core 运行时和 .NET Framework,而完全不依赖于 .NET Core。
答案 0 :(得分:0)
我们有一个系统,有CPU、内存、磁盘、网卡、IO设备等,我们需要一个软件来为我们管理这些资源,让我们使用这个系统。该软件是内核。 (比如 Linux)
既然我们可以控制硬件,我们需要在它之上进行抽象以供用户日常使用。我们需要 shell、窗口系统、不同类型的服务和守护进程。我们称这整个包为操作系统。 (比如 Ubuntu)
现在我们可以愉快地使用我们的计算机了,我们想为我们的问题或其他人的问题编写我们自己的应用程序。操作系统为我们提供了一种编程语言以及一个函数库和系统调用,我们可以使用它们来创建软件,就像操作系统本身使用它们一样。 (比如 C 和 glibc
)
突然我们意识到我们的软件不能移植到其他操作系统,而且它有很多复杂的样板代码。所以我们创建了一种新的编程语言并提供了一组新的库函数,但这次更容易阅读和理解。 (比如 C# 和 .NET 5 SDK)
但是我们遇到了问题。我们的操作系统无法理解这种新语言。所以我们需要在我们的语言和操作系统之间有一个层。这个软件必须读取我们的程序并以某种方式为操作系统翻译它。这个程序是运行时。 (比如 .NET 5 运行时)
好的,让我们回顾一下。我们使用 C# 和 .NET 创建了一个应用程序。这会产生一个使用 IL 语言的程序。操作系统不理解 IL 语言,因此我们需要 .NET 运行时来读取我们的 IL 应用程序并将其翻译为操作系统。但是我们如何设置它?
我们有两个选择:
我们在每个需要运行我们的应用程序的系统上安装 .NET 运行时;这样我们的应用就变得可移植了,但它需要运行时才能工作。
我们在应用程序中包含运行时代码;这样我们的应用就不需要运行时,但它不再是可移植的,因为它携带运行时它会更大。
现在来消除您的一些困惑:
.NET Framework 仅在 Windows 上运行,并且有更多的库可供使用。
.NET Core 是跨平台的,使用的库较少,但速度非常快。现在它的名称是 .NET 5,并且添加了那些额外的仅限 Windows 的库。
SDK 为您提供了构建应用所需的工具(SDK 还包括运行时)。
运行时间更轻,只运行您的应用程序。
.NET Core 运行时(现在是 .NET 5 运行时)只能运行您的控制台应用程序并且更轻。
ASP.NET Core 运行时可以运行您的 Web 应用程序。
还有用于运行 WinForms 和 WPF 应用程序(仅限 Windows)的 GUI 应用程序的运行时。
模型-视图-控制器是一种设计模式,与特定的语言或框架无关。