nupkg介绍
nupkg 是 NuGet 包的文件格式,扩展名为 .nupkg,本质上是一个 ZIP 压缩包,解压.nupkg为文件夹,包含以下内容:
- 编译后的程序集(.dll 文件):核心代码逻辑,供其他项目直接引用。
- 调试符号(.pdb 文件):支持调试时查看包内代码的源码位置和变量信息。
- 描述文件(.nuspec):记录包的元数据(名称、版本、作者、依赖项等)。
- 附加资源:如配置文件(.config)、静态资源(图片、脚本)、源码文件(.cs)等。
在 .NET 生态系统中,Nupkg 包(NuGet 包)是代码分发、依赖管理和资源共享的核心载体,其功能贯穿了开发、构建、部署的全流程,极大简化了 .NET 项目的依赖管理和组件复用。
nupkg包的核心功能
nupkg包主要功能包括依赖管理、版本控制、便捷分发、跨平台兼容和自动集成等功能,以下详细介绍几个常见的功能。
版本化管理
每个 Nupkg 包通过语义化版本号(如 1.0.3
,格式为 主版本.次版本.修订号
)区分不同迭代,支持:
- 精确指定依赖版本(如
1.2.0
)。 - 版本范围约束(如
>=1.0.0 && <2.0.0
),避免因版本兼容问题导致的冲突。 - 自动更新:工具(如 NuGet CLI、Visual Studio)可检测并升级到符合约束的最新版本。

依赖自动管理
当一个 Nupkg 包依赖其他包时,其 .nuspec
文件会声明依赖关系(如 Microsoft.Extensions.Logging
依赖 Microsoft.Extensions.DependencyInjection
)。
安装包时,工具会自动分析并下载所有依赖的子包,形成完整的依赖链,无需手动查找和添加。
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>vbp.localdemo</id>
<version>1.0.3</version>
<authors>AotDemo</authors>
<license type="expression">MIT</license>
<licenseUrl>https://licenses.nuget.org/MIT</licenseUrl>
<description>Package Description</description>
<repository type="git" />
<dependencies>
<group targetFramework="net9.0" >
<dependency id="Microsoft.Extensions.Logging" version="6.0.0" />
<dependency id="Newtonsoft.Json" version="13.0.1" />
</group>
</dependencies>
</metadata>
</package>
跨项目类型兼容
Nupkg 包支持多种 .NET 项目类型,包括:
- .NET Framework(如 Windows 桌面应用 WinForms、WPF)。
- .NET Core/.NET 5+(如控制台应用、ASP.NET Core Web 应用)。
- .NET Standard 类库(跨平台兼容的通用组件)。 包可通过
.nuspec
中的targetFramework
字段指定支持的框架,避免引用不兼容的项目。
如图所示,nupkg内集成.net9程序:

自动化流程集成
- Visual Studio:
通过 NuGet 包管理器
界面可视化操作(安装、卸载、更新),依赖信息自动写入项目文件(或 .vbproj)。

- 命令行工具:
通过 NuGet CLI(nuget install
)或 .NET CLI(dotnet add package
)实现自动化脚本,适合 CI/CD 流水线。
- 还原机制:
项目迁移或构建时,工具会根据项目文件中的依赖声明,从 NuGet 源(默认 nuget.org)自动下载缺失的包,确保环境一致性。
nupkg的打包和发布
nupkg包的打包方式
使用dotnet pack
命令
- 配置项目文件 (.csproj),如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<PackageId>vbp.localdemo</PackageId>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Platforms>AnyCPU;ARM64;ARM32</Platforms>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Version>1.0.3</Version>
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
</PropertyGroup>
</Project>
- 执行打包命令,在
./nupkgs
生成vbp.localdemo.1.0.3.nupkg
dotnet pack --configuration Release --output ./nupkgs
使用Visual Studio工具
- 右键项目 → 属性 → 包 选项卡;
- 填写包信息(ID、版本、描述等);
- 勾选
在构建时生成 NuGet 包
;n - 右键项目 → 打包,生成项目,可以生成以
包ID.包版本.nupkg
命名的nupkg包。

本地测试包
- 配置本地NuGet源
# 创建本地源目录
mkdir D:\Desktop\LocalNuGet
# 添加到 NuGet 源列表
dotnet nuget add source D:\Desktop\LocalNuGet -n LocalSource
- 推送包到本地源
dotnet nuget push bin\Release\vbp.localdemo.1.0.3.nupkg --source LocalSource
- 在测试项目中引用
dotnet add package vbp.localdemo --version 1.0.3
发布到NuGet仓库
- 登录 nuget.org → 个人账户 → API Keys,获取 API Key;
- nupkg包的推送命令:
命令:
dotnet nuget push <包名>.nupkg -k <API-Key> -s https://api.nuget.org/v3/index.json
举例:
dotnet nuget push vbp.localdemo.1.0.2.nupkg -k oy2obrrtz2ecocvdu5lawaicpprblnfutbzwnfw3qybynm -s https://api.nuget.org/v3/index.json
- 推送成功过后可以查看在nuget官网上查看

nupkg包安全防范措施
安全问题
.NET程序的源代码通常会被编译成中间语言(IL)或字节码(Bytecode),然后在运行时由CLR解释执行,因此IL或字节码相对于源代码更容易被反编译或反汇编;
将编译的后的nupkg包解压,可以看到编译后的DLL文件,使用反编译工具可以查看dll内的源码,如图所示:

防范措施
Virbox Protector
工具在对 .NET 程序的保护上有着成熟的方案,在打包nupkg时可以将工具集成到vs的生成事件内,如图所示:

- 添加事件命令后,.csproj文件配置内变为如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<PackageId>vbp.localdemo</PackageId>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Platforms>AnyCPU;ARM64;ARM32</Platforms>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Version>1.0.3</Version>
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
</PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command=""C:\Program Files\senseshield\Virbox Protector 3\bin\virboxprotector_con.exe" $(Targetpath) --pack=1 --jit-enc=1 --rename=0 -o $(Targetpath)" />
</Target>
</Project>
- 然后按照之前打包的方式打包nupkg包;
- 解压打包后nupkg包,可以看到编译后的DLL文件,使用反编译工具反编译查看dll,无法查看到dll的代码逻辑。如图所示:

END