确定对不正确的 .NET Framework 版本的间接依赖关系的来源

本文关键字:依赖 关系 Framework 不正确 NET 版本 | 更新日期: 2023-09-27 18:36:28

我想知道如何确定此构建错误的来源;

Warning 4   The primary reference "MyNamespace.MyProject" could not be resolved because 
   it has an indirect dependency on the .NET Framework assembly "System.Xml, Version=4.0.0.0,
   Culture=neutral, PublicKeyToken=b77a5c561934e089" which has a higher version "4.0.0.0" than
   the version "2.0.0.0" in the current target framework.   MyNamespace.MyOtherProject

理解此错误的含义(以及同一项目中其他 5 个类似的错误),但我无法弄清楚如何在我的情况下解决它。本例中的"主要引用"(MyNamespace.MyProject)对.NET 4.0.x没有直接依赖关系。

主要引用仅依赖于我的另一个项目(MyNamespace.MyCoreProject),构建的源项目(MyNamespace.MyOtherProject)也直接依赖于该项目。并且构建并没有抱怨该项目间接引用了 .NET 4.0.x,所以我认为我可以排除这一点。

主引用直接依赖于三 (3) 个第三方 DLL,所有这些 DLL 也面向 .NET 2.0。

我使用 dotPeek 来检查构建的库,并且无法使用 .NET 4.0 看到对任何内容的引用。

作品中唯一另一个潜在的扳手是使用PostSharp,它被"MyNamespace.MyCoreProject"直接引用(由主要参考项目引用),这可能会导致问题,因为我相信在引用PostSharp时有一个相关的VS2010错误.dll(http://www.sharpcrafters.com/forum/Topic4444-4-1.aspx#bm4462),但是我也从构建链中删除了它,但仍然看到此错误, 所以我想我也可以排除这一点

如果有人能告诉我为什么会发生这种情况,那就太棒了!如果没有,关于如何弄清楚未命名的"间接参考"是什么的一些方向将同样有帮助!

顺便说一句,我已经尝试了以下所有工具来获取一些信息,但它们并没有告诉我很多我还不知道的信息(这是有问题的 DLL 的直接依赖项); - .NET 反射器 - 点皮克 - 伊尔达斯姆 - 依赖(依赖沃克)

确定对不正确的 .NET Framework 版本的间接依赖关系的来源

虽然我实际上还没有找到一个好方法来实际解决确定 MsBuild 如何确定它使用的引用的问题(为什么它不只是告诉我它是如何提出这些间接引用的,而不是让我猜测我不知道......我已经解决了我的问题。

最后,我基本上删除了"主要引用"项目中的所有引用(这需要逐段排除所有代码 - 这是一个有点痛苦的过程),以确定对 .NET 4.0 库的假定间接引用的来源是由引用的第三方 DLL 引起的。

但是,我确实相信此问题背后存在MsBuild中的错误,因为;

  1. "浏览"将第三方 DLL 引用到我机器上的特定 DLL 文件 - 一个非常明确地仅依赖于 .NET 2.0 的文件
  2. 在构建中将"特定版本"设置为 true 没有任何方法可以解决此问题
  3. MsBuild 似乎要转到 GAC 以获取此 DLL 的不同版本,并导致不正确的引用错误。

现在,另一个好奇是我已经有一段时间没有接触或更改相关的库了,所以这才刚刚开始发生,因为其他一些不相关的原因 - 这可能是什么,我不知道。

最后,我发现解决此问题的唯一方法是为每个相关库运行 gacutil/u,以删除以前安装/使用过的 4.0 库版本。(软件包中大约有 40 个,所以这也很痛苦!因为软件包的卸载程序没有删除 GAC 中的库)

这似乎让 msbuild 开始使用我告诉它的参考资料,而不是提出自己的"使用此文件"和"使用此特定版本"的含义。

解决了,但我希望有一种更干净的方法来做到这一点!

尝试对所有可疑程序集使用 MSIL 反汇编程序工具。

  1. 打开 Dll,单击 Ctr + M 并转到屏幕末尾。你可能会看到对某些 .NET 4 程序集的引用,如下所示:

AssemblyRef #1 (23000001)

Token: 0x23000001
Public Key or Token: b7 7a 5c 56 19 34 e0 89 
Name: mscorlib
Version: 4.0.0.0
Major Version: 0x00000004
Minor Version: 0x00000000
Build Number: 0x00000000
Revision Number: 0x00000000
Locale: <null>
HashValue Blob:
Flags: [none] (00000000)
  1. 查找从该 .NET 程序集加载的类型 usinf ref # 作为搜索条件。这是您可以在屏幕中找到的类型示例

    类型参考 #18 (01000012)

    令牌:0x01000012
    分辨率范围:0x23000001
    TypeRefName: System.Runtime.CompilerServices.CompilationRelaxationsAttribute

  2. 调查使用该类型的原因。

更新:是否尝试在"工具''选项''项目和解决方案''生成并运行"页上将"MSBuild 项目生成输出详细程度"设置为"详细",然后重新生成解决方案?您可能会在 ResolveAssemblyReference 目标中看到某些内容

我遇到了这个问题,并使用CheckAsm来确定我自己的一个程序集出于某种奇怪的原因引用了第三方库的.NET 4.0版本,而应用程序本身是.NET 2.0。我从硬盘驱动器中删除了该程序集的所有实例(周围有很多副本),重建了解决方案,一切都很好。

就我而言,程序集被卸载,所有引用(据我所知)都被删除了。

在app.config中找到它:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            ...
        </dependentAssembly>
    </assemblyBinding>
</runtime>     

删除了依赖程序集,让我的应用程序再次运行。

我也有这个问题,event.er 引导我找到解决方案。我的app.config中有以下内容:

  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>

我将newVersion更改为" 2.0.0.0"并构建了解决方案。

我的猜测是第三方 DLL 是没有将特定版本设置为true 的依赖项并导致您的问题的 DLL。

我在面向 .NET 4.5 的项目中遇到了 System.Data.SQLite.dll 的问题,结果发现安装了面向 4.5.1 的版本来GAC_32。

如果我用Copy Local = True构建解决方案,一切都会好起来的。但是当我在最终版本中嵌入SQLite程序集时,这似乎是不必要的,我想解决它。

我尝试运行gacutil -u System.Data.SQLite.dll但遇到了麻烦,所以最后我只是使用 Windows 的程序和功能来卸载它,然后一切都很好。

如果使用Visual Studio 2019并尝试构建.NET 3.5项目,这将有所帮助。

Visual Studio

Service Pack 和较新的 Visual Studio 2019 将程序(通常是 WebDeploy)放在程序文件中,并将此文件夹放在计算机的程序集探测路径中的高位置(因此 net45 JSON.NET 程序集在任何其他程序集之前被拾取)。

要确定您的解析是从哪里解析的,只需使用 SysInternals 进程监视器并过滤引用的 DLL。然后开始构建。进程监视器将告诉您从何处解析该程序集,它通常是VS2019安装的WebDeploy文件夹中的程序集。如果不使用 WebDeploy 工具,则可以清除文件夹。

具体来说,就我的情况而言,我删除了C:'Program Files'IIS'Microsoft Web Deploy V3'Newtonsoft.Json.dll并且我的构建工作正常。