public MyServer(int parentProcessId, string pipeName) { Console.WriteLine("SERVER " + (Environment.Is64BitProcess ? "64" : "32")); Console.WriteLine("-----------------------------"); Console.WriteLine("Pipe: " + pipeName); this.InitializeAutoExit(parentProcessId); IMySharedInterface instance = new SharedInterfaceImpl(); PipeDream.ServerInitialize <IMySharedInterface>(instance, pipeName); }
/// <summary> /// Wraps an implementation in server named pipe bindings. Server pattern: /// 1) Foreach method /// a) Deserialize arguments over pipe /// b) Call original function /// c) Serialize response over pipe /// </summary> /// <typeparam name="T"></typeparam> /// <param name="instance"></param> /// <param name="pipeName"></param> public static void Wrap <T>(T instance, string pipeName) { foreach (MethodInfo methodInfo in typeof(T).GetMethods()) { // Continuously listen on a separate thread for serialize/deserialization over the pipe Task.Run(() => { // Every method gets it's own pipe NamedPipeServerStream pipe = new NamedPipeServerStream(PipeDream.GenerateMethodPipeName(pipeName, methodInfo.Name), PipeDirection.InOut); pipe.WaitForConnection(); ParameterInfo[] parameters = methodInfo.GetParameters(); Console.WriteLine(methodInfo.Name + " is awaiting args..."); while (true) { IFormatter formatter = new BinaryFormatter(); List <object> args = new List <object>(); if (parameters.Length > 0) { foreach (ParameterInfo arg in parameters) { object nextArg = formatter.Deserialize(pipe); args.Add(nextArg); Console.WriteLine("Server (" + methodInfo.Name + ") recieved arg: " + nextArg); } } else { formatter.Deserialize(pipe); Console.WriteLine("Server (" + methodInfo.Name + ") recieved empty argument"); } if (methodInfo.ReturnType != typeof(void)) { object result = methodInfo.Invoke(instance, args.ToArray()); Console.WriteLine("Server called original function with result: " + result); formatter.Serialize(pipe, result); } else { methodInfo.Invoke(instance, null); Console.WriteLine("Server called void function"); formatter.Serialize(pipe, 0); } } }); } }
private NamedPipeClientStream GetPipe(MethodInfo method) { string pipeName = PipeDream.GenerateMethodPipeName(this.PipeName, method.Name); if (this.PipeMap.ContainsKey(pipeName)) { return(this.PipeMap[pipeName]); } else { NamedPipeClientStream pipe = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.None); pipe.Connect(); this.PipeMap[pipeName] = pipe; return(pipe); } }
/// <summary> /// /// </summary> public MyClient() { ////////////////////////////// // 64 BIT ////////////////////////////// // Create random pipe name string pipeName64 = PipeDream.GetUniquePipeName(); // Start the 64 bit remote process this.StartServer(MyClient.Server64Executable, pipeName64); // Initialize 64 bit IPC/RPC IMySharedInterface remote64 = PipeDream.ClientInitialize <IMySharedInterface>(pipeName64); // Fetch remote objects and print them MyObject serverObject64 = remote64?.GetMyRemoteObject("Sam64", 19, 200.4); MyObject serverObject64_2 = remote64?.GetMyRemoteObject("aaa", 22, 123.5); string serverString64 = remote64?.NoParameters(); remote64?.VoidMethod(); //remote64.MyProperty = 123.0; //remote64.MyProperty += 4.0; //double serverProperty64 = remote64.MyProperty; // Print them! Console.WriteLine("Server object (64-bit): " + serverObject64?.ToString()); Console.WriteLine("Server object (64-bit): " + serverObject64_2?.ToString()); Console.WriteLine("Server object (64-bit): " + serverString64); //Console.WriteLine("Server object (64-bit): " + serverProperty64); ////////////////////////////// // 32 BIT ////////////////////////////// // Create random pipe name string pipeName32 = PipeDream.GetUniquePipeName(); // Start the 32 bit remote process this.StartServer(MyClient.Server32Executable, pipeName32); // Initialize 32 bit IPC/RPC IMySharedInterface remote32 = PipeDream.ClientInitialize <IMySharedInterface>(pipeName32); // Fetch remote objects and print them MyObject serverObject32 = remote32?.GetMyRemoteObject("Sam64", 19, 200.4); MyObject serverObject32_2 = remote32?.GetMyRemoteObject("aaa", 22, 123.5); string serverString32 = remote32?.NoParameters(); remote32?.VoidMethod(); //remote32.MyProperty = 123.0; //remote32.MyProperty += 4.0; //double serverProperty32 = remote32.MyProperty; // Print them! Console.WriteLine("Server object (32-bit): " + serverObject32?.ToString()); Console.WriteLine("Server object (32-bit): " + serverObject32_2?.ToString()); Console.WriteLine("Server object (32-bit): " + serverString32); //Console.WriteLine("Server object (32-bit): " + serverProperty32); Console.WriteLine("DONE!"); }