Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Could not load file or assembly 'Microsoft.Practices.Unity'

I am trying to upgrade Unity to version (2.1.505.2), but when I run the application I get the following FileLoadException

Could not load file or assembly 'Microsoft.Practices.Unity, Version=2.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies.

We are upgrading from Unity 2.0.414.0 to 2.1.505.2.

  • All project references in the solution that refer to Unity refer to the correct version of the dll
  • There is no Unity dll referenced in the Gac. (double checked by checking gacutil -l)
  • I removed all Unity dlls from the archive. Double checked with powershell

    PS C:\> ls -rec -inc Microsoft.Practices.Unity.dll | foreach-object { "{0}`t{1}" -f $_.FullName, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
    

How can I find out what / who still refers to the Unity 2.0.414.0?

FusionLogVw doesn't tell me which DLL is causing the problem.

Any help is much appreciated!

like image 260
bas Avatar asked Jan 20 '14 19:01

bas


2 Answers

The problem was another Microsoft dll that refers to the old version of unity. I found this out be accident be checking the namespaces of every referenced dll, and found another dll that contained namespaces with "unity".

Updating:

  • Microsoft.Practices.EnterpriseLibrary.Common
  • Microsoft.Practices.EnterpriseLibrary.Validation

to latest released versions resolved the problem.

I hope I save the day for some lost soul out there who's also pulling his hair out over this issue... :)

like image 144
bas Avatar answered Nov 07 '22 18:11

bas


The binding redirect should be pointed to a proper assembly version.

For your case version 2.1.505.0 should be used!

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.1.505.0" newVersion="2.1.505.0" />
  </dependentAssembly>
</assemblyBinding>

2.1.505.2 cannot be specified because of next reason:

enter image description here

Unity assembly 2.1.505.2 has different versions specified in the AssemblyFileVersion and AssemblyVersion.

CLR is working with the AssemblyVersion and AssemblyFileVersion is ignored but NuGet is working with the AssemblyFileVersion!

So that's why you have this difference!

Please use AssemblyVersion

like image 42
Ievgen Avatar answered Nov 07 '22 17:11

Ievgen