NuGet是什么?为什么.NET项目中会有NuGet?如何使用NuGet程序包?

article/2025/10/16 14:22:55

本文首发于码友网 – 《NuGet是什么?为什么.NET项目中会有NuGet?如何使用NuGet程序包?》

概述

大家好,我是专注.NET开发的码友网创建者Rector

在.NET应用程序编程开发中,开发者通常使用类库来管理、维护属于同一分类的程序代码,以便代码的重用。一般情况下,处于同一类库的所有类都位于同一程序集。

这些类库被编译器编译后会生成扩展名为.dll的动态链接库文件,你可以在其它项目中通过引用的方式导入这些.dll程序集并使用其中被封装的类及成员。

但随着项目越来越大、越来越多,使用手动引用.dll动态链接库的方式让程序包管理和维护变得非常困难。在这种情况下,NuGet程序包管理工具便应运而生。

NuGet程序包就好比前端开发中的npm包,Java开发中的Maven或者Gradle,它们都是管理自己语言领域的程序依赖包的工具。负责控制程序包版本,维护包与包之间的依赖,有了包管理工具,你可以快速地安装包,还原包等。

在正式接触NuGet程序包工具前,先来一步一步回顾.NET项目中程序包引入的进化历。

引入程序集的方式

引入程序集的方式有多种,如:

  • 程序集在同一个解决方案,直接引用项目
  • 程序集在本地磁盘,浏览.dll文件引入
  • NuGet程序包管理工具安装

1.引用项目方式

假如当前有一个名为NugetDemo.Payment的类库项目和一个名为ConsoleApp的控制台应用程序,现需要在ConsoleApp项目中通过引用项目的方式引入NugetDemo.Payment,方法如下:

1.右键单击依赖项,点击添加项目引用,如图:

2.在弹出的引用管理器窗口中选中NugetDemo.Payment,点击确定,如图:

3.Visual Studio将把选中的项目添加到当前项目的依赖项->项目列表,如图:

2.浏览文件方式

还是在ConsoleApp项目中,假如有另外一个支付宝的程序集,如图:

1.还是按归引用项目的方式,右键单击依赖项,点击添加项目引用

2.在弹出的引用管理器窗口选中浏览,如图:

3.再点击右下角的浏览按钮,在文件资源管理器中找到刚才准备的Ali.Alipay.dll文件,如图:

4.选择后点击右下角的添加按钮,将自动回到如下界面:

5.选中刚才浏览的Ali.Alipay.dll,最后点击右下角的确定按钮,Visual Studio将会把这个.dll文件添加到当前项目的依赖项->程序集列表中,如图:

无可厚非,以上的两种引用程序集的方式在结果上是没有问题的。但这种方式只适合个人项目,当你的团队成员或者团队项目达到一定量级之后,程序集的管理、维护、版本控制等问题会让你头疼。

到最后,你可能不知道当前引用的程序集是哪个版本?在哪里可以找到正确的程序集版本?它们之间的依赖关系是怎么样的?如果共享程序集?

有了NuGet程序包之后,这些问题就迎刃而解。

NuGet程序包

NuGet程序包是微软为.NET(包括.NET Core)平台提供的程序集共享包。

简单地说,NuGet包是一个扩展名为.nupkg的ZIP文件,其中包含了已编译代码(.dll)与该代码相关的其他文件,以及包版本号等信息的描述信息。

开发人员可以创建代码共享的程序包并将其发布到公共或私有主机。包使用者从合适的主机获得这些包,将它们添加到他们的项目中,然后在他们的项目代码中调用包的功能。然后NuGet自己处理所有中间细节(包括安装、卸载、依赖关系维护,版本控制等)。

微软官方为公共的.NET共享程序包提供专门的公有托管服务,地址为: https://www.nuget.org/

目前有超过25万的程序包被分享在这里,如图:

NuGet除了支持公共的nuget.org主机外还支持私有主机,所以你可以搭建个人或者公司内部的NuGet私有服务器,以达到内部分享程序包的目的。

NuGet程序包的安装和卸载

管理NuGet程序包的方式有多种,其中最常用的分别为:一、通过NuGet包管理器;二、通过命令行管理。其中NuGet包管理器是Visual Studio或者Rider这样的集成开发环境才具备的客户端管理工具。

