Do you ever get these kinds of messages when you compile your project?
------ Build started: Project: Suteki.Shop.CreateDb, Configuration: Debug x86 ------
No way to resolve conflict between "System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
and "System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35".
Choosing "System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" arbitrarily.
Consider app.config remapping of assembly "NHibernate, Culture=neutral, PublicKeyToken=aa95f207798dfdb4"
from Version "3.0.0.2001" [] to Version "3.0.0.4000"
[D:\Source\sutekishop\Suteki.Shop\packages\NHibernate.3.0.0.4000\lib\NHibernate.dll] to solve conflict and get rid of warning.
Consider app.config remapping of assembly "System.Web.Mvc, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
from Version "2.0.0.0" [C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll] to Version "3.0.0.0"
[C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.Mvc.dll] to solve conflict and get rid of warning.
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9): warning MSB3247:
Found conflicts between different versions of the same dependent assembly.
Suteki.Shop.CreateDb -> D:\Source\sutekishop\Suteki.Shop\Suteki.Shop.CreateDb\bin\Debug\Suteki.Shop.CreateDb.exe
The problem is that the build output doesn’t tell me which of my assemblies references version 2.0.0.0 of System.Web.Mvc and which references version 3.0.0.0.
If you’re writing software using lots of 3rd party assemblies like I do, it’s a constant problem. I’ve written a little bit of code that I drag around with me that outputs lists of assemblies that my assemblies reference. I’ve found it very useful for resolving these kinds of issues.
Now I’ve wrapped it up as a little console app, AsmSpy, and put it on github here:
https://github.com/mikehadlow/AsmSpy
Or you can download a zip file of the compiled tool here:
https://github.com/downloads/mikehadlow/AsmSpy/AsmSpy.zip
How it works:
Simply run AsmSpy giving it a path to your bin directory (the folder where your project's assemblies live). E.g:
AsmSpy D:\Source\sutekishop\Suteki.Shop\Suteki.Shop\bin
It will output a list of all the assemblies referenced by your assemblies. You can look at the
list to determine where versioining conflicts occur.
The output looks something like this:
....
Reference: System.Runtime.Serialization
3.0.0.0 by Microsoft.ServiceModel.Samples.XmlRpc
3.0.0.0 by Microsoft.Web.Mvc
4.0.0.0 by Suteki.Shop
Reference: System.Web.Mvc
2.0.0.0 by Microsoft.Web.Mvc
3.0.0.0 by MvcContrib
3.0.0.0 by MvcContrib.FluentHtml
3.0.0.0 by Suteki.Common
2.0.0.0 by Suteki.Common
3.0.0.0 by Suteki.Shop
2.0.0.0 by Suteki.Shop
Reference: System.ServiceModel.Web
3.5.0.0 by Microsoft.Web.Mvc
Reference: System.Web.Abstractions
3.5.0.0 by Microsoft.Web.Mvc
....
You can see that System.Web.Mvc is referenced by 7 assemblies in my bin folder. Some reference
version 2.0.0.0 and some version 3.0.0.0. I can now resolve any conflicts.
12 comments:
Holy smokes are you spying on me? This is exactly the problem I've been having the last couple of days. I've been using PowerShell in a similar way, but not looking at the references inside files (I was using Reflector for that), more to find out what versions of what assemblies are where in my working copy.
Something like this:
PS C:\data files\projects> gci -Filter Castle.Core.dll -r | %{ $_.VersionInfo } | group-object ProductVersion
Awesome, this helped me today...cheers.
Thanks Mark, this has already helped me.
very nice and usefull little tool. maybe a SortedDictionary would be nice for the output. thanks!
Marco, do you mean sort the dependencies by name?
Was talking about sorting the references on namespace for easy searching, but maybe the other way around might be useful too.
great work
... or you may add the following to the section of your *.config file:
*---runtime---*
*---assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"---*
*---dependentAssembly---*
*---assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /---*
*---bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" /---*
*---/dependentAssembly---*
*---/assemblyBinding---*
*---/runtime---*
Replace *--- with a less-than and ---* with a greater-than symbol.
I'm having a terrible time getting this to work on projects that reside on a network share. Any ideas of how to get it to work? I'm getting a "Failed to load assembly: " error.
Bernie
Thank you, this helped me.
I run it in another way: cd to your bin, then:
C:\alreay\at\bin\asmspy .
Brilliant! Helped me so much :)
Post a Comment