.NET Core New csproj 如何发布可执行文件

一、前言

  .NET工具链在最新的Preview3版本中,引入了新的MSBuild项目系统,项目文件又回归了.csproj的XML文件来管理,项目文件、包引用、程序集引用、.NET Core工具集、发布内容定义等内容。本文主要将主要讨论,如何在新的项目系统中(.csproj)发布可执行文件。我们都知道在之前的版本中,项目文件是通过project.json文件来管理项目和包引用的,那么通过删除 dependencies->Microsoft.NETCore.App-> "type": "platform" 子节点,并定义runtimes节点,来发布可执行文件(想了解的朋友可以阅读这篇文章) 。

  所为可执行文件就是在目标机器上,不需要安装.NET Core SDK或任何Runtime,就可以执行的文件。比如在Windows上可以生成 coreapp.exe的可执行文件,而在Linux中可以使用 ./coreapp 来执行。

  原理上这种可执行文件,就是通过一个C++应用程序为载体(宿主),加载CoreCLR,通过CoreCLR再加载任意的程序集,对这里有兴趣的朋友也可以到Github上去看一下CoreCLR中ClrHost的部分。

二、生成可执行

  在新的.csproj项目文件中,我们要想发布一个可执行文件,就在手动创建名为<RuntimeIdentifiers>的节点,在这个节点下面,添加RuntimeIdentifiers也就是以前的RID定义,RID是描述系统平台的统一命名标示。例如我想要发布的可执行文件的目标系统平台为Win10Mac os 10.11.* 定义如下:

 <PropertyGroup>
      <RuntimeIdentifiers>win10-x64;osx.10.11-x64</RuntimeIdentifiers>
 </PropertyGroup>

  通过如下命令发布各平台的目标可执行文件:

dotnet build -r win10-x64
dotnet build -r osx.10.11-x64

  上面的命令可以生成带有符号文件和调试信息的DEBUG版本,你的应用程序将生成在 .\bin\Debug\netcoreapp1.0\< runtime_identifier>目录下,如果想生成生产环境的最终版本请通过如下命令获取:

dotnet publish -c release -r win10-x64
dotnet publish -c release -r osx.10.11-x64

  通过上述命令生成的Release版本目标执行文件将生成在 .\bin\release\netcoreapp1.0\<runtime_identifier>目录下,并且每一个目标平台目录下都有生成的可执行文件、发布项目的程序集、.NET Core依赖或必要的文件等来保证生成程序的独立可执行。

  我们来看一个新的csproj文件的完整定义:

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.0</TargetFramework>
    <VersionPrefix>1.0.0</VersionPrefix>
    <DebugType>Portable</DebugType>
    <RuntimeIdentifiers>win10-x64;osx.10.11-x64</RuntimeIdentifiers>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="**\*.cs" />
    <EmbeddedResource Include="**\*.resx" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NETCore.App">
      <Version>1.0.1</Version>
    </PackageReference>
    <PackageReference Include="Newtonsoft.Json">
      <Version>9.0.1</Version>
    </PackageReference>
    <PackageReference Include="Microsoft.NET.Sdk">
      <Version>1.0.0-alpha-20161102-2</Version>
      <PrivateAssets>All</PrivateAssets>
    </PackageReference>
  </ItemGroup>

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

三、RID

  RID是Runtime Identifier的缩写,它用于定义目标操作系统标示。RID会不断的更新,我们可以在CoreFx项目中找到RID定义,常用的RID有如下:

Windows RIDs

  • Windows 7 / Windows Server 2008 R2
    • win7-x64
    • win7-x86
  • Windows 8 / Windows Server 2012
    • win8-x64
    • win8-x86
    • win8-arm
  • Windows 8.1 / Windows Server 2012 R2
    • win81-x64
    • win81-x86
    • win81-arm
  • Windows 10 / Windows Server 2016
    • win10-x64
    • win10-x86
    • win10-arm
    • win10-arm64

  Linux RIDs

  • Red Hat Enterprise Linux
    • rhel.7.0-x64
    • rhel.7.1-x64
    • rhel.7.2-x64
  • Ubuntu
    • ubuntu.14.04-x64
    • ubuntu.14.10-x64
    • ubuntu.15.04-x64
    • ubuntu.15.10-x64
    • ubuntu.16.04-x64
    • ubuntu.16.10-x64
  • CentOS
    • centos.7-x64
  • Debian
    • debian.8-x64
  • Fedora
    • fedora.23-x64
    • fedora.24-x64
  • OpenSUSE
    • opensuse.13.2-x64
    • opensuse.42.1-x64
  • Oracle Linux
    • ol.7-x64
    • ol.7.0-x64
    • ol.7.1-x64
    • ol.7.2-x64
  • Currently supported Ubuntu derivatives
    • linuxmint.17-x64
    • linuxmint.17.1-x64
    • linuxmint.17.2-x64
    • linuxmint.17.3-x64
    • linuxmint.18-x64

  OS X RIDs

  • osx.10.10-x64
  • osx.10.11-x64
  • osx.10.12-x64

