Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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);
                        }
                    }
                });
            }
        }
Ejemplo n.º 3
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);
            }
        }
Ejemplo n.º 4
0
        /// <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!");
        }