.Net Core 跨平台:一个简单程序的多平台(windows、Linux、osx)发布

.Net Core 3.0 已于2019年9月23日发布了,包含了一些新特性,具体参见Announcing .NET Core 3.0

.NET Core是一个跨平台,高性能,开放源代码框架,用于构建现代的,基于云的,Internet连接的应用程序框架,其具有一下优点和特点:

跨平台:.NET Framework应用程序仅在Windows平台上运行,而.NET Core应用程序可以在Windows平台上开发并跨Windows,macOS或Linux等不同平台运行。 ASP.NET 4.x应用程序只能托管在IIS上,而ASP.NET Core应用程序可以托管在IIS,Apache,Docker或您自己的进程中的自托管中。 从开发的角度来看,可以使用Visual Studio或Visual Studio Code来构建.NET Core应用程序。 您还可以使用第三方编辑器,例如Sublime。

为MVC和Web API统一编程模型:通过ASP.NET Core,我们使用相同的统一编程模型来创建MVC样式的Web应用程序和ASP.NET Web API。 在这两种情况下,我们创建的Controller都从相同的Controller基类继承,并返回IActionResult。 顾名思义,IActionResult是一个接口,它具有多种实现。 ViewResult和JsonResult只是实现IActionResult接口的内置结果类型的两个示例。 因此,对于Web API,控制器返回JsonResult,对于MVC风格的Web应用程序,控制器返回ViewResult。 他们的本质是一样的,控制器返回的ViewResult可以认为是Content-Type不同而已。MVC和Web API的一些命名空间也合并了。

内置依赖注入:.NET Core内置依赖注入。.NET Core 跨平台只是一个目的之一,其框架重写了,后续你会发现很多组件、第三方库的使用都是通过依赖注入的。官方教程实例也基本是依赖注入贯穿全文。

易于测试:通过内置的依赖项注入和用于创建Web应用程序和Web API的统一编程模型,可以轻松进行ASP.NET Core应用程序的单元测试。

开源:.NET Core是完全开源的,并且由.NET团队与广大的开源开发者社区合作积极开发。 因此,随着ASP.NET核心背后的广大社区正在提出改进它并帮助修复错误和问题的方法,它不断发展。 这意味着我们拥有更安全,质量更高的软件。Github地址:https://github.com/dotnet/core

模块化HTTP请求管道:ASP.NET Core通过中间件组件提供模块化。 在ASP.NET Core中,我们使用中间件组件来组成请求和响应管道。 它包括一组丰富的内置中间件组件。 我们还可以编写我们自己的自定义中间件组件。 在学习本课程的过程中,我们将讨论什么是中间件组件,并使用它们来构成请求和响应管道。

下面来以一个简单的Hello World应用程序发布到windows、Linux、osx三个平台作为实例。

开发环境可以选择windows或者osx,为了演示在没有安装.net core环境的osx下运行.net core应用程序,osx我先不安装visual studio.

Windows 环境使用Visual Studio 2019 ,下载地址https://visualstudio.microsoft.com/zh-hans/

OSX 环境使用Visual Studio for Mac,下载地址:https://visualstudio.microsoft.com/zh-hans/vs/mac/

新建控制台应用(.NET Core),如下图所示:

项目模板自动生成一个Hello World控制台程序,为了演示多平台,将代码稍作修改:

在解决方案的项目上右键菜单选择发布:

配置说明:

部署模式分为独立部署和框架依赖,独立部署可以在目标平台没有安装.netcore环境下运行;框架依赖需要在目标平台安装.netcore运行环境,而且要考虑版本问题。

目标运行时即发布平台,win-x86、win-x64、win-arm、Linux -86、Linux-x64、osx-x64等

这里要分别发布三个平台,分别建立三个目标平台对应的配置:

编辑HelloConsoleApp.csproj工程文件:

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>

<OutputType>Exe</OutputType>

<TargetFramework>netcoreapp3.0</TargetFramework>

<PublishTrimmed>true</PublishTrimmed>

<PublishReadyToRun>false</PublishReadyToRun>

<PublishSingleFile>true</PublishSingleFile>

<RuntimeIdentifier>win-x64</RuntimeIdentifier>

</PropertyGroup>

</Project>

选中对应的配置文件,依次发布,发布目录如下

先看Windows的

可以看到,发布后一个单独的可执行文件,25.8M !

遥想N年前,很多人就想:

  1. 如何把.net程序打包到没有安装.net运行环境的Windows运行?
  2. 如何把依赖的一堆dll打包成一个可执行文件?

现在,这些问题统统已经解决,不但如此,还能同一份代码发布到Linux、OSX等其它OS运行!

上图,Window下:

Linux 发布目录也是一个可以独立运行的可执行程序:

