![3a8504ff3d7be6bc71aa99cbc0371bda.png](https://img-blog.csdnimg.cn/img_convert/3a8504ff3d7be6bc71aa99cbc0371bda.png)
本文的目的是记录与分享自己的学习过程和个人你的看法。如果对你有任何帮助深感荣幸,若有任何纰漏烦请指正。
我们通过一个简单的项目了解 .net core的项目结构和发布过程。使用 .net core2.1 sdk来创建一个最简单的C#项目,你可以去下面这个链接下载SDK。
.NET SDK下载dotnet.microsoft.com![f4e5ad24f4327eb455d4337bc134f887.png](https://img-blog.csdnimg.cn/img_convert/f4e5ad24f4327eb455d4337bc134f887.png)
使用版本为2.1.4
![741b184f250d435cc41a383099ef6a15.png](https://img-blog.csdnimg.cn/img_convert/741b184f250d435cc41a383099ef6a15.png)
安装完成之后,运行dotnet new命令可以查看可以创建的项目,它显示了可创建的项目类型以及支持的语言。
![19046589a096744610cdbb3d55cc566e.png](https://img-blog.csdnimg.cn/img_convert/19046589a096744610cdbb3d55cc566e.png)
要创建一个项目,首先需要一个用来存放项目的文件夹比如myapp。
![6d86a57476f0776b6c24c54264ef540a.png](https://img-blog.csdnimg.cn/img_convert/6d86a57476f0776b6c24c54264ef540a.png)
然后进入文件夹,创建一个console项目就运行命令行dotnet new console,如果要创建其他项目比如F#的 MVC项目就可以用命令dotnet new mvc -lang f#。
![29d68d96874760a4bbf959246bee5b7a.png](https://img-blog.csdnimg.cn/img_convert/29d68d96874760a4bbf959246bee5b7a.png)
当创建好模版后可以看到SDK还会执行dotnet restore命令,这个命令用于还原项目的依赖,更详细内容可转到下面的链接。
dotnet restore 命令- .NET Core CLIdocs.microsoft.com![177d91355f3cd3e93ab8f50d106de8b1.png](https://img-blog.csdnimg.cn/img_convert/177d91355f3cd3e93ab8f50d106de8b1.png)
这样就创建好了一个语言为C#的console项目模版,项目里包含了下面的内容。
![ffb1297e1afe86a0e3723f65011a5cd0.png](https://img-blog.csdnimg.cn/img_convert/ffb1297e1afe86a0e3723f65011a5cd0.png)
其中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![177d91355f3cd3e93ab8f50d106de8b1.png](https://img-blog.csdnimg.cn/img_convert/177d91355f3cd3e93ab8f50d106de8b1.png)
完整的项目文件格式参考可以在下面的链接中找到。
MSBuild Project File Schema Reference - Visual Studiodocs.microsoft.com![177d91355f3cd3e93ab8f50d106de8b1.png](https://img-blog.csdnimg.cn/img_convert/177d91355f3cd3e93ab8f50d106de8b1.png)
Progam.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![f4e5ad24f4327eb455d4337bc134f887.png](https://img-blog.csdnimg.cn/img_convert/f4e5ad24f4327eb455d4337bc134f887.png)
开始写代码!
![6f48be901e666741afbfca6b4621f70a.gif](https://img-blog.csdnimg.cn/img_convert/6f48be901e666741afbfca6b4621f70a.gif)
写完代码就可以测试运行,在项目文件下运行dotnet run。
![665f59a28695264f3241e8c00f4a2976.png](https://img-blog.csdnimg.cn/img_convert/665f59a28695264f3241e8c00f4a2976.png)
当你完成项目开发后就可以发布项目了,.net core项目发布有两种常见的方式:
Framework-dependent deployment(FDD)/框架依赖部署
这种部署方式最明显的特点就是需要在目标系统上安装 .net core运行时,这也是它最大的缺点。它的优点包括你在发布时不需要指定你的目标平台,并且你的发布包的体积会更小,也可以节省你目标系统上的磁盘空间,因为多个 .net core程序可以使用一个Runtime。
可以直接在项目文件夹下运行dotnet publish -c Release命令行来执行发布。
dotnet publish 命令 - .NET Core CLIdocs.microsoft.com![177d91355f3cd3e93ab8f50d106de8b1.png](https://img-blog.csdnimg.cn/img_convert/177d91355f3cd3e93ab8f50d106de8b1.png)
![c33e48b99c9ba99f791fa794043d2a17.png](https://img-blog.csdnimg.cn/img_convert/c33e48b99c9ba99f791fa794043d2a17.png)
你也可以选择直接在Visual studio生成,可以看到vs也是使用MSBuild工具来生成项目。
![54d72866a9cd4b2a3a662d0cb7bb10e1.png](https://img-blog.csdnimg.cn/img_convert/54d72866a9cd4b2a3a662d0cb7bb10e1.png)
发布完成后,我们可以在发布目录binReleasenetcoreapp2.0publish里看到结果。
![3f9a27d887e0bc0f359a836fba3d706c.png](https://img-blog.csdnimg.cn/img_convert/3f9a27d887e0bc0f359a836fba3d706c.png)
其中myapp.dll为项目生成的托管程序集(Managed Assembly)文件,通俗的说就是程序本体。
myapp.pdb全称为program database (PDB) symbol file,这个文件存储了对应dll内部的所有符号,以及符号对应的地址、文件名和行号,这些信息会在调试时被用以提供可读的调试信息。要了解更多细节可前往
PDB Symbol Filesdocs.microsoft.com![177d91355f3cd3e93ab8f50d106de8b1.png](https://img-blog.csdnimg.cn/img_convert/177d91355f3cd3e93ab8f50d106de8b1.png)
myapp.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![779deaf20e9d3ce3092bb724bafd6cd3.png](https://img-blog.csdnimg.cn/img_convert/779deaf20e9d3ce3092bb724bafd6cd3.png)
到此,FDD方式的发布方式结束,你可以在安装运行时的系统上运行 dotnet myapp.dll来运行程序。
![828aa6e44a5d3ee7b2645b78da851142.png](https://img-blog.csdnimg.cn/img_convert/828aa6e44a5d3ee7b2645b78da851142.png)
Self-contained deployment(SCD)/自包含部署
SCD就是在发布时SDK将Runtime也做为部署包内容的一部分,这样你就不需要在目标系统上安装 .net core运行时了。但是这样就需要你在发布时指定你要发布到的平台是什么,这个在 .net core里叫做RID(Runtime IDentifier/运行时标识符),比如windows10 x64系统就是win10-x64
,全部的RID可以在下面链接里找到
![779deaf20e9d3ce3092bb724bafd6cd3.png](https://img-blog.csdnimg.cn/img_convert/779deaf20e9d3ce3092bb724bafd6cd3.png)
它也是包管理的关键配置之一,以后在学习nuget的时候会碰到,本篇不做更多阐述。
在确定我们要发布到的平台后就可以使用命令行dotnet publish -r win10-x64 -c Release2 如果没有错误那我们就发布成功了!
![0b33505162f612d58b5ba2c2b9825a17.png](https://img-blog.csdnimg.cn/img_convert/0b33505162f612d58b5ba2c2b9825a17.png)
在发布文件夹下我们可以看到很多文件,这其中就包含了 .net core运行时,而且包含了一个项目对应平台的可执行文件myapp.exe,(其他平台上则会有对应的执行文件,比如选择rhel后会生成一个不带后缀的myapp文件)这样我们就可以直接双击myapp.exe来执行了,哈利路亚!
![fc7051997219fca33f4b92d537a9513d.png](https://img-blog.csdnimg.cn/img_convert/fc7051997219fca33f4b92d537a9513d.png)
当然这样的本地化程序体验也是有代价的,我们来看下以win-x64为目标平台的两种发布方式发布包的体积。
![7c195e78a27bce5544d1dea094a1efd7.png](https://img-blog.csdnimg.cn/img_convert/7c195e78a27bce5544d1dea094a1efd7.png)
可以看到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![779deaf20e9d3ce3092bb724bafd6cd3.png](https://img-blog.csdnimg.cn/img_convert/779deaf20e9d3ce3092bb724bafd6cd3.png)
到此我们简单介绍了 .net core的项目结构与发布方式。希望以后会有更多其他平台的开发者选择 .net core,因为C#真的是很优秀的语言啊!
![3a158f8a7a1252beb5f63d3493aa8978.png](https://img-blog.csdnimg.cn/img_convert/3a158f8a7a1252beb5f63d3493aa8978.png)
都看到这了还不点赞关注走一波((o(^_ ^)o))。