四、系统依赖

  发布出来的目标平台可执行文件,也是需要依赖系统特性的,接下来我们来看下系统的需要组件有哪些:

Windows

Ubuntu

CentOS

OS X

Visual C++ Redistributable for Visual Studio 2015

libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev libcurl4-openssl-dev libssl-dev uuid-dev unzip

deltarpm epel-release unzip libunwind gettext libcurl-devel openssl-devel zlib libicu-devel

libssl version 1.0.1

  • Visual C++ Redistributable
  • for Visual Studio 2015
  • libunwind8
  • libunwind8-dev
  • gettext
  • libicu-dev
  • liblttng-ust-dev
  • libcurl4-openssl-dev
  • libssl-dev
  • uuid-dev
  • unzip
  • deltarpm
  • epel-release
  • unzip
  • libunwind
  • gettext
  • libcurl-devel
  • openssl-devel
  • zlib
  • libicu-devel
  • libssl version 1.0.1

GitHub:https://github.com/maxzhang1985/YOYOFx  如果觉还可以请Star下, 欢迎一起交流。

.NET Core 开源学习群: 214741894

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

Metasploit、powershell之Windows错误系统配置漏洞实战提权

? 01 引言 我们在获得目标机一个普通的权限时,除了常规提权方法外,还可以通过查找目标主机错误的系统配置和漏洞来获取系统权限。本节所讲的“Trusted S...

369100
来自专栏张善友的专栏

Visual Studio 2005/2008的代码段编辑器

代码段(Snippet)是可以从键盘上快速访问的代码模版。它不是代码生成器,而是一些面向常用编码模式的快捷方式。它支持字段链接,因此当修改某一处参数名称的时候就...

222100
来自专栏Aloys的开发之路

Windows日志查看工具合集

希望可以和大家多多交流。 平时在Linux下查看日志,使用tail、grep、find等命令还比较方便,后来需要在Windows中处理一些问题,发现缺少类似的功...

89190
来自专栏Ken的杂谈

ASP.NET Core 入门教程 1、使用ASP.NET Core 构建第一个Web应用

https://ken.io/serie/dotnet-core-quickstart

63140
来自专栏云计算教程系列

在腾讯云CVM上使用Go语言编译软件

Go 语言强大之处在于其能够快速编译为机器能识别的可执行文件,Go 语言有完整的开发体系,使其能够简单的获取包及编译。go语言编译的软件全平台通用,没必要再去给...

28250
来自专栏张善友的专栏

移植Windows自宿主WCF服务到Linux/Mono2.8

Windows服务是这些后台程序、后台服务的正规名词。Windows服务的运行可以在没有用户干预的情况下,在后台运行,没有任何界面。通过Windows服务管理器...

23880
来自专栏小俊博客

微软 Edge 浏览器爆高危漏洞,受控电脑可执行任意命令

10月12日,有安全研究人员发布了Windows Shell REC( CVE-2018-8495))漏洞概念验证代码,受影响软件为Windows 10内置的M...

11110
来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(一)--- 简介及安装Node.js开发环境

学习资料   1.深入浅出Node.js http://www.infoq.com/cn/minibooks/nodejs   2.Node.js开发指南 简介...

39760
来自专栏草根专栏

发布 ASP.NET Core 2.x 应用到 Ubuntu

简单绍一下如何将ASP.NET Core 应用发布到Linux (Ubuntu)服务器上,都是文档的东西。

14720
来自专栏IMWeb前端团队

meteor 简介

本文作者:IMWeb helondeng 原文出处:IMWeb社区 未经同意,禁止转载 What “Meteor gives you a radica...

24590

扫码关注云+社区

领取腾讯云代金券