Компилятор `#error` встроенный условно для неопределенных переменных, генерирующих ошибку при компиляции. Как я могу это исправить?

Я не совсем уверен, как сформулировать эту проблему, так что, надеюсь, следующие детали помогут вам понять, что именно здесь происходит. Это то, с чем я никогда не сталкивался прежде, и его особенность в стиле кода довольно странна для меня.

Я загрузил исходный код для SSH.NET и пытаюсь объединить исходный компонент в рамках монолитного проекта, однако существует множество блоков, таких как следующий:

        public static int Read(Socket socket, byte[] buffer, int offset, int size, TimeSpan timeout)
        {
#if FEATURE_SOCKET_SYNC
            var totalBytesRead = 0;
            var totalBytesToRead = size;

            socket.ReceiveTimeout = (int) timeout.TotalMilliseconds;

            do
            {
                try
                {
                    var bytesRead = socket.Receive(buffer, offset + totalBytesRead, totalBytesToRead - totalBytesRead, SocketFlags.None);
                    if (bytesRead == 0)
                        return 0;

                    totalBytesRead += bytesRead;
                }
                catch (SocketException ex)
                {
                    if (IsErrorResumable(ex.SocketErrorCode))
                    {
                        ThreadAbstraction.Sleep(30);
                        continue;
                    }

                    if (ex.SocketErrorCode == SocketError.TimedOut)
                        throw new SshOperationTimeoutException(string.Format(CultureInfo.InvariantCulture,
                            "Socket read operation has timed out after {0:F0} milliseconds.", timeout.TotalMilliseconds));

                    throw;
                }
            }
            while (totalBytesRead < totalBytesToRead);

            return totalBytesRead;
#elif FEATURE_SOCKET_EAP
            var receiveCompleted = new ManualResetEvent(false);
            var sendReceiveToken = new BlockingSendReceiveToken(socket, buffer, offset, size, receiveCompleted);

            var args = new SocketAsyncEventArgs
            {
                UserToken = sendReceiveToken,
                RemoteEndPoint = socket.RemoteEndPoint
            };
            args.Completed += ReceiveCompleted;
            args.SetBuffer(buffer, offset, size);

            try
            {
                if (socket.ReceiveAsync(args))
                {
                    if (!receiveCompleted.WaitOne(timeout))
                        throw new SshOperationTimeoutException(string.Format(CultureInfo.InvariantCulture,
                            "Socket read operation has timed out after {0:F0} milliseconds.", timeout.TotalMilliseconds));
                }

                if (args.SocketError != SocketError.Success)
                        throw new SocketException((int) args.SocketError);

                return sendReceiveToken.TotalBytesTransferred;
            }
            finally
            {
                // initialize token to avoid the waithandle getting used after it's disposed
                args.UserToken = null;
                args.Dispose();
                receiveCompleted.Dispose();
            }
#else
#error Receiving data from a Socket is not implemented.
#endif
        }

Который при попытке собрать компилятор застревает на #error Receiving data from a Socket is not implemented. линии и выбрасывание исключения CS1029 которую я могу игнорировать, но моя озабоченность больше соответствует тому, почему все эти условия не выполняются (например: #elif FEATURE_SOCKET_EAP) и что я могу с этим сделать?

Кроме того, я получаю Error CS0161 'SocketAbstraction.Read(Socket, byte[], int, int, TimeSpan)': not all code paths return a value в результате аварийного переключения в #else сегмент, который заставляет компилятор генерировать исключение со встроенным сообщением (например: #else <foo> выдает исключение CS1029 с <foo> в качестве описания, а также блокирует возвращаемое значение в методе)

Что я могу сделать, чтобы исправить проблемы такого типа, и с какой стати кто-то будет использовать проблемы с ошибками встроенного компилятора таким образом?

1 ответ

Решение

Вы должны сконфигурировать свою IDE для одного из указанных символов условной компиляции.

Если вы используете Visual Studio:

  • Откройте свойства проекта
  • Перейти на вкладку "Сборка"
  • Введите одно из значений "FEATURE_SOCKET_EAP" или "FEATURE_SOCKET_SYNC" в поле "Условные символы компиляции".

см. также: https://csharp.2000things.com/tag/conditional-compilation/

Другие вопросы по тегам