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

问题描述 投票:12回答:7

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

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也都是Target .NET 2.0。

我已经使用dotPeek来检查构建的库,并且看不到任何使用.NET 4.0的引用。

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

如果有人能告诉我为什么会这样,真棒!如果没有,关于如何弄清楚不受干扰的“间接参考”的一些方向将同样有用!

顺便说一下,我已经尝试了以下所有工具来获取一些信息,但它们并没有告诉我很多我还不知道(这是有问题的DLL的直接依赖性); - .NET Reflector - dotPeek - IldAsm - 取决于(Dependency Walker)

c# visual-studio-2010 projects-and-solutions postsharp
7个回答
5
投票

虽然我实际上没有找到一个好方法来实际解决确定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开始使用我告诉它的引用,而不是想出“使用这个文件”和“使用这个特定版本意味着什么”。

解决了,但我会喜欢更清洁的方式来做到这一点!


2
投票

尝试使用MSIL Disassembler工具来处理所有可疑组件。

  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程序集加载的类型,以#inf作为搜索条件。这是您可以在屏幕中找到的类型示例 TypeRef#18(01000012) 令牌:0x01000012 ResolutionScope:0x23000001 TypeRefName:System.Runtime.CompilerServices.CompilationRelaxationsAttribute
  2. 调查使用该类型的原因。

更新:您是否尝试在Tools \ Options \ Projects和Solutions \ Build And Run页面上将“MSBuild项目构建输出详细程度”设置为“详细”,然后重建解决方案?您可能会在ResolveAssemblyReference目标中看到一些内容


2
投票

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


1
投票

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

在app.config中找到它:

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

删除dependentAssembly并让我的应用程序再次运行。


0
投票

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


0
投票

我也有这个问题,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”并构建了解决方案。


0
投票

我在针对.NET 4.5的项目中遇到System.Data.SQLite.dll问题,结果是GAC_32安装了一个针对4.5.1的版本。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.