I recently worked on a solution where we needed to use two versions of the same 3rd party DLL within one web app. This was because we were using some new assemblies of a 3rd party library combined with some old assemblies, and they both referenced an assembly with the same name but different versions.
The error we were getting was:
System.IO.FileNotFoundException: File or assembly name Syncfusion.Core, or one of its dependencies, was not found.
Getting around this was tricky, mainly because I have shallow knowledge in this area! Ultimately the only way I could find to make it work was to put the assembly in another folder, and add an assemblyIdentity
option to web.config.
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity
name="Syncfusion.Core"
publicKeyToken="632609b4d040f6b4"
culture="neutral"
/>
<codeBase
version="4.401.0.51"
href="file:///C:/Code/wwwroot_mywebsite.co.uk/bin/dependentAssemblies/Syncfusion.Core.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<appSettings>
...
So, in the filesystem you end up with :
/bin/Syncfusion.Core.DLL -> Syncfusion.Core, Version=5.101.0.51, Culture=neutral, PublicKeyToken=632609b4d040f6b4
/bin/dependentAssemblies/Syncfusion.Core.DLL -> Syncfusion.Core, Version=4.401.0.51, Culture=neutral, PublicKeyToken=632609b4d040f6b4
Is there a better way?
I tried getting .NET (1.1) to probe a new folder in the application directory like this:
<probing privatePath="bin/dependentAssemblies" />
But that didn't work, when the runtime tryied to find the assemblies, I could see it going through /bin folder and the GAC, but not the privatePath for some reason.
I also tried adding both versions of the assembly directly as follows, and renaming the DLL and dropping it alongside the other in the bin folder.
<assemblies>
<add assembly="Syncfusion.Core, Version=5.101.0.51, Culture=neutral, PublicKeyToken=632609b4d040f6b4"/>
<add assembly="Syncfusion.Core, Version=4.401.0.51, Culture=neutral, PublicKeyToken=632609b4d040f6b4"/>
</assemblies>
But no luck there either. I think it was down to .NET not being happy with me renaming DLLs that are strongly named/signed (which would make sense).
Anyway, hope this helps someone. If anyone knows some good resources for getting your head around this stuff, let me know.
Here's some I found so far: