You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将两个.NET Framework类库合并为单个NuGet包?

将多个.NET Framework类库打包到单个NuGet包的解决方案

问题根源

你当前的配置里,<PrivateAssets>all</PrivateAssets> 是核心问题——这个设置会把ClassLibA和ClassLibB标记为私有依赖,意味着它们不会被包含到生成的NuGet包中,也不会作为依赖项传递给安装包的项目。即便设置了<IncludeReferencedProjects>true</IncludeReferencedProjects>,也会被PrivateAssets的优先级覆盖。

解决方法

方法1:修改MergerClassLin.csproj的项目引用配置

调整ProjectReference的私有资产设置,让引用的类库能被包含到NuGet包中:

<PropertyGroup>
    <TargetFramework>net472</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <IncludeReferencedProjects>true</IncludeReferencedProjects>
</PropertyGroup>

<ItemGroup>
    <ProjectReference Include="..\ClassLibA\ClassLibA.csproj">
        <!-- 移除私有资产限制,允许引用项目的所有资产被包含 -->
        <PrivateAssets>none</PrivateAssets>
        <IncludeAssets>all</IncludeAssets>
    </ProjectReference>
    <ProjectReference Include="..\ClassLibB\ClassLibB.csproj">
        <PrivateAssets>none</PrivateAssets>
        <IncludeAssets>all</IncludeAssets>
    </ProjectReference>
</ItemGroup>
  • <PrivateAssets>none</PrivateAssets>:解除私有资产限制,允许引用项目的所有资产(dll、pdb等)被传递并纳入NuGet包
  • <IncludeAssets>all</IncludeAssets>:明确指定包含引用项目的所有类型资产
  • <IncludeReferencedProjects>true</IncludeReferencedProjects>:确保构建时自动将引用项目的输出打包进NuGet包

方法2:使用NuSpec文件手动打包(更灵活可控)

如果需要精细控制包内的文件内容,可以创建.nuspec文件手动指定要包含的资源:

  1. 在MergerClassLin项目根目录创建MergerClassLin.nuspec:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>MergerClassLin</id>
    <version>1.0.0</version>
    <authors>你的名称</authors>
    <description>包含ClassLibA和ClassLibB的合并NuGet包</description>
    <dependencies>
      <group targetFramework=".NETFramework4.7.2" />
    </dependencies>
  </metadata>
  <files>
    <!-- 包含ClassLibA的输出文件 -->
    <file src="..\ClassLibA\bin\Release\net472\ClassLibA.dll" target="lib\net472" />
    <file src="..\ClassLibA\bin\Release\net472\ClassLibA.pdb" target="lib\net472" />
    <!-- 包含ClassLibB的输出文件 -->
    <file src="..\ClassLibB\bin\Release\net472\ClassLibB.dll" target="lib\net472" />
    <file src="..\ClassLibB\bin\Release\net472\ClassLibB.pdb" target="lib\net472" />
    <!-- 可选:包含MergerClassLin自身的文件 -->
    <file src="bin\Release\net472\MergerClassLin.dll" target="lib\net472" />
    <file src="bin\Release\net472\MergerClassLin.pdb" target="lib\net472" />
  </files>
</package>
  1. 在项目根目录执行打包命令:
nuget pack MergerClassLin.nuspec -Properties Configuration=Release

这种方式完全自主可控,你可以精确指定要包含的文件,不受项目引用配置的限制。

方法3:合并为单个DLL(可选场景)

如果你的目标是将多个DLL合并成一个,可以使用ILMerge工具:

  • 安装ILMerge:Install-Package ILMerge
  • 在项目的构建后事件中添加合并命令:
ILMerge.exe /out:$(OutputPath)\Merged.dll $(OutputPath)\MergerClassLin.dll $(OutputPath)\ClassLibA.dll $(OutputPath)\ClassLibB.dll /target:library /targetplatform:v4,4.7.2

打包时仅包含合并后的Merged.dll即可。注意:这种方式可能影响强命名、反射等特性,需要测试验证。

验证打包结果

打包完成后,可使用NuGet Package Explorer打开生成的.nupkg文件,检查lib/net472目录下是否包含了所需的所有DLL文件。

内容的提问来源于stack exchange,提问作者Sarvesh Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:43:23