我想知道我怎么能确定这个生成错误的来源;
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中)
虽然我还没有真正制定出真正解决确定的MSBuild如何确定它使用(它为什么不直接告诉我怎么说到了这些间接引用,而不是使引用的问题的好方法我想我不知道...)我已经解决了我的问题。
最后,我基本上除去在“主参考”项目,所有参考文献(其需要通过排除所有片码片 - 一个有些痛苦的过程),以确定该假定的间接引用.NET 4.0库的源极是由引起这是引用的第三方DLL。
不过,我相信存在的MSBuild这个问题背后的错误,如;
- 第三方DLL被“浏览”参考我的机器上的一个特定的DLL文件 - 一个很露骨仅依赖于.NET 2.0
- 在构建设置“特定版本”真没有采取任何行动来解决这个
- 的MSBuild似乎是要到海关总署不同版本的DLL,并导致不正确的引用错误。
现在,另一种好奇的是,我还没有接触或在一段时间内改变相关的库,所以这刚刚开始发生了其他一些无关的原因 - 是什么可能是,我不知道。
最终,唯一的办法,我发现解决这个问题是运行GACUTIL / U每个相关库中删除的4.0林达以前安装/使用的版本。 (大约有40包,这样也是痛苦的!作为包的卸载程序没有删除该库在GAC)
这似乎已经让MSBuild的开始使用我告诉它,而不是想出了自己的什么“使用此文件”和“使用特定版本意味着想法引用。
解决了,但我会喜欢一个更清洁的方式来做到这一点!
尝试使用MSIL反汇编工具,对所有可疑的程序集。
- 打开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)
发现是从.NET组件usinf REF#装载作为搜索条件的类型。 这类型的样品,你可以在屏幕上找到
TypeRef#18(01000012)
令牌:0x01000012
ResolutionScope:0x23000001
TypeRefName:System.Runtime.CompilerServices.CompilationRelaxationsAttribute
调查为什么使用这种类型。
更新:你有没有尝试设置设置MSBuild项目生成输出的详细程度上工具\选项\项目和解决方案\编译和运行页面,然后重新生成解决方案“详细”? 您可能会看到ResolveAssemblyReference目标的东西
我有这个问题,使用CheckAsm确定我自己组装一些奇怪的原因之一是指第三方库的.NET 4.0版本,而应用程序本身是.NET 2.0。 我删除组件的所有实例从我的硬盘驱动器(有很多周围地势副本),重建解决方案,一切都很好。
在我的情况下,大会卸载和所有引用(据我所知)被拆除。
发现它在的app.config:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
...
</dependentAssembly>
</assemblyBinding>
</runtime>
删除了dependentAssembly并得到了我的应用程序再次合作。
我的猜测是第三方DLL的是,没有具体的版本设置为true,它的依赖性,并导致您的问题之一。
我也有这个问题,并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”,并建立了解决方案。
我有一个项目针对.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