为什么我的解决方案使用错误的 dll 版本构建?

Pie*_*arg 5 c# msbuild nuget

我正在使用 Microsoft.SQLServer.Types 来使用空间类型。我正在从 Nuget 安装 11.x 版。

当我使用 Visual Studio (2013) 发布解决方案时,它将版本 11.x 复制到 bin 文件夹。

但是,当我使用 MSBuild 进行构建时,它会将版本 10.x 复制到 bin 文件夹中。

任何想法为什么?

这是引用 dll 的 csproj 文件的一部分:

<Reference Include="Microsoft.SqlServer.Types, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
    <HintPath>..\packages\Microsoft.SqlServer.Types.11.0.1\lib\net20\Microsoft.SqlServer.Types.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

此外,复制本地设置为 true。

另外,我在该项目的 web.config 中有这个:

<dependentAssembly>
    <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

TTT*_*TTT 0

tl;dr:检查所有子项目对该 dll 的引用。可能其中一个(或多个)仍在引用旧版本。

细节:

首先,web.configbindingRedirect仅在运行时相关,因此与您的发布问题无关。

和您一样(甚至 8 年后),我也目睹过 Visual Studio 发布的 dll 版本与从命令行发布时不同的情况msbuild。尽管我从未花时间证明这一点,但我怀疑 VS 发布参考文献的顺序与msbuild实际略有不同。无论它们为何不同,解决方案都是修复对该 dll 的所有子项目引用,而不仅仅是网站项目。幸运的是,有一种简单的方法可以确定哪个项目仍在引用旧的 dll。

大多数人将msbuild 的“详细”级别更改为“安静”或“最小”以防止过多的日志记录,但如果您暂时将该级别恢复到至少“正常”( -v:n),您应该会看到每个 dll 的列表被复制到临时位置。(可能类似于obj\Release\Package\PackageTmp。)通过日志搜索,您可能会看到正确的 dll 被复制到该目录中,可能会被复制多次,然后同一 dll 的旧版本最后被复制到该目录中,从而覆盖新版本。从那里向上滚动应该可以识别需要更新的项目。