In my company we wanted to bring together external dlls into one folder named “Libs” next to the executable. Indeed, when you have many dlls (and not all written in C#), it’s more readable to put them all in one folder that contains the dependencies of the project.
1. Add required files then set parameters
The first step is to create a “Libs” folder in your project then add all required files.
Select your all dlls then set the option “Copy to Ouput Directory” to “true“.
Note: If you put some C# dlls in the “Libs” folder” while they are also in the References” section, be sure that you set the “Copy Local” option to “false” in order to have only once the same file in your output.
2. Specify where your program must load the assembly
In my case we are in a WPF application but you can do this in your entry point whatever your type of project.
In the constructor, we have to subscribe to the AssemblyResolve event that is called for each dll. When a dll should be loaded, our handler will override de default behavior only if the current dll is in the Libs folder.
/// /// Initialize the Application /// public App() { var domain = AppDomain.CurrentDomain; domain.AssemblyResolve += LoadAssembly; } |
/// /// Include externals dlls /// private Assembly LoadAssembly(object sender, ResolveEventArgs args) { Assembly result = null; if (args != null && !string.IsNullOrEmpty(args.Name)) { //Get current exe fullpath FileInfo info = new FileInfo(Assembly.GetExecutingAssembly().Location); //Get folder of the executing .exe var folderPath = Path.Combine(info.Directory.FullName, "Libs"); //Build potential fullpath to the loading assembly var assemblyName = args.Name.Split(new string[] { "," }, StringSplitOptions.None)[0]; var assemblyExtension = "dll"; var assemblyPath = Path.Combine(folderPath, string.Format("{0}.{1}", assemblyName, assemblyExtension)); //Check if the assembly exists in our "Libs" directory if (File.Exists(assemblyPath)) { //Load the required assembly using our custom path result = Assembly.LoadFrom(assemblyPath); } else { //Keep default loading return args.RequestingAssembly; } } return result; } |
Comments
Very useful…I just wanted it.
thanks a lot