我想知道如何确定此构建错误的来源;
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)
虽然我实际上没有找到一个好方法来实际解决确定MsBuild如何确定它所使用的引用的问题(为什么它不只是告诉我它是如何产生这些间接引用的,而不是让我猜我没有知道...)我已经解决了我的问题。
最后,我基本上删除了“主要参考”项目中的所有引用(这需要逐个排除所有代码 - 这是一个有点痛苦的过程)来确定所谓的.NET 4.0库的间接引用的来源是由引用的第三方DLL。
但是,我确实认为MsBuild在这个问题背后有一个错误,因为;
现在,另一个好奇心是我在一段时间内没有触及或改变相关的库,所以这已经开始发生了一些其他无关的原因 - 可能是什么,我不知道。
最后,我发现解决此问题的唯一方法是为每个相关的库运行gacutil / u以删除以前安装/使用的4.0库的版本。 (包中大约有40个,所以这也很痛苦!因为软件包的卸载程序没有删除GAC中的库)
这似乎让msbuild开始使用我告诉它的引用,而不是想出“使用这个文件”和“使用这个特定版本意味着什么”。
解决了,但我会喜欢更清洁的方式来做到这一点!
尝试使用MSIL Disassembler工具来处理所有可疑组件。
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)
更新:您是否尝试在Tools \ Options \ Projects和Solutions \ Build And Run页面上将“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的项目中遇到System.Data.SQLite.dll问题,结果是GAC_32安装了一个针对4.5.1的版本。
如果我用Copy Local = True
构建解决方案,一切都会好的。但是当我在最终构建中嵌入SQLite程序集时,这似乎是不必要的,我想要解决它。
我尝试运行gacutil -u System.Data.SQLite.dll
但是遇到了麻烦所以最后我只是使用Windows的程序和功能卸载它然后一切都很顺利。