public void Main() { try { //Create invocationManager, a tool to instanciate classes remotely in a disposable AppDomain using (Remoting.InvocationManager invocationManager = new Remoting.InvocationManager()) { //The assembly (dll or exe) containing our class string assemblyFile = @"C:\DEV\DllTestBed\SampleDlls\NotStrongNamedAssemblyDependentDll.dll"; //Namespace.ClassName inside the assembly string typeName = "NotStrongNamedAssemblyDependentDll.Class1"; List<string> assembliesLookupPaths = new List<string>(); //Look for assemblies referenced by assemblyFile in the following directory (there can be more) assembliesLookupPaths.Add(@"C:\DEV\DllTestBed\Another folder somewhere"); //Instanciate our NotStrongNamedAssemblyDependentDll.Class1 in a disposable Appdomain (born in invocationManager): Remoting.IRemote remoteObject1 = invocationManager.InstanciateRemotely(assemblyFile, typeName, null, assembliesLookupPaths.ToArray()); object[] constructorParameters = new object[1]; constructorParameters[0] = 5; string randomString = (string) invocationManager.Invoke(remoteObject1, "GetRandomString", constructorParameters); //Now the assembly referenced by assemblyFile is locked. MessageBox.Show("NotStrongNamedAssemblyDependentDll generated string: " + randomString); } //Now the assembly referenced by assemblyFile is unlocked, and can be overwritten without exiting Mercator! } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
private void buttonRun2_Click(object sender, EventArgs e) { //Creating and Using Strong-Named Assemblies: http://msdn.microsoft.com/en-us/library/xwb8f617.aspx //Dot NET Assemblies and Strong Name Signature: http://resources.infosecinstitute.com/dot-net-assemblies-and-strong-name-signature/ try { using (Remoting.InvocationManager invocationManager = new Remoting.InvocationManager()) { string assemblyFile = @"C:\DEV\DllTestBed\SampleDlls\StrongNamedAssemblyDependentDll.dll"; string typeName = "StrongNamedAssemblyDependentDll.Class1"; List<string> assembliesLookupPaths = new List<string>(); assembliesLookupPaths.Add(@"C:\DEV\DllTestBed\Another folder somewhere"); Remoting.IRemote remoteObject = invocationManager.InstanciateRemotely(assemblyFile, typeName, null, assembliesLookupPaths.ToArray()); bool answer = (bool)invocationManager.Invoke(remoteObject, "StrongNamedAssemblyCall", null); MessageBox.Show("Réponse: " + answer.ToString()); //The second call will, as expected, not have to load the assembly in the disposableAppDomain again //Remoting.IRemote remoteObject2 = invocationManager.InstanciateRemotely(assemblyFile, typeName, null, assembliesLookupPaths.ToArray()); //bool answer2 = (bool)invocationManager.Invoke(remoteObject2, "StrongNamedAssemblyCall", null); //MessageBox.Show("Réponse: " + answer2.ToString()); } //Some strongly named assemblies (MercatorTunnel.dll, ...) stay locked while used through the debugged application in Visual Studio, //but not when used through the same application launched normally. } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
private void buttonRun_Click(object sender, EventArgs e) { try { using (Remoting.InvocationManager invocationManager = new Remoting.InvocationManager(/*dllRootProbingDirectory, dllProbingDirectories.ToArray()*/)) { string assemblyFile = @"C:\DEV\DllTestBed\SampleDlls\NotStrongNamedAssemblyDependentDll.dll"; string typeName = "NotStrongNamedAssemblyDependentDll.Class1"; List<string> assembliesLookupPaths = new List<string>(); assembliesLookupPaths.Add(@"C:\DEV\DllTestBed\Another folder somewhere"); Remoting.IRemote remoteObject1 = invocationManager.InstanciateRemotely(assemblyFile, typeName, null, assembliesLookupPaths.ToArray()); object[] constructorParameters = new object[1]; constructorParameters[0] = 5; string randomString = (string)invocationManager.Invoke(remoteObject1, "GetRandomString", constructorParameters); MessageBox.Show("NotStrongNamedAssemblyDependentDll generated string: " + randomString); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }