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

.NET 8中如何恢复同一NuGet包的多个版本用于测试?

解决.NET 8 CPM下获取同一SDK多版本的问题

核心方案:用PackageDownload替代重复PackageReference

NuGet的PackageDownload项专门用来下载指定版本的包到本地缓存,不会将其添加为项目引用,完美适配你“仅下载、通过反射加载”的需求,且不会触发重复引用的错误。

在测试项目的csproj中添加如下配置:

<ItemGroup>
  <!-- 明确指定需要下载的每个SDK版本 -->
  <PackageDownload Include="Foo.Bar.Sdk" Version="[1.0.0]" />
  <PackageDownload Include="Foo.Bar.Sdk" Version="[2.0.0]" />
</ItemGroup>

执行dotnet restore后,这两个版本的SDK都会被下载到本地NuGet缓存目录(默认路径:%userprofile%\.nuget\packages或~/.nuget/packages)。

进阶:自动复制SDK到输出目录(方便反射加载)

如果希望把不同版本的SDK程序集复制到测试项目的输出目录,便于后续反射加载,可以添加自定义MSBuild目标:

<ItemGroup>
  <!-- 也可以用版本范围批量指定,比如[1.0.0, 3.0.0)会下载1.x和2.x的所有版本 -->
  <PackageDownload Include="Foo.Bar.Sdk" Version="[1.0.0, 2.0.1]" />
</ItemGroup>

<Target Name="CopySdkVersionsToOutput" AfterTargets="Restore">
  <!-- 匹配缓存中所有版本的Foo.Bar.Sdk.dll -->
  <ItemGroup>
    <SdkAssemblies Include="$(NuGetPackageRoot)foo.bar.sdk\*\lib\net8.0\Foo.Bar.Sdk.dll" />
  </ItemGroup>
  <!-- 复制到输出目录的SdkVersions子文件夹,按版本号分类存放 -->
  <Copy 
    SourceFiles="@(SdkAssemblies)" 
    DestinationFolder="$(OutputPath)SdkVersions\%(SdkAssemblies.RecursiveDir)" 
    SkipUnchangedFiles="true"
  />
</Target>

执行dotnet build后,你会在输出目录的SdkVersions文件夹下看到按版本号分目录存放的SDK程序集,直接用Assembly.LoadFrom加载即可。

为什么原来的方案行不通?

CPM的VersionOverride是用来覆盖中心包版本的,但NuGet默认会合并重复的PackageReference项——哪怕添加了ExcludeAssets="all",最终也只会保留最高版本的引用。而PackageDownload不受这个合并规则限制,允许明确指定多个版本进行下载。

内容的提问来源于stack exchange,提问作者Edwin Young

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:33:24