I suppose you will need to load a separate assembly with your own .config file, no? One way to do this is to load the assembly into the new AppDomain. You can deploy this assembly in a separate folder with all the necessary links.
First configure AppDomain, here you have a method:
AppDomain getAppDomainForAssembly(string assemblypath, string appdomainname) { //this._assembly_file = AssemblyFile; string _assembly_file_name = System.IO.Path.GetFileName(assemblypath); string _rootpath = System.IO.Path.GetDirectoryName(assemblypath); //this._assembly_class_name = AssemblyClassNameToInstance; AppDomainSetup _app_domain_info = new AppDomainSetup(); _app_domain_info.ApplicationBase = _rootpath; _app_domain_info.PrivateBinPath = _rootpath; _app_domain_info.PrivateBinPathProbe = _rootpath; _app_domain_info.ConfigurationFile = _rootpath + @"\app.config"; //Here put the path to the correct .assembly .config file AppDomain _app_domain = AppDomain.CreateDomain( appdomainname, null, _app_domain_info); return _app_domain; }
Then get an instance of the object that executes the build method:
protected System.Reflection.Assembly _asm_resolve(string assemblyFile) { return System.Reflection.Assembly.LoadFrom(assemblyFile); } object getInstanceFromAppDomain(ref AppDomain appDomain, string assemblyPath, string className = null) { if (string.IsNullOrEmpty(className)) { System.Reflection.Assembly assembly = _asm_resolve(assemblyPath); System.Reflection.MethodInfo method = assembly.EntryPoint; return appDomain.CreateInstanceFromAndUnwrap(assemblyPath, method.Name); } else { return appDomain.CreateInstanceFromAndUnwrap(assemblyPath, className); } }
Even if we know the type of an object, we can create a method with a common type:
T getInstanceFromAppDomain<T>(ref AppDomain appDomain, string assemblyPath, string className = null) { if (string.IsNullOrEmpty(className)) { System.Reflection.Assembly assembly = _asm_resolve(assemblyPath); System.Reflection.MethodInfo method = assembly.EntryPoint; return (T)appDomain.CreateInstanceFromAndUnwrap(assemblyPath, method.Name); } else { return (T)appDomain.CreateInstanceFromAndUnwrap(assemblyPath, className); } }
And then the method of the created instance is called, which is executed in the new appDomain:
void executeMethod(Type objecttype, string methodname, ref object instancedObject, object[] methodparams) { objecttype.InvokeMember( methodname, System.Reflection.BindingFlags.InvokeMethod, null, instancedObject, methodparams); }
You can use the following:
AppDomain newappdomain = getAppDomainForAssembly(filePath, "Loaded.exe.domain"); object loadedexe_object = getInstanceFromAppDomain(ref newappdomain, filePath);
For the second question, you can use NamedPipes, Remoting, WCF ... You need to implement interprocess communication on one machine. Take a look at the MSDN documentation, sample code covering this scenario using WCF http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx
See this example in CodeProject using Remoting Inter-process communication via Remoting