Hello,

I have an application that is being deployed on an intranet. The main executable is a windows form that references several DLLs, and these DLLs need to be updated from time to time. Users are using the application by referencing the executable on a shared drive. The problem is that once a user runs the application, the executable and DLLs are locked by the user and therefore cannot be updated.

My solution to the problem is to use a loader program to load the assemblies into memory and have the application reference those instances rather than the files themselves. This works well when I have to maintain just the executable, but I do not understand how to get the executable to reference the loaded DLLs rather than the files.


Thank you for your help!

Code:
 Assembly exeAssembly;
    MethodInfo method;

    public void RunSystem(string ExePath, string[] DLLPaths)
        {
            System.Threading.Thread thd;
            System.Threading.ThreadStart ts;
            FileStream fs;
            BinaryReader br;
            List<Assembly> dllAssemblies;

            //Load the executable file into memory.
            fs = new FileStream(ExePath, FileMode.Open);
            br = new BinaryReader(fs);
            byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
            fs.Close();
            br.Close();
            exeAssembly = Assembly.Load(bin);

            //Load each DLL file into memory
            foreach (string s in DLLPaths)
            {
                fs = new FileStream(ExePath, FileMode.Open);
                br = new BinaryReader(fs);
                bin = br.ReadBytes(Convert.ToInt32(fs.Length));
                dllAssemblies.Add(Assembly.Load(bin));
                fs.Close();
                br.Close();
            }

            //Now that the assemblies are loaded into memory, the DLL references in the executable
            // need to reference the loaded DLL assemblies instead of the DLL files.
            //This is what I do not understand how to do.

            //............


            //Now, create a thread and run the loaded executable on it.
            method = exeAssembly.EntryPoint;
            ts = new System.Threading.ThreadStart(InvokeExe);
            thd = new System.Threading.Thread(ts);
            thd.TrySetApartmentState(System.Threading.ApartmentState.STA);
            thd.Start();
        }

        private void InvokeExe()
        {
		 if (method != null)
             {
               	// create an istance of the Startup form Main method
                  object o = m_Assembly.CreateInstance(m_Method.Name);
                  // invoke the application starting point
                  method.Invoke(o, null);
                }
            }
        }