Skip to main content
Enterprise Agile Planning icon with arrows

This post is from the CollabNet VersionOne blog and has not been updated since the original publish date.

Last Updated Apr 10, 2014 — Enterprise Agile Planning expert

Detecting and loading a non/redistributable dll at run time

Enterprise Agile Planning
Scenario: We have a solution that depends on different versions of a non/redistributable dll, so until now we have created building rules that we use when we want to build against this dll. We have a folder per dll  and we have to pick the correct one for the environment that we want to setup. Question: Can we figure out what is the correct version of the dll installed in the environment and load it programmatically? Yes, we can do that! It’s a solution that isn't pretty but it gets the job done!
  • First of all, we've to declare explicitly what are the assemblies we support for the solution
[code lang="csharp"]supportedDlls = new Dictionary(); supportedDlls.Add( "Microsoft.TeamFoundation.Client", new string[]{ "Microsoft.TeamFoundation.Client, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "Microsoft.TeamFoundation.Client, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "Microsoft.TeamFoundation.Client, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"} ); [/code]
  • In the code where the dlls are used we subscribe to the event that is raised when an assembly cannot be found or loaded.
[code lang="csharp"]AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;[/code]
  • In the handler we try to load another instance of the assembly supported and if it fails we try with the other.
Note: in the handler we first have to unsubscribe from the event to prevent a loop and after try to load the dll subscribe again. [code lang="csharp"]AppDomain.CurrentDomain.AssemblyResolve /= CurrentDomain_AssemblyResolve; Assembly assembly = resolveSupportedAssembly(supportedDlls[args.Name.Split(',').First()]); AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; return assembly; static Assembly resolveSupportedAssembly(string[] versions) { Assembly assembly = null; foreach (string version in versions){ try { assembly = Assembly.Load(version); return assembly; } catch{} } return assembly; } [/code]Recap: So if the environment where you want to run the application has the same version of the dll that the solution compiled has it will work without needing to do anything else. In the case that the environment has another version of the dll installed (e.g a major version) , when the application runs, it will make use of the loop in the code trying to load the correct dll by itself. Here is the link to the repository with this sample code:

More from the Blog

View more Government Cloud
Apr 12, 2022 Government Cloud receives FedRAMP Authorization through sponsorship from the United States Department of Veterans Affairs

Enterprise Agile Planning
Flagship Agility solutions can effectively scale agile deve ...
Read More
Nov 22, 2021

What are the qualities of highly effective agile teams?

Enterprise Agile Planning
A team is the core unit of productivity in an agile organization. Wher ...
Read More
Nov 15, 2021

How an open-first attitude revolutionized government tech development

Enterprise Agile Planning
Public perception of government is often that it is slow-moving, reluc ...
Read More
cross functional
Nov 08, 2021

6 best practices for building resilient cross-functional teams

Enterprise Agile Planning
Agile frameworks prize the quality of resilience within every facet of ...
Read More
Contact Us