微软.NET6开发中解决方案和项目的区别-LMLPHP

我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,下面我就重点讲讲微软.NET6开发中解决方案和项目的概念。我将介绍 Visual Studio 2022的解决方案和项目的结构及组成。

解决方案是用于集中统一管理一组具有相关性的项目的Visual Studio工程结构。有时一个复杂的工程无法在一个项目中完成编写,需要分解为多个项目,为了方便管理这个工程的多个项目,便产生了解决方案。

一个解决方案对应一个SLN文件,它是一个文本文件,包含一组描述解决方案对应的VS版本和所管理项目的相关信息的文本。新建项目时默认会同时新建一个解决方案,可见VS的工程管理是以解决方案为基础进行的。同一个解决方案的项目一般会放在SLN文件所在的文件夹中,以便于源代码版本管理工具进行管理。 

项目是一组具有紧密关联的代码和相关资源的集合,也是编译生成的基本单位。

一个项目会被编译为一个程序集(DLL)或应用程序(EXE)。一个项目对应一个csproj文件,它是一个XML文本文件,包含一组描述项目类型、项目信息、所包含的代码和相关资源的一系列XML节点。同一个项目的相关文件一般会放在csproj文件所在的文件夹中。   

那么这些解决方案和项目的文件究竟是什么样子的呢?让我们一起来看一看。

解决方案和项目文件解析


解决方案文件

如下是解决方案文件:

1. Microsoft Visual Studio Solution File, Format Version 12.00
2. # Visual Studio Version 16
3. VisualStudioVersion = 16.0
4. MinimumVisualStudioVersion =10.0
5. Project ("(FAE04ECO-301F-11D3-BF4B-00C04F79EFBC)")="ConsoleApp","ConsoleApp\ConsoleApp.csproj", "{CE79EB55-414C-4BA2-A854-981EBEODF111)"
6. EndProject
7. Project("(FAE04EC0-301F-11D3-BF4B-00C04F79EFBC)")="ClassLibrary","ClassLibrary\ClassLibrary.csproj", "(0B255C08-B8D0-4A7C-A573-2DAEF6DFE0E6}"
8. EndProject
9.Global
10.  GlobalSection(SolutionConfigurationPlatforms)=preSolution
11.  DebuglAny CPU Debugl Any CPU
12.  Release|Any CPU ReleaselAny CPU
13.  EndGlobalSection
14.  GlobalSection(ProjectConfigurationPlatforms)= postSolution
15.  {CE79EB55-414C-4BA2-A854-981EBEODF111}.Debug|Any CPU.ActiveCfg = Debug|AnyCPU
16.  (CE79EB55-414C-4BA2-A854-981EBE0DF111).Debug|Any CPU.Build.0 = Debug|AnyCPU
17.  (CE79EB55-414C-4BA2-A854-981EBE0DF111).Release|Any CPU.ActiveCfg =ReleaselAny CPU
18.  {CE79EB55-414C-4BA2-A854-981EBEODF111). Release |Any CPU.Build.0=ReleaselAny CPU
19.  (0B255C08-B8DO-4A7C-A573-2DAEF6DFEOE6). DebugI Any CPU. ActiveCfg -DebuglAnyCPU
20.  {0B255C08-B8D0-4A7C-A573-2DAEF6DFE0E6}.Debug|Any CPU.Build.0 = Debug|AnyCPU
21.  {0B255C08-B8D0-4A7C-A573-2DAEF6DFEOE6). Release |Any CPU.ActiveCfg=ReleaselAny CPU
22.  {0B255C08-B8D0-4A7C-A573-2DAEF6DFE0E6}.Release|Any CPU.Build.0 =ReleaselAny CPU
23.  EndGlobalSection
24.  GlobalSection(SolutionProperties)=preSolution
25.  HideSolutionNode FALSE
26.  EndGlobalSection
27.  GlobalSection(ExtensibilityGlobals)=postSolution
28.  SolutionGuid = {AEF70734-5FAB-4CD7-9A5B-B6AF29227DC1}
29.  EndGlobalSection
30.EndGlobal

解释一下文件含义:
1)第1~4行说明了解决方案文件版本、创建解决方案的VS版本、能够打开解决方案的最低VS版本。
2)第5~8行说明了解决方案包含的项目名称、以解决方案文件为基础的项目文件的相对路径。如果在项目开发途中整理解决方案时调整了项目位置,可以在这里修改项目文件路径,避免解决方案找不到项目。
3)第9行至结束说明了解决方案的一些全局配置,如非必要请不要修改这些内容。

项目文件

如下是项目文件:

1. <Project Sdk="Microsoft. NET. Sdk">
2.
3. <PropertyGroup>
4.  <OutputType>Exe</OutputType>
5.  <TargetFramework>net6.0</TargetFramework>
6.  </PropertyGroup>
7.
8. <ItemGroup>
9.  <PackageReference Include=" Microsoft. EntityFrameworkCore. SqlServer " Version="6.0.5"/>
10.</ItemGroup>
11.
12. <ItemGroup>
13. <ProjectReference Include="..\ClassLibrary\ClassLibrary.csproj" />
14. </ItemGroup>
15.
16.</Project>

解释一下文件含义:
1)Project节为根节点,并使用 Sdk 属性指定要使用的 Sdk类型。这种新式项目文件默认把该文件夹内的所有文件视为项目文件,除非显式设置为排除项。
2)PropertyGroup节定义项目基础配置,包含大量可用的子节点,默认包含了项目输出类型和项目目标框架。这是必须存在的节,否则项目无法使用。
3)ItemGroup节可以没有或存在多个,该节定义项目中的各种细节,此处包含了引用的其他项目和第三方库信息。

大多数常用项目信息都可以使用项目属性页编辑,但也有大量只能直接编辑的节,这些信息能指导项目从开发到发布的各种工作。随着学习的深入和项目复杂度的增加,需要直接编辑项目文件的情况也会更频繁。

微软.NET6开发中解决方案和项目的区别-LMLPHP

创建解决方案和项目

下面来说一说解决方案和项目的创建方法。创建解决方案和项目主要有以下两种方法:   

(1)新建项目时让Visual Studio自动创建一个解决方案:默认情况下相当于创建空白解决方案,之后继续用解决方案名称创建一个同名项目放到解决方案文件夹中。

下面说一下具体的操作。

1。打开VS

2。在启动窗口中单击创建新项目

3。单击文件

4。单击新建

5。单击项目

6。选择项目类型

7。编辑项目名称和解决方案名称,可以取一样的名字

8。单击下一步,项目和对应的解决方案将同时创建完成

(2)新建空白解决方案:使用这种方法可以创建一个没有项目的空白解决方案,之后可以继续创建项目。实际上相当于创建一个以解决方案命名的文件夹,然后在文件夹中创建一个以解决方案命名的SLN文件。

下面说一下具体的操作。

1。在解决方案资源管理器的解决方案处右击

2。在菜单中选择添加

3。单击新建项目

4。选择项目类型

5。编辑项目名称

7。单击下一步,在解决方案中完成了项目的新建

引用其他项目和第三方程序包

下面来说一说这个问题,在应用开发中免不了要使用其他人写好的库,特别是一些比较基础和通用的功能,自己实现不仅要消耗额外的时间,还可能产生未知的bug。使用第三方库可以很好地避免这些问题。一个复杂的项目为了方便团队协作和积累基础代码,也会分割成多个项目。所以了解如何引用其他项目和第三方库是非常重要的。   

(1)引用其他项目   

引用其他项目的操作步骤如下:

1。在“解决方案资源管理器”的“解决方案”下展开要引用的其他项目,在“依赖项”处右击,在弹出的快捷菜单中选择“添加项目引用”命令

2。在“引用管理器”窗口中勾选要引用的项目,然后单击“确定”按钮

3。引用完成后在主项目的依赖项的项目中就可以看到引用的其他项目

(2)引用第三方程序包

两种方法引用程序包,

一种叫使用包管理器进行引用,如下:

1。在解决方案资源管理器的解决方案下展开要引用的第三方库的项目

2。在依赖项处右击,在弹出的菜单中选择管理nuget程序包

3。在浏览标签搜索要引用的库

4。在右侧选择要安装的版本并安装

5。之后在主项目的依赖项的包中可以看到引用的第三方库。

另一种叫使用包管理控制台进行引用,如下:

1。单击菜单的工具栏

2。点nuget包管理器

3。点程序包管理器控制台

4。打开程序包管理器控制台

5。通过nuget网页来搜索包

6。找到包后,复制package manager标签下的命令

7。粘贴到控制台运行就可以安装

(3)卸载程序包和项目引用

开发项目时可能需要卸载引用,例如调整引用关系或更换成相同功能的其他程序包。卸载引用有如下两种简单且常用的方法:

1)从项目的csproj文件中删除对应的“PackageReference”或“ProjectReference”节。

2)在解决方案资源管理器下的项目的依赖项中找到要卸载的程序包或项目,单击选中后按Delete键或者右击后在快捷菜单中选择移除命令。
 

.NET主要项目类型

.NET项目主要有四种:

控制台应用(Console App)

ASP.NET Core Web应用

.NET标准库(.NETStandard Library)

.NET库(.NET Library)

其中.NET标准库2.0版本可以在.NET Framework4.6或更高版本的项目中使用,是泛用性较好的.NET项目类型。.NET6推出了新的跨平台图形界面框架Maui。

.NET库项目由.NET类和其他嵌入式资源组成,这些类无法直接在系统中运行,只能直接或间接地通过.NET应用项目来使用。

.NET应用项目本质上和库项目一样,但是编译器会为应用项目额外添加一些启动信息,.NET在运行时可以根据这些信息创建进程并运行其中的启动代码运行应用。.NET库只能被相同或更高版本且体系结构兼容的.NET项目引用,无法在.NET Framework中使用。.NET库与.NET标准库的主要区别在于能使用特定.NET版本框架的API,这也是其兼容性较差的原因。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

02-07 13:34