本文的目的是记录与分享自己的学习过程和个人你的看法。如果对你有任何帮助深感荣幸,若有任何纰漏烦请指正。
我们通过一个简单的项目了解 .net core的项目结构和发布过程。使用 .net core2.1 sdk来创建一个最简单的C#项目,你可以去下面这个链接下载SDK。
.NET SDK下载dotnet.microsoft.com使用版本为2.1.4
安装完成之后,运行dotnet new命令可以查看可以创建的项目,它显示了可创建的项目类型以及支持的语言。
要创建一个项目,首先需要一个用来存放项目的文件夹比如myapp。
然后进入文件夹,创建一个console项目就运行命令行dotnet new console,如果要创建其他项目比如F#的 MVC项目就可以用命令dotnet new mvc -lang f#。
当创建好模版后可以看到SDK还会执行dotnet restore命令,这个命令用于还原项目的依赖,更详细内容可转到下面的链接。
dotnet restore 命令- .NET Core CLIdocs.microsoft.com这样就创建好了一个语言为C#的console项目模版,项目里包含了下面的内容。
其中obj文件夹包含了编译与生成时需要的和产生的中间文件,一般不需要关注。
myapp.csproj即项目文件(其他语言的项目文件后缀F#为.fsproj,VB为vbproj 这和1.x版本中使用project.json等文件来组织和配置项目的方式完全不同),这个文件是项目组织和配置的核心,会在生成时被MSBuild用来作为输入。csproj文件的本质是一个保存项目信息的xml文件,打开它我们可以看到以下内容
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
</Project>
其中OutputType指定了当前项目的类型,TargetFramework指定了当前项目所用的框架,全部的TargetFramework支持项可以在下面找到,但当前对于非类库的 .net core项目支持的只有netcoreapp1.0,netcoreapp1.1,netcoreapp2.0,我们使用2.1版本所以应当是netcoreapp2.0,别问为什么 <( ̄3 ̄)> 。(注:此处应该是TFMs未更新,最新的TFMs已经添加了netcoreapp2.1)
Target frameworksdocs.microsoft.com完整的项目文件格式参考可以在下面的链接中找到。
MSBuild Project File Schema Reference - Visual Studiodocs.microsoft.comProgam.cs就是程序的代码文件,里面已经写了一段最基本的HelloWord代码,将它改成Hello Zhihu!,并添加一行控制台读取代码。
using System;
namespace myapp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello Zhihu!");
Console.ReadLine();
}
}
}
现在你可以使用适合你的开发工具进行开发了,微软推荐的开发工具可以在下面链接看到,个人推荐Visual Studio Community版,好用不要钱!。
.NET 开发工具www.microsoft.com开始写代码!
写完代码就可以测试运行,在项目文件下运行dotnet run。
当你完成项目开发后就可以发布项目了,.net core项目发布有两种常见的方式:
Framework-dependent deployment(FDD)/框架依赖部署
这种部署方式最明显的特点就是需要在目标系统上安装 .net core运行时,这也是它最大的缺点。它的优点包括你在发布时不需要指定你的目标平台,并且你的发布包的体积会更小,也可以节省你目标系统上的磁盘空间,因为多个 .net core程序可以使用一个Runtime。
可以直接在项目文件夹下运行dotnet publish -c Release命令行来执行发布。
dotnet publish 命令 - .NET Core CLIdocs.microsoft.com你也可以选择直接在Visual studio生成,可以看到vs也是使用MSBuild工具来生成项目。
发布完成后,我们可以在发布目录binReleasenetcoreapp2.0publish里看到结果。
其中myapp.dll为项目生成的托管程序集(Managed Assembly)文件,通俗的说就是程序本体。
myapp.pdb全称为program database (PDB) symbol file,这个文件存储了对应dll内部的所有符号,以及符号对应的地址、文件名和行号,这些信息会在调试时被用以提供可读的调试信息。要了解更多细节可前往
PDB Symbol Filesdocs.microsoft.commyapp.deps.json和myapp.runtimeconfig.json两个文件对于之前的 .net开发者会很陌生,
myapp.runtimeconfig.json是一个可选的配置文件包含了运行时的配置信息。这个文件被设计为是用户可编辑的,你可以通过配置它来改变运行时的行为。
myapp.deps.json文件保存一个依赖的列表,也就是编译上下文数据和编译依赖,不是技术上需要的,但是在使用服务,包缓存或共享这些安装功能的时候是需要的。(不知道翻译对不对,看原文吧)。这个文件由程序进行处理和使用,用户不应编辑。
MyApp.runtimeconfig.json
- An optional configuration file containing runtime configuration settings.MyApp.deps.json
- A list of dependencies, as well as compilation context data and compilation dependencies. Not technically required, but required to use the servicing or package cache/shared package install features.
更详细的信息可在dotnet cli的github项目找到
dotnet/cli runtime configuration filegithub.com到此,FDD方式的发布方式结束,你可以在安装运行时的系统上运行 dotnet myapp.dll来运行程序。
Self-contained deployment(SCD)/自包含部署
SCD就是在发布时SDK将Runtime也做为部署包内容的一部分,这样你就不需要在目标系统上安装 .net core运行时了。但是这样就需要你在发布时指定你要发布到的平台是什么,这个在 .net core里叫做RID(Runtime IDentifier/运行时标识符),比如windows10 x64系统就是win10-x64
,全部的RID可以在下面链接里找到
它也是包管理的关键配置之一,以后在学习nuget的时候会碰到,本篇不做更多阐述。
在确定我们要发布到的平台后就可以使用命令行dotnet publish -r win10-x64 -c Release2 如果没有错误那我们就发布成功了!
在发布文件夹下我们可以看到很多文件,这其中就包含了 .net core运行时,而且包含了一个项目对应平台的可执行文件myapp.exe,(其他平台上则会有对应的执行文件,比如选择rhel后会生成一个不带后缀的myapp文件)这样我们就可以直接双击myapp.exe来执行了,哈利路亚!
当然这样的本地化程序体验也是有代价的,我们来看下以win-x64为目标平台的两种发布方式发布包的体积。
可以看到SCD的发布方式比FDD的方式会多62MB。所以选择哪种方式发布需要看你项目的具体需求。
除了以上两种常用的发布方式,.net core还有另外一种“黑科技”发布方式 AOT(ahead of time)。上面介绍的两种方式除了SCD方式的exe文件外,项目的dll均为字节码(CIL Byte Code),也就是Roslyn编译后的程序集。.net core从源代码到用于执行的机器码的顺序为:源代码->编译时的Roslyn编译为字节码程序集->运行时的JIT(即时编译器)编译为机器码(Machine Code)->执行,而AOT的方式是将运行时的JIT编译放在编译时,所以你发布后的dll包含的是机器码。可以一定程度的提高运行效率。更详细的信息可以在下面的链接找到。
dotnet/corertgithub.com到此我们简单介绍了 .net core的项目结构与发布方式。希望以后会有更多其他平台的开发者选择 .net core,因为C#真的是很优秀的语言啊!
都看到这了还不点赞关注走一波((o(^_ ^)o))。