So few days ago I faced with issue of 3rd party references.
My original question on stackoverflow:
What is the best approach to use 3rd party that uses another version of other 3rd party (log4net) already used in the system?
I got (as for now) two answers and I would like to try them out.
So I created 3 projects, one references log4net of version of 18.104.22.168 and another references 22.214.171.124. Both of them are referenced in client console application, which also references one of the log4net assemblies. In client application I’m trying to execute code that requires log4net in both of the assemblies.
Below is projects layout:
When I execute my code I’m getting error:
In order to resolve this I tried suggestion one by one…
Suggestion number 1
Accordingly to MSDN there is possibility to redirect code execution to assembly with higher version, just with using following configuration:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="log4net" publicKeyToken="b32731d11ce58905" culture="neutral" /> <bindingRedirect oldVersion="126.96.36.199" newVersion="188.8.131.52"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
I’ve tried it and it did not work. Reason is that we cannot do redirection between assemblies with different PublicKeyToken-s. log4net 184.108.40.206 has “b32731d11ce58905” and log4net 220.127.116.11 has “1b44e1d426115821”. Also see this stackoverflow question.
Suggestion number 2
Use GAC. So when I install those two assemblies into GAC:
In this case code works, but suggestion doesn’t work for us, since we do not want to gac assemblies we use.
So I’ve been thinking about another approach.
Approaches that require rebuilding our code with different version of log4net are not suitable for us. At least for now.
Another thing about which I’ve been thinking is to load those assemblies into different application domain or host 3rd party that uses 18.104.22.168 under different WinService. Both of these are cumbersome solutions and I like to avoid them.
If you have some ideas, could you please let me know!
[EDITED 7 Oct, 2010 11PM]
Do you know what is the most interesting about all of this? It is how it has finished. We contacted those guys, who developed component we now should use. They gave us know, that they were encountering issues with updating on-the-fly configuration file for log4net 22.214.171.124. By their words, new version of log4net is not capable of doing this. So they sent as simple application that demonstrates this, and indeed, after updating config when app is running, 126.96.36.199 did not catch up new configuration, but 188.8.131.52 was working just fine. This surprised me very much, so I went to this download page and downloaded latest binaries. When I tried it got working!!! Actually I guess that they simply used version of log4net buit with references to .net framework 1.1, and we should use one built with .net 2.0 (Yeah! Actually if you would download you will see.)
After all of this, they created new sub-release of their sources especially for us and they were able to fix some minor bug. Great news! Unexpected end of story! :)
I got error which says “MyApplicationName has stopped working” once deployed simple tool application to the deployment machine which is MS 2008 Server.
But application works just fine on my Dev Machine.
I took a look on event viewer and it says:
It looks like something I was referencing is something in the framework that wasn’t installed on the server.
I remembered that when worked with UI I inadvertently took some thing from ToolBox. I immediately removed that thing, but REFERENCE were left in projects references.
It was Microsoft.VisualBasic and Microsoft.VisualBasic.PowerPacks.Vs.
Once you get errors on deployment machine check carefully if you haven’t referenced something that is not needed. And remember about Event Viewer.