public void BeginReadMessage()
        {
            // This is just a temporary and ignored array used on the WriteFile calls.
            byte[] _numReadWritten = new byte[4];

            // TODO: Fix the pinvoke to eliminate these byte arrays
            byte[] intBytes = new byte[4];
            byte[] msgBytes = null;
            int    len;

            bool fOk = PipeNative.ReadFile(_handle,
                                           intBytes,
                                           4,
                                           _numReadWritten,
                                           0);

            if (fOk)
            {
                len = BitConverter.ToInt32(intBytes, 0);

                msgBytes = new byte[len];

                fOk = PipeNative.ReadFile(_handle,
                                          msgBytes,
                                          (uint)len,
                                          _numReadWritten,
                                          0);
            }

            if (!fOk)
            {
                throw new PipeIOException("Error reading from pipe " + _handle + ": error " + PipeNative.GetLastError());
            }

            _stream = new MemoryStream(msgBytes, false);

            if (_stream.CanRead)
            {
                string s = GetStringFromStream(_stream);
                if (s.Contains("Exception"))
                {
                    RemotingException rex = new RemotingException(s);
                    throw rex;
                }
            }

            _stream.Position = 0;
            _reader          = new BinaryReader(_stream, Encoding.UTF8);
        }