确定不正确的.NET Framework版本的间接依赖的来源(Determine the sourc

2019-07-29 18:11发布

我想知道我怎么能确定这个生成错误的来源;

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,所有这些也目标.NET 2.0的直接依赖性。

我已经使用dotPeek检查内置库,并不能看到使用.NET 4.0的任何任何引用。

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

如果有人能告诉我为什么发生这种情况,太棒了! 如果没有,就如何制定出一些方向是什么unnamaed“间接引用”是会同样有帮助!

顺便说一句,我已经尝试了所有的下列工具来获得一些信息,但他们没有告诉我很多我不知道的(这是有问题的DLL的直接依赖); - .net反射 - dotPeek - 反汇编 - 依赖(Dependency Walker中)

Answer 1:

虽然我还没有真正制定出真正解决确定的MSBuild如何确定它使用(它为什么不直接告诉我怎么说到了这些间接引用,而不是使引用的问题的好方法我想我不知道...)我已经解决了我的问题。

最后,我基本上除去在“主参考”项目,所有参考文献(其需要通过排除所有片码片 - 一个有些痛苦的过程),以确定该假定的间接引用.NET 4.0库的源极是由引起这是引用的第三方DLL。

不过,我相信存在的MSBuild这个问题背后的错误,如;

  1. 第三方DLL被“浏览”参考我的机器上的一个特定的DLL文件 - 一个很露骨仅依赖于.NET 2.0
  2. 在构建设置“特定版本”真没有采取任何行动来解决这个
  3. 的MSBuild似乎是要到海关总署不同版本的DLL,并导致不正确的引用错误。

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

最终,唯一的办法,我发现解决这个问题是运行GACUTIL / U每个相关库中删除的4.0林达以前安装/使用的版本。 (大约有40包,这样也是痛苦的!作为包的卸载程序没有删除该库在GAC)

这似乎已经让MSBuild的开始使用我告诉它,而不是想出了自己的什么“使用此文件”和“使用特定版本意味着想法引用。

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



Answer 2:

尝试使用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#装载作为搜索条件的类型。 这类型的样品,你可以在屏幕上找到

    TypeRef#18(01000012)

    令牌:0x01000012
    ResolutionScope:0x23000001
    TypeRefName:System.Runtime.CompilerServices.CompilationRelaxationsAttribute

  2. 调查为什么使用这种类型。

更新:你有没有尝试设置设置MSBuild项目生成输出的详细程度上工具\选项\项目和解决方案\编译和运行页面,然后重新生成解决方案“详细”? 您可能会看到ResolveAssemblyReference目标的东西



Answer 3:

我有这个问题,使用CheckAsm确定我自己组装一些奇怪的原因之一是指第三方库的.NET 4.0版本,而应用程序本身是.NET 2.0。 我删除组件的所有实例从我的硬盘驱动器(有很多周围地势副本),重建解决方案,一切都很好。



Answer 4:

在我的情况下,大会卸载和所有引用(据我所知)被拆除。

发现它在的app.config:

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

删除了dependentAssembly并得到了我的应用程序再次合作。



Answer 5:

我的猜测是第三方DLL的是,没有具体的版本设置为true,它的依赖性,并导致您的问题之一。



Answer 6:

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



Answer 7:

我有一个项目针对.NET 4.5这竟然是一个版本定位4.5.1安装到GAC_32与System.Data.SQLite.dll问题。

如果我建立与解决方案Copy Local = True ,一切都会很好。 但正如我在最终版本中嵌入SQLite的组件,这似乎没有必要,我想它整理出来。

我试图运行gacutil -u System.Data.SQLite.dll但与它的麻烦所以我只是用Windows的程序和功能卸载它,然后结束一切都很好。



文章来源: Determine the source of an indirect dependency on incorrect .NET Framework version