我的.csproj项目简单参考。
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
...
<ItemGroup>
<Reference Include="System.Net.Http" />
</ItemGroup>
...
我还有用于NuGet引用的project.json
{
"dependencies": {
"SomePackage": "1.1.1-beta",
},
"runtimes": {
"win": {}
},
...
使用此设置可以正常工作。 但最近&#34; SomePackage&#34;开始依赖另一个包,通过一堆传递依赖依赖于NETStandard.Library&#34;版本=&#34; 1.6.1&#34;
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>Microsoft.Extensions.Configuration</id>
<version>1.1.0</version>
<dependencies>
<group targetFramework=".NETStandard1.1">
<dependency id="Microsoft.Extensions.Configuration.Abstractions" version="1.1.0" />
<dependency id="NETStandard.Library" version="1.6.1" />
</group>
</dependencies>
</metadata>
</package>
NETStandard.Library依赖于较新版本的System.Net.Http 4.1.0.0
当我编译项目时,程序集开始直接引用新版本System.Net.Http。
然后当然它开始在运行时要求这个dll。
我编译.net 4.6.2和针对.Net标准1.1编译的Microsoft.Extensions.Configuration。所以它应该在安装了4.6.2的机器上工作。 但4.6.2不包含System.Net.Http 4.1.0.0的新版本
所以我的问题是如何阻止NuGet和MsBuild将我的程序集的直接引用升级到我使用的包的传递依赖项版本?
谢谢。
答案 0 :(得分:0)
如果您只担心其唯一的汇编参考,那么AutoUnifyAssemblyReferences
就是您的答案。如果您使用的是Visual Studio 2017,请转到路径C:\Program Files (x86)\MSBuild\14.0\Bin
(或安装相应MSBuild版本的相应路径)并搜索Microsoft.CSharp.targets
文件。这是Visual Studio使用的目标文件,因此在构建解决方案时由MSBuild使用。在此文件中,您可以添加以下标记:
<AutoUnifyAssemblyReferences>false</AutoUnifyAssemblyReferences>
在这些更改后保存文件。所有后续版本都将阻止自动装配版本升级。 警告:此设置将应用于使用特定版本的Visual Studio / MSBuild构建的所有项目。解决问题后,您可以恢复为目标文件的原始版本。
为防止NuGet自动升级,您可以参考解决此问题的this堆栈溢出帖子。
编辑:如果你想在项目级别控制它,这里是你如何做到这一点。在csproj
文件中,标识包含<Target>
标记的部分(可能会被评论),并按以下方式修改:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="BeforeResolveReference">
<AutoUnifyAssemblyReferences>false</AutoUnifyAssemblyReferences>
</Target>
</Import>
我自己从未尝试过,但这应该在理论上有效。 Here是您可以覆盖的所有目标名称的链接,用于将AutoUnifyAssemblyReferences
标记设置为false。