将其放到Linux系统运行:

输出系统版本为Unix 4.15.0.29

Osx 环境下:

运行:

Osx 上面并没有安装.netcore

目标平台无需安装.netcore运行环境。

至此,一个简单的.netcore跨平台程序发布示例完成。

.Net Core 跨平台:一个简单程序的多平台(windows、Linux、osx)发布的更多相关文章

  1. 给 asp.net core 写一个简单的健康检查

    给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...

  2. asp.net core 实现一个简单的仓储

    一直有自己写个框架的想法,但是一直没有行动起来,最近比较闲,正好可以开工了. 现在已经完成了两部分.1.一个简单仓储,实现使用的是ef 2.IOC部分,这里是把内置的ioc替换成了aotofac,这部 ...

  3. 第四章 .net core做一个简单的登录

    项目目标部署环境:CentOS 7+ 项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx 开源地址:https ...

  4. Dart:2.通过一个简单程序来理解Dart基础语法

    一 . 一个简单的 Dart 程序 // 这是程序执行的入口. main() { var number = 42; // 定义并初始化一个变量. printNumber(number); // 调用一 ...

  5. 分享一个简单程序(webApi+castle+Automapper+Ef+angular)

    前段时间在周末给朋友做了一个小程序,用来记录他们单位的一些调度信息(免费,无版权问题).把代码分享出来.整个程序没有做任何架构.但是麻雀虽小,用到的技术也没少.WebApi+Castle+AutoMa ...

  6. 在ASP.NET Core中通过EF Core实现一个简单的全局过滤查询

    前言 不知道大家是否和我有同样的问题: 一般在数据库的设计阶段,会制定一些默认的规则,其中有一条硬性规定就是一定不要对任何表中的数据执行delete硬删除操作,因为每条数据对我们来说都是有用的,并且是 ...

  7. C语言学习_一个简单程序的解释与C学习方法概括

    简单计算器程序示例: # include <stdio.h> //1.头文件 //2.加法函数 int add(int a,int b)//3.函数定义方式 { //4.函数体 retur ...

  8. asp.net core下一个简单的分页技术

    在做web应用的时候免不了要对数据进行分页,我最近在做asp.net core的开发的时候就遇到了这个需求,现在简单的记录一下: public class PaginatedList<T> ...

  9. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

随机推荐

  1. 数组的方法 forEach filter map slice splice

    目前一些数组的实用的方法 1 arr.splice(i,n) 删除从i(索引值)开始之后的那个元素.返回值是删除的元素,改变原数组: 参数: i 索引值      n 个数 let arr = [1, ...

  2. Leetcode之二分法专题-875. 爱吃香蕉的珂珂(Koko Eating Bananas)

    Leetcode之二分法专题-875. 爱吃香蕉的珂珂(Koko Eating Bananas) 珂珂喜欢吃香蕉.这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉.警卫已经离开了,将在 H ...

  3. Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)

    Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted) 给定一个已按照升序排列 的有序数组,找到两个数使得它们 ...

  4. 基于ASP.Net Core开发的一套通用后台框架

    基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...

  5. Fiddle用于移动端抓包

    一.什么情况下可以用到 1.调查参考其他移动端网站的抓包,他们传输方式.如微信上京东的智能机器人的包.移动端的请求接口格式.如何实现的效果等. 2.调试本地移动端页面的测试页面效果是否有问题.如:页面 ...

  6. vmware中设置ubuntu静态ip

    概括一下过程中遇到的三个问题: 1.如何修改虚拟机为静态ip并且生效 2.设置完静态ip后,无法上网 3.设置完静态ip且能上网后,宿主机无法ping通虚拟机 问题1:参考https://www.ji ...

  7. pickle 序列化对象

    # 序列化对象 import pickle mylist=[[1,2,3,4,5,6,7],["abc","xyz","hello"],[1 ...

  8. SPOJ - VFMUL - Very Fast Multiplication FFT加速高精度乘法

    SPOJ - VFMUL:https://vjudge.net/problem/SPOJ-VFMUL 这是一道FFT求高精度的模板题. 参考:https://www.cnblogs.com/Rabbi ...

  9. ccpc网赛 hdu6705 path(队列模拟 贪心

    http://acm.hdu.edu.cn/showproblem.php?pid=6705 这是比赛前8题过的人数第二少的题,于是就来补了,但感觉并不难啊..(怕不是签到难度 题意:给个图,给几条路 ...

  10. Codeforces 935 C Fifa and Fafa

    935 C 题意:Fifa想用wifi下载足球游戏, 但是Fafa是个流浪狂魔, 所以Fifa想让他的wifi在公寓里尽量覆盖最大的面积,并且不覆盖到Fafa和公寓外的人,fafa的坐标可以在公寓外. ...