Need a way to reference 2 different versions of the same 3rd party DLL

It’s achievable even if the two dll versions have the same public token.

Here the steps to achieve this:

  • Ensure that the two version of the dll will be copied to the target directory
    • Add the two dll’s as content items of the project
    • Enable local copy for both
  • Ensure that the two version of the dll will be referenced at compile time
    • Add the two dll’s in the project as references
    • Disable local copy for both

Just add the references is not enough, since only the newer one will be copied (even if you enable local copy for both).
This give a project tree like this:

Project tree

  • Ensure that the two version of the dll can be distinguished at compile time
    • Add an alias for at least on of the references

Aliases field position

  • Reference the libraries in the code using extern alias (see @drf response)

Example code

At this point you can compile but you still have problems at run-time.
To fix those:

Auto-generate binding redirects checkbox position

  • Edit app.config to add an assemblyBinding.
    • assemblyIdentity is the concerned dll.
    • bindingRedirect map a version range (oldVersion) to a fixed version (newVersion).
    • codeBase map a fixed version to a file path (href).

bindingRedirect newVersion and codeBase version must match and match the version of the used dll.

Here, it’s all about the dll assembly version, not the file version
app.config example

Here is the program output:

Console output

This hack source code is available here.

Edit: As sharpiro commented, there is still a warning when the project is built, this is related to this msbuild bug for witch this answer is a workaround.

Leave a Comment