ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述

为了方便演示,以 .NET Core 控制台应用程序讲解.

我们新建一个控制台应用程序,安装 "Newtonsoft.Json" Nuget 包,然后右键点击该项目,选择"发布":

我们依次选择"文件",设置好路径,最后点击创建配置文件,界面变成了下面这样:

然后我们点击"配置"

那么,问题来了."部署模式" 里面有两个选项:

1.当选择框架依赖时,"目标运行时"有:"可移植","win-x86","win-x64","osx-64","linux-x64" 5个选项.

2.当选择"独立"时,"目标运行时"没有"可移植"这个选项.

我们到底应该怎么选择?

不要做思想的巨人,行动的矮子!

没事儿走两步!

依赖框架的部署 (FDD) : "框架依赖" + "可移植"

以这种方法发布后,进入发布的文件夹发现,居然只有5个文件 !

1个应用程序的程序集,1个pdb,2个json,1个第三方依赖项.

咦?怎么没有.EXE 文件?没有 .exe 文件,我怎么运行该项目?(其实,进入到该项目的debug文件夹,你会发现也没有.exe文件)

这样运行:(为了方便,我通过 VS Code 进入该文件夹)

现在,我们回过头来看官方对这种方式的解释:

依赖框架的部署 (FDD) : 顾名思义,依赖目标系统上存在的共享系统级版本的 .NET Core.由于已存在 .NET Core,因此应用在 .NET Core 安装程序间也是可移植的.应用仅包含其自己的代码和任何位于 .NET Core 库外的第三方依赖项.FDD 包含可通过在命令行中使用 dotnet 实用程序启动的 .dll 文件。 例如,dotnet app.dll 就可以运行一个名为 app 的应用程序.

结合我们的实际操作,大概就是这几个意思:

1.FDD 只会部署应用程序和第三方依赖项,也就是发布生成的这4个文件: MyConsole.dll ,MyConsole.pdb , 应用程序配置文件 MyConsole.deps.json,以及第三方依赖项 Newtonsoft.json.dll .

2.名字既然叫"依赖框架",那依赖的系统肯定必须要有框架才行!也就是说,应用程序将要部署到的目标系统上,必须要有 .NET Core ;

3.应用程序将使用目标系统上存在的 .NET Core 版本.这就是最后一个文件的意义.我们用记事本打开 MyConsole.runtimeconfig.json ,可以看出,该文件指明了我们需要依赖的.Net Core 的版本: "2.2.0"

{
  "runtimeOptions": {
    "tfm": "netcoreapp2.2",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "2.2.0"
    }
  }
}

FDD 也是 .NET Core 和 ASP.NET Core 应用程序的默认部署模型.该部署方式的优缺点如下:

优点:

  • 不需要提前定义 .NET Core 应用将在其上运行的目标操作系统。 因为无论什么操作系统,.NET Core 的可执行文件和库都是用通用的 PE 文件格式,因此,无论什么基础操作系统,.NET Core 都可执行应用。
  • 部署包很小。 只需部署应用及其依赖项,而无需部署 .NET Core 本身。
  • 除非重写,否则 FDD 将使用目标系统上安装的最新服务运行时。 这允许应用程序使用 .NET Core 运行时的最新修补版本。
  • 许多应用都可使用相同的 .NET Core 安装,从而降低了主机系统上磁盘空间和内存使用量。

缺点:

  • 只有目标系统上安装的 .NET Core 版本不低于应用程序要求的版本时,应用才能运行。
  • 如果不了解将来版本,.NET Core 运行时和库可能发生更改。 在极少数情况下,这可能会更改应用的行为。

官方的这个优缺点已经说得很详细了.其中,我对标红的这句缺点实验了一下,结果分享给大家:

首先,我们将 MyConsole.runtimeconfig.json 文件中的版本号修改成 "2.3.0":

{
  "runtimeOptions": {
    "tfm": "netcoreapp2.2",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "2.3.0"
    }
  }
}

接着,我们在命令行中输入 dotnet myconsole.dll 运行该项目:

运行失败!

错误信息大概意思如下:

第1句:没有找到任何可以兼容的 framework 版本.

第2句:没有找到指定的 2.3.0 版本的 framework "Microsoft .NETCore.App" .

最后一句:(该系统)只安装了 2.2.0 版本.

现在 ,我们将版本号修改成 2.1.0 试试看:

{
  "runtimeOptions": {
    "tfm": "netcoreapp2.2",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "2.1.0"
    }
  }
}

正常运行了:

有TMD 12点了.睡了.明天继续

原文地址:https://www.cnblogs.com/refuge/p/10247526.html

时间: 2024-10-20 14:05:06

ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述的相关文章

ASP.NET Core 2.2 基础知识(十六) SignalR 概述

原文:ASP.NET Core 2.2 基础知识(十六) SignalR 概述 我一直觉得学习的最好方法就是先让程序能够正常运行,才去学习他的原理,剖析他的细节. 就好像这个图: 所以,我们先跟着官方文档,创建一个 SignalR 应用: https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?view=aspnetcore-2.2&tabs=visual-studio 这个例子一共涉及到下面几个步骤: 自定义中心 ChatH

ASP.NET Core 2.2 基础知识(十二) 发送 HTTP 请求

可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例. 这能带来以下好处: 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例. 例如,可以注册 github 客户端,并将它配置为访问 GitHub. 可以注册一个默认客户端用于其他用途. 通过委托 HttpClient 中的处理程序整理出站中间件的概念,并提供适用于基于 Polly 的中间件的扩展来利用概念. 管理基础 HttpClientMessageHandler 实例的池和

ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)

要啥自行车,直接看手表 //返回基元类型 public string Get() { return "hello world"; } //返回复杂类型 public Person Get() { return new Person {Id = 1, Name = "refuge"}; } //控制器需要继承 Controller 类 public IActionResult Get() { return Ok("hello world"); }

ASP.NET Core 2.2 基础知识(十六) SignalR (未完待续)

我一直觉得学习的最好方法就是先让程序能够正常运行,才去学习他的原理,剖析他的细节. 就好像这个图: 所以,我们先跟着官方文档,创建一个 SignalR 应用: https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?view=aspnetcore-2.2&tabs=visual-studio 这个例子一共涉及到下面几个步骤: 自定义中心 ChatHub ; 在启动类 Startup 中启用 SignalR 服务,并添加路由;

ASP.NET Core 2.2 基础知识(二) 中间件

原文:ASP.NET Core 2.2 基础知识(二) 中间件 中间件是一种装配到应用管道以处理请求和相应的软件.每个软件都可以: 1.选择是否将请求传递到管道中的下一个组件; 2.可在调用管道中的下一个组件前后执行工作. 管道由 IApplicationBuilder 创建: 每个委托都可以在下一个委托前后执行操作,.此外,委托还可以决定不将请求传递给下一个委托,这就是对请求管道进行短路.通常需要短路,是因为这样可以避免不必要的工作.比如: 1.静态文件中间件可以返回静态文件请求并使管道的其余

ASP.NET Core 2.2 基础知识(一) 依赖注入

原文:ASP.NET Core 2.2 基础知识(一) 依赖注入 依赖: 类A用到了类B,我们就说类A依赖类B.如果一个类没有任何地方使用到,那这个类基本上可以删掉了. public class Test { private MyDependency md = new MyDependency(); public void Print() { md.Print(); } } public class MyDependency { public void Print() { Console.Wri

ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块

原文:ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块 ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET Core 随附两种服务器实现: Kestrel 是适用于 ASP.NET Core 的默认跨平台 HTTP 服务器. HTTP.sys 是仅适用于 Windows 的 HTTP 服务器,它基于 HTTP.sy

ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF)

原文:ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF) 先上一段代码,了解一下 .NET Core 配置数据的结构. 新建一个 控制台项目,添加一个文件 json.json ,文件内容如下: { "country": "cn", "person": { "id": 1, "address": { "addName": "chengdu"

ASP.NET Core 2.2 基础知识(五) 环境

原文:ASP.NET Core 2.2 基础知识(五) 环境 一.环境变量 系统启动时,会读取环境变量 ASPNETCORE_ENVIRONMENT ,并将该变量的值存储在 IHostingEnvironment.EnvironmentName 字段中.如: 新建一个 WebAPI 项目,修改 Configure 方法: public void Configure(IApplicationBuilder app, IHostingEnvironment env) { ...... { app.R