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

MSBuild:为引用的DLL文件名添加版本号

如何让NuGet引用的DLL在构建后文件名包含版本号

当然可以实现这个需求!下面分享两种实用的方法,帮你避免不同版本DLL的冲突问题:

方法一:通过MSBuild自定义目标重命名(推荐)

你可以直接在项目文件(.csproj)中添加自定义的MSBuild目标,在构建完成后自动将bin目录里的DLL重命名为包含版本号的格式。

步骤如下:

  1. 右键你的项目 → 选择「编辑项目文件」(老版本VS可能需要先卸载项目再编辑)
  2. 在文件末尾的</Project>标签前,添加以下代码:
<Target Name="RenameAssembliesWithVersion" AfterTargets="AfterBuild">
  <ItemGroup>
    <!-- 获取bin目录下的非系统程序集,可按需调整排除规则 -->
    <ReferenceAssemblyFiles Include="$(OutputPath)*.dll" Exclude="$(OutputPath)System*.dll;$(OutputPath)Microsoft*.dll" />
  </ItemGroup>
  <GetAssemblyIdentity AssemblyFiles="@(ReferenceAssemblyFiles)">
    <Output TaskParameter="Assemblies" ItemName="AssemblyIdentities" />
  </GetAssemblyIdentity>
  <!-- 遍历程序集,重命名为「文件名.版本号.dll」格式 -->
  <Move SourceFiles="@(ReferenceAssemblyFiles)" 
        DestinationFiles="$(OutputPath)%(AssemblyIdentities.Filename).%(AssemblyIdentities.Version)%(ReferenceAssemblyFiles.Extension)"
        Condition="'%(AssemblyIdentities.Version)' != ''" />
</Target>

这段代码会自动把bin目录下的非系统DLL改成类似nunit.framework.3.9.0.dll的格式,你可以根据项目需求调整Exclude里的排除规则。

方法二:针对单个NuGet包单独配置

如果只需要处理特定的几个NuGet包,你可以单独为它们配置复制逻辑:

  1. 编辑项目文件,找到目标NuGet包的引用节点,比如NUnit的引用:
<Reference Include="nunit.framework, Version=3.9.0.0, Culture=neutral, PublicKeyToken=xxxxxx, processorArchitecture=MSIL">
  <HintPath>..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll</HintPath>
  <Private>True</Private>
</Reference>
  1. 在文件末尾添加针对该包的自定义复制目标:
<Target Name="CopyNUnitWithVersion" AfterTargets="ResolveReferences">
  <GetAssemblyIdentity AssemblyFiles="..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll">
    <Output TaskParameter="Assemblies" ItemName="NUnitAssembly" />
  </GetAssemblyIdentity>
  <Copy SourceFiles="..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll"
        DestinationFiles="$(OutputPath)nunit.framework.%(NUnitAssembly.Version).dll" />
  <!-- 可选:删除原文件名的DLL,避免重复 -->
  <Delete Files="$(OutputPath)nunit.framework.dll" />
</Target>

这种方法灵活性高,但需要为每个不同的包单独配置,适合少量特定包的场景。

注意事项

  • 重命名DLL后不用担心引用失效:CLR会根据程序集的强名称(如果有)加载对应版本,文件名不影响程序集识别。
  • .NET Core/.NET 5+项目同样适用,只需注意$(OutputPath)默认路径是bin\$(Configuration)\$(TargetFramework)\,可按需调整。
  • 不管你用的是packages.config还是PackageReference格式的NuGet引用,上述MSBuild逻辑都能正常工作。

内容的提问来源于stack exchange,提问作者Piotr Trojan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:14:13