下面以Visual Studio 2022 预览版(17.0.0 Preview 3.1)为例演示。

NuGet包管理器

安装NuGet

假如当前有一个基于.NET 5的控制台应用程序,结构如下:

现需要在这个控制台中安装Newtonsoft.Json以便进行json序列化和反序列化操作。那么,我们可以通过右键依赖项 -> 管理NuGet程序包来打开NuGet包管理器,如下图:

然后选择浏览选项卡,并在搜索框中键入关键词,在搜索结果中选中需要安装的程序包,最后点击右侧的安装按钮,如下:

在弹出的对话框中,点击确定按钮:

Visual Studio将自动下载选中的程序包及其依赖包,并将其添加到当前项目的依赖项中,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vfHTTcUL-1639403879354)(https://statics.codedefault.com/uploads/u/2021/09/ijt33qe35p.png)]

现在,可以在这个ConsoleApp1项目中调用Newtonsoft.Json组件所有可访问的功能了,以下示例演示了利用Newtonsoft.Json将一个json字符串反序列化成实体对象,代码如下:

using Newtonsoft.Json;class Program
{static void Main(string[] args){// 模拟一个JSON字符串var json = "{\"id\":1,\"name\":\"Rector\",\"age\":18}";// 调用JsonConvert.DeserializeObject<T>()泛型方法反序列化var person = JsonConvert.DeserializeObject<Person>(json);Console.WriteLine(person.ToString());Console.ReadKey();}
}
/// <summary>
/// 定义一个与JSON字符串字段匹配的实体类
/// </summary>
public class Person
{public int Id { get; set; }public string Name { get; set; }public short Age { get; set; }/// <summary>/// 重写ToString()方法/// </summary>/// <returns></returns>public override string ToString(){return $"id:{Id},name:{Name},age:{Age}";}
}

运行结果如下图:

NuGet包版本管理

NuGet包有版本之分,不同的版本以版本号作为标识,比如上面安装的Newtonsoft.Json程序包,安装的时候选择了当前的最新版本(13.0.1),如图:

这个下拉列表列出了Newtonsoft.Json程序包所有可用的版本号,通过选择不同版本号即可安装不同版本的Newtonsoft.Json程序包,也可以通过这个版本下拉列表实现NuGet程序包版本的升/降级

比如,当前我们已经安装了版本13.0.1,那么,选择任意一个比它版本号小的即为降级,比如这里选择降级为12.0.3,点击更新按钮即可完成降级。

同理,选择任意一个比当前版本号大的版本,即可完成升级版本的操作。

问:NuGet包为什么会有不同的版号呢?

答:NuGet的版本号作为不同版本的标识。一个NuGet包的功能在不断地完善和扩展,每次对NuGet包进行迭代(可能是修复bug,也可能是新增功能),都会为其指定不同的版本号(通常这个版本号是向上累加的),不同版本之间相互独立、互不影响。

NuGet包卸载

有安装就有卸载,假如某个项目不再需要某个NuGet程序包,则可以通过NuGet包管理器中的卸载按钮来一键卸载掉指定的NuGet程序包(其依赖的程序包也会被一并卸载),如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dAO22fZj-1639403879363)(https://statics.codedefault.com/uploads/u/2021/09/18bat636f6.png)]

卸载Newtonsoft.Json包后,上面演示的反序列化示例代码在编译报错了,如图:

NuGet命令行

除了NuGet包管理器外,还可使用NuGet命令行来安装。

首先,打开NuGet的官网: https://www.nuget.org/ ,在搜索框中键入要查找的NuGet包关键字(这里演示Newtonsoft),点击搜索按钮,如图:

在搜索结果列表中点击符合要求的程序包(Newtonsoft.Json),如图:

进入到Newtonsoft.Json的详情页面,此页面展示了程序包的详细信息,如:命令行、依赖、被其他项目使用列表,历史版本列表,基本信息等等,如图:

程序包管理器控制台命令

安装NuGet包

首先,演示程序包管理器控制台,复制其中的程序包管理器控制台命令:

Install-Package Newtonsoft.Json -Version 13.0.1

在Visual Studio中,打开程序包管理器控制台,如图:

将命令粘贴在程序包管理器控制台中,并将默认项目设置为当前项目(如果一个解决方案中有多个项目时,需仔细检查此下拉框选中的项目),按回车键执行命令。

命令执行结果如图:

程序包管理器控制台命令方式安装NuGet程序包成功。

更新NuGet包

程序包管理器控制台中,同样可以更新NuGet包。

你可以获取检查当前项目已安装包是否有新版本,命令如下:

Get-Package -updates

更新指定包到指定版本,命令如下:

Update-Package Newtonsoft.Json -Version 13.0.1

更新项目的指定包到指定版本,命令如下:

Update-Package Newtonsoft.Json -Version 13.0.1 -ProjectName ConsoleApp1

更新当前解决方案的所有程序包到最新版本,命令如下:

Update-Package

卸载NuGet包

程序包管理器控制台中,还可以卸载NuGet包。

卸载默认项目的指定程序包,命令如下:

Uninstall-Package Newtonsoft.Json

卸载默认项目的指定程序包,同时卸载未使用的依赖包,命令如下:

Uninstall-Package Newtonsoft.Json -RemoveDependencies

强制卸载默认项目的指定程序包(即使其他程序包依赖于它),命令如下:

Uninstall-Package Newtonsoft.Json -Force

.NET CLI管理NuGet包

要使用.NET CLI工具,需要安装.NET Core SDK。如果已安装Visual Studio 2017及以上版本,则.NET CLI工具会自动安装。

在使用命令行管理NuGet包时,请在命令行中定位到项目所在根目录。

安装Nuget包

使用.NET CLI安装Newtonsoft.Json包的命令如下:

dotnet add package Newtonsoft.Json --version 13.0.1

命令执行如下:

卸载Nuget包

卸载Newtonsoft.Json包的命令如下:

dotnet remove package Newtonsoft.Json

下一篇介绍《1分钟极速搭建基于BaGet的轻量级私有Nuget程序包服务器》

如有什么问题,欢迎评论区留言反馈。

如果你觉得本文有价值,请来个三连(点赞,收藏,评论)吧,谢谢。


http://chatgpt.dhexx.cn/article/uKM2UrpU.shtml

相关文章

争取一文说透NuGet

一、NuGet是什么? NuGet是一个为大家所熟知的Visual Studio扩展&#xff0c;通过这个扩展&#xff0c;开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件&#xff0c;同时也可以通过NuGet来安装一些Visual Studio的插件等。 二、官网&#xff1a;…

NuGet是什么?理解与使用

如果你了解python&#xff0c;那么它类似pip。 如果你了解nodejs&#xff0c;那么它类似npm。 如果你了解ruby&#xff0c;那么它类似gem。 对&#xff0c;它就是一个包&#xff08;package&#xff09;管理平台&#xff0c;确切的说是 .net平台的包管理工具&#xff0c;它提供…

接口模板 接口文档

接口模板、接口文档、希望解决接口写的乱七八糟的问题 模板下载 word版 excel版

日期+列表+折线图

#1、分析&#xff1a; 1.1日期&#xff1a; 日&#xff1a;选项为日的时候&#xff0c;右边日期选择YYYY-MM-DD,折线图显示当天的24小时 周&#xff1a;选择为周的时候&#xff0c;右边日期选择YYYY-MM-DD,折线图显示当前日期往前6天 月…

如何制作竖线的效果

描述 在很多网页中, 都会有一个小竖线的效果 (如图) . 实现这个小竖线的效果有很多种方法. 在这里记录一下. 方法 1. 通过::after 在元素后面追加一个宽度为1px的元素 .search-box .search span::after {position: absolute;right: -8px;content: "";width: 1p…

前端画竖线

一条竖线的写法 实现原理&#xff1a; 利用浮动,设置width:1px 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"&g…

html中竖线怎么写,网页中竖线的几种做法

Q&#xff1a;网页中竖线的几种做法 A&#xff1a;1、用水平线做&#xff1a; 一般水平线的是宽长高短 color#000000>&#xff0c;做竖线我们可以反过来宽短高长&#xff0c; width"1"size"1000" color#000000>&#xff0c;怎么样&#xff1f;竖线出…

latex | 表格竖线被截断 、表格中文字靠近上方

表格竖线被截断 使用latex做表格的时候&#xff1a; 用的是三线表&#xff1a;\toprule midrule bottomrule 会出现表格竖线被截断的问题&#xff1a; 解决办法&#xff1a; 把\toprule midrule bottomrule替换成hline即可 表格文字靠近上方 但是这样修改之后会出现另一…

Latex中表格的竖线截断问题

Latex中使用代码 \begin{table}[htbp] \centering \caption{Add caption} \begin{tabular}{|c|c|c|c|} \toprule Avg. Degree & Node No. & Cascade No. & Cascade Length \\ \midrule 3-10 & 300-1000 & 100-500 & 10-20 \\ \bottomrule \end{tabul…

CSS 画一条横线/竖线

作为优秀的java程序员,扎实(la ji )前端水平是我工作的基础 , 所以今天记录一下怎么用css画一条横线/竖线出来 , 以此为笔记, 将来不需要去翻阅别人的代码 废话不多说 笔记开始 #CSS 代码 /*中间的过度的横线*/.link-top {width: 50%;height: 1px;border-top: solid #ACC0D8…

设置文字之间的竖线

1、定义文字 2、css设置样式

Latex 三线表 横线竖线短横线

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.blog.csdn.net] 目录 样式复现 语法解释 以这个图为例&#xff1a; 样式复现 导言区先添加&#xff1a; \usepackage{tabu} % 表格插入 \usepackage{multirow} % 一般用以设计…

echart markLine x轴 两点之间 或 日期之间 的竖线箭头

业务需求是想实现在两个月份之间的一个竖线代表月份启动日期 这个竖线是动态的 。 这里的难点是&#xff1a;x轴是日期 通过坐标找不到日期之间的中间的位置 。 解决方案&#xff1a;因此再创建有个x轴 我这里新的x轴刻度放大了五倍 根据比例找到你画的竖线在新的x轴的位置 &am…

C#中抽象类与抽象方法的详解

前言:在上一篇博文关于重写的前提说明中提到了,那么今天我们一起来看看抽象类以及抽象方法…,首先我们顺着目录从抽象类的介绍开始学习: 目录: 一.抽象类:1.声明形式(创建抽象类):2.抽象类的调用: 二.抽象类的规则:三.抽象方法:四.应用举例:五.抽象类的运用意义;六.总结: 一.抽…

java的抽象方法和抽象类

一个方法&#xff0c;要么是抽象方法&#xff0c;要么必须给出方法的具体实现。 比如我有个animal类&#xff0c;有个吃东西方法&#xff0c;我不希望在animal类中给出这个方法的具体实现&#xff0c;因为不同动物&#xff0c;吃的东西不一样。所以要给这个方法声明为抽象方法…

Java抽象类/抽象方法定义及其特性详解

类的继承结构中&#xff0c;越往上的类越具有通用性&#xff0c;也就越抽象。当它抽象到一定程度&#xff0c;就变成概念成框架&#xff0c;不能再产生实例化的对象了。例如“交通工具”&#xff0c;就无法用它来产生一个实例。 对应这一现象&#xff0c;Java中提供了抽…

Java的抽象类和抽象方法

目录 1、抽象类 2、抽象方法&#xff1a; 3、 抽象类和抽象方法的使用 1、抽象类 当父类的方法不能确定时&#xff0c;可以用abstract关键字来修饰方法&#xff0c;这个方法时抽象方法&#xff0c;用abstract来修饰该类就是抽象类。 public abstract class Animal {public…

抽象类必须要有抽象方法吗?

答案是&#xff1a;不必须。 这个题目主要是考察对抽象类的理解。 说一下我个人的理解吧。 1.如果一个类使用了abstract关键字修饰&#xff0c;那么这个类就是一个抽象类。 2.抽象类可以没有抽象方法 3.一个类如果包含抽象方法&#xff0c;那么这个类必须是抽象类&#xf…

抽象类和抽象方法定义及讲解?

首先说抽象类&#xff1a; &#xff08;1&#xff09;抽象类只能作为其他类的基类&#xff0c;它不能直接实例化&#xff0c;对抽象类不能使用new 操作符。 &#xff08;2&#xff09;抽象类中可以包含抽象成员&#xff0c;但非抽象类中不可以。 &#xff08;3&#xff09;如…