程序集和类库
C#中,程序集(Assembly)是代码编译、部署和版本控制的基本单元,它通常对应一个.dll或.exe文件。Visual Studio组织代码的单位是解决方案(sln)和工程(csproj),一个解决方案可以包含多个工程,而一个工程在默认情况下会编译产出一个程序集,因此可以粗略地把「工程」和「程序集」对应起来:类库(dll)工程和可执行程序(exe)工程,各自都是一个程序集。程序集内部除了编译后的IL代码,还包含类型、方法等元数据以及版本、依赖引用等信息。
我们这篇笔记简单介绍如何创建一个类库,以及如何在另一个工程中引入一个类库。
创建类库工程
在Visual Studio开发工具中,我们选择类库工程。

在框架处我们选择.NET Standard。

注:我们选择.NET Standard而非具体的.NET Core或.NET Framework运行时,是因为.NET Standard是一个跨运行时的统一标准,我们使用的.NET Standard 2.0既可以用于.NET 5及以上版本,也可以用于.NET Framework 4.6.1及以上版本,这样编写的类库通用性更好。如果类库只面向较新的.NET(即原.NET Core)平台且需要使用新特性,也可以直接选择对应的.NET版本。
编写好类库代码后,我们可以点击菜单中的生成按钮。

生成完成后,就会在工程对应的输出目录中产生.dll文件。
引用类库
在另一个工程中引用类库有三种常见方式:直接引用dll文件、项目引用和NuGet包引用,下面分别介绍。
引用dll文件
切换到需要引用dll文件的工程,点击项目->添加引用,选择我们生成好的dll文件。

这样添加后,在代码中就可以正常调用了。这种方式的缺点是,被引用类库的源码一旦有改动,就必须重新生成dll再替换,比较麻烦,因此更适合引用第三方提供的、不易变动的dll。
项目引用
如果被引用的类库工程和当前工程都在同一个解决方案中,更推荐使用「项目引用」而不是直接引用dll文件。在Visual Studio中右键工程选择添加->项目引用,然后勾选目标类库工程即可。使用项目引用时,类库源码的改动会被自动重新编译并被当前工程引用,省去了手动重新生成dll再拷贝的麻烦。
在命令行中,也可以使用dotnet工具为工程添加项目引用。
dotnet add reference ../MyLib/MyLib.csproj
NuGet包引用
实际开发中,我们使用的大多数第三方类库(如Newtonsoft.Json、AutoMapper等)以及微软官方提供的许多扩展库,都是通过NuGet包分发的。NuGet是.NET平台的包管理工具,作用大致相当于Java生态中的Maven,官方的包仓库地址为:https://www.nuget.org/
在Visual Studio中,我们可以右键工程选择管理NuGet程序包,搜索并安装所需的包。在命令行中,也可以使用dotnet工具安装包。
dotnet add package Newtonsoft.Json
安装后,包信息会被记录在工程文件中,并自动下载到全局缓存目录,我们的代码即可直接使用其中的命名空间。