Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120

Использовать System.Net.WebSockets.ValueWebSocketRece­iveResult в проекте Net Framework 4.8

26.07.2021, 22:19. Показов 3224. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется проект "1" на Net Framework 4.8 и проект "2" (реализация вебсокет клиента WebSocketClient) на net 5.0, использующий структуру System.Net.WebSockets.ValueWebSocketRece iveResult. Как в проекте "1" использовать WebSocketClient? Указываю ссылку на проект 2, но проект не добавляется.. Я как понял нет обратной совместимости проектов. Как поступают в таких ситуация?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.07.2021, 22:19
Ответы с готовыми решениями:

Как правильно подружить System.Net.Sockets и System.Net.WebSockets?
К примеру есть 2 разных проекта: 1. Чат с веб-мордой (Веб-приложение) 2. Консольный чат (Консольное приложение) И собственно...

.NET Framework 4 в проекте
Приложение создано на платформе NET Framewok 4. При пробной демонстрации на другом компьютере просит установить framwork 4.0. Вопрос, как...

Объясните на пальцах совместимость библиотек в .Net Core, .Net Framework, .Net Standart
Изучаю .Net. Хочу написать некое серверное приложение (думаю что учеба лучше на реальном примере, нежели писать примитивные hello world)....

16
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.07.2021, 12:10
Цитата Сообщение от SetAres Посмотреть сообщение
Как поступают в таких ситуация?
Выносят общий функционал в отдельную сборку, совместимую с обеими платформами.
В вашем случае имеет смысл заменить целевую платформу клиента на .NET Standard 2.0 — тогда ее можно подтягивать и к проектам на .NET FX, и к проектам на .NET 5
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
27.07.2021, 12:21  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
В вашем случае имеет смысл заменить целевую платформу клиента на .NET Standard 2.0
ValueWebSocketReceiveResult, содержащийся в клиенте, применяется только к .NET Standard 2.1.

Проект "1" на Net Framework 4.8 можно было бы переделать под .NET 5.0, но там уже не поддерживается WCF (серверная часть). Может как-то можно проще переехать проекту "1" на .NET 5.0 с сохранением функционала WCF?
0
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
27.07.2021, 12:59  [ТС]
Правильно ли я понимаю что клиент можно было бы нацелить на платформу .NET Standart 2.1, но проблема кроется в использовании пакета с меньшей версией?
Миниатюры
Использовать System.Net.WebSockets.ValueWebSocketReceiveResult в проекте Net Framework 4.8  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.07.2021, 13:38
Цитата Сообщение от SetAres Посмотреть сообщение
ValueWebSocketReceiveResult, содержащийся в клиенте, применяется только к .NET Standard 2.1
Тогда придется либо апгрейдить проект с 4.8 на 5.0, либо менять реализацию клиента для поддержки .NET Standard 2.0, либо делать кросс-платформенную реализацию клиента (предпочтительный вариант) для поддержки обеих платформ.
В последнем случае проекты под .NET 5.0 будут использовать реализацию для 5.0 со всеми нововведениями, а проекты, целящиеся на .NET Standard — реализацию для обратной совместимости.

Цитата Сообщение от SetAres Посмотреть сообщение
Может как-то можно проще переехать проекту "1" на .NET 5.0 с сохранением функционала WCF?
Второй или третий вариант выше.

Цитата Сообщение от SetAres Посмотреть сообщение
Правильно ли я понимаю что клиент можно было бы нацелить на платформу .NET Standart 2.1, но проблема кроется в использовании пакета с меньшей версией?
.NET 4.8 не реализует .NET Standard 2.1, потому библиотеки, нацеленные на эту версию, нельзя использовать в проектах под 4.8.
Таблица совместимости: https://docs.microsoft.com/en-... t-standard

Можно прицеплять только библиотеки версии 2.0 или ниже.
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
27.07.2021, 14:32  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Тогда придется либо апгрейдить проект с 4.8 на 5.0, либо менять реализацию клиента для поддержки .NET Standard 2.0, либо делать кросс-платформенную реализацию клиента (предпочтительный вариант) для поддержки обеих платформ.
В последнем случае проекты под .NET 5.0 будут использовать реализацию для 5.0 со всеми нововведениями, а проекты, целящиеся на .NET Standard — реализацию для обратной совместимости.
1. Переход с 4.8 на 5.0 влечёт за собой потерю поддержки WCF, не вариант.
2. Структура ValueWebSocketReceiveResult не поддерживается .NET Standard 2.0, тоже не вариант.
3. Можно подробнее? Не совсем понимаю про кросс-платформенную реализацию и реализацию для обратной совместимости( Мне нужно чтоб проект WebsocketClient, содержащий структуру ValueWebSocketReceiveResult (который применяется к .NET Standard 2.1, .NET 5.0 либо .NET Core 2.1, 2.2, 3.0, 3.1) можно было использовать в проекте на .NET Framework 4.8.
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
27.07.2021, 14:40
Цитата Сообщение от SetAres Посмотреть сообщение
Переход с 4.8 на 5.0 влечёт за собой потерю поддержки WCF, не вариант
потерю только как сервера wcf. А вообще клиент на нет5 при всех доустоновленных бибилиотеках может вызывать службы wcf

Добавлено через 2 минуты
да и wcf умеет работать по http, так что его можно дергать как обычный web-api
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.07.2021, 14:45
Цитата Сообщение от SetAres Посмотреть сообщение
2. Структура ValueWebSocketReceiveResult не поддерживается .NET Standard 2.0, тоже не вариант.
В .NET Standard 2.0 вместо нее используется класс WebSocketReceiveResult.

Цитата Сообщение от SetAres Посмотреть сообщение
Можно подробнее? Не совсем понимаю про кросс-платформенную реализацию и реализацию для обратной совместимости
Покажите для примера один или два ваших метода, которые не компилируются под .NET Standard 2.0, а я покажу как их можно сделать кросс-платформенными — так нам обоим будет понятнее что к чему.

Цитата Сообщение от SetAres Посмотреть сообщение
Мне нужно чтоб проект WebsocketClient, содержащий структуру ValueWebSocketReceiveResult (который применяется к .NET Standard 2.1, .NET 5.0 либо .NET Core 2.1, 2.2, 3.0, 3.1) можно было использовать в проекте на .NET Framework 4.8.
Задача ясна, спасибо.
Приведите пример кода или можете вообще весь проект клиента подцепить, если в нем ничего секретного.
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
27.07.2021, 23:11  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Покажите для примера один или два ваших метода, которые не компилируются под .NET Standard 2.0
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
System.Net.WebSockets.WebSocket client;
System.IO.MemoryStream stream = null;
buffer = buffer ?? ArrayPool<byte>.Shared.Rent(defaultReceiveBufferSize);
 
WebSocketReceiveResult receiveResult; // заменил ValueWebSocketReceiveResult
 
var receiveTask = client.ReceiveAsync(buffer.AsMemory(), token); // Error CS1503 Argument 1: cannot convert from System.ReadOnlyMemory<byte>' to 'System.ArraySegment<byte>'
if (receiveTask.IsCompleted)
     receiveResult = receiveTask.Result;
 
var writeTask = stream.WriteAsync(buffer.AsMemory(0, receiveResult.Count), token); // Error CS1501 No overload for method 'WriteAsync' takes 2 arguments
 
await stream.DisposeAsync(); // Error   CS1061 'MemoryStream' does not contain a definition for 'DisposeAsync' and no accessible extension method 'DisposeAsync' accepting a first argument of type 'MemoryStream' could be found (are you missing a using directive or an assembly reference?)
Вот такие ошибки остались
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.07.2021, 10:50
Лучший ответ Сообщение было отмечено SetAres как решение

Решение

Цитата Сообщение от SetAres Посмотреть сообщение
Вот такие ошибки остались
Первым делом откройте проект клиентской либы в редакторе и в первой группе замените <TargetFramework>net5.0</TargetFramework> на <TargetFrameworks>net5.0;netstandard2.0</TargetFrameworks>, чтобы при компиляции создавалось две версии библиотеки.

В .NET Standard 2.0 нет класса ArrayPool<T>, но он поставляется отдельным нугет-пакетом — подключите System.Buffers.
В .NET 5.0 этот класс идет из коробки, потому в файле проекта сделайте нугет-пакет условным, чтобы он подключался только при компилировании под .NET Standard 2.0:
XML
1
2
3
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
  <PackageReference Include="System.Buffers" Version="[4.5.*,)" />
</ItemGroup>
Ну и под конец разбейте проблемные участки кода на два условно компилируемых сегмента: один под Стандарт, второй под NET 5:
C#
1
2
3
4
5
6
7
8
9
#if NET5_0_OR_GREATER
            ValueWebSocketReceiveResult receiveResult = await client.ReceiveAsync(buffer.AsMemory(), token);
            await stream.WriteAsync(buffer.AsMemory(0, receiveResult.Count), token);
            await stream.DisposeAsync();
#else
            WebSocketReceiveResult receiveResult = await client.ReceiveAsync(new(buffer), token);
            await stream.WriteAsync(buffer, 0, receiveResult.Count);
            stream.Dispose();
#endif
Или наоборот:
C#
1
2
3
4
5
6
7
8
9
#if NETSTANDARD2_0
            WebSocketReceiveResult receiveResult = await client.ReceiveAsync(new(buffer), token);
            await stream.WriteAsync(buffer, 0, receiveResult.Count);
            stream.Dispose();
#else
            ValueWebSocketReceiveResult receiveResult = await client.ReceiveAsync(buffer.AsMemory(), token);
            await stream.WriteAsync(buffer.AsMemory(0, receiveResult.Count), token);
            await stream.DisposeAsync();
#endif
После компиляции в выходной папке будет создано две директории: netstandard2.0 и net5.0.
Сборку из netstandard2.0 цепляйте к проекту на 4.8, сборку из 5.0 — к проекту из 5.0.
Если все проекты в одном решении и зависимость добавляется как ProjectReference, то подходящая версия будет выбрана автоматом.
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
28.07.2021, 15:44  [ТС]
Вроде всё сделал как описано выше - под NET 5.0 успешно скомпилировался проект, а вот с NET Standart 2.0 не совсем гладко:

C#
1
WebSocketReceiveResult receiveResult = await client.ReceiveAsync(new(buffer), token);
Компилятор ругался на "new(buffer)", Intellisense подсказал добавить new ArraySegment<byte>(buffer).

(Кстати по аналогии "System.Buffers" пришлось сделать c "System.Threading.Channels" - добавил Nuget пакет и сделал его условным)
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>net5.0;netstandard2.0</TargetFrameworks>
  </PropertyGroup>
 
  <ItemGroup>
    <PackageReference Include="Disruptor" Version="4.0.0" />
    <PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="2.1.3" />
    <PackageReference Include="Serilog" Version="2.10.0" />
  </ItemGroup>
 
  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="System.Buffers" Version="4.5.1" />
    <PackageReference Include="System.Threading.Channels" Version="5.0.0" />
  </ItemGroup>
</Project>


И осталась вот такая непонятная ошибка (на фото).

Цитата Сообщение от kolorotur Посмотреть сообщение
зависимость добавляется как ProjectReference
Да, именно так
Миниатюры
Использовать System.Net.WebSockets.ValueWebSocketReceiveResult в проекте Net Framework 4.8  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.07.2021, 16:18
Цитата Сообщение от SetAres Посмотреть сообщение
Компилятор ругался на "new(buffer)", Intellisense подсказал добавить new ArraySegment<byte>(buffer).
В C# 9 при вызове конструктора можно не писать имя типа, если компилятор его может вывести сам.
Под TargetFrameworks можете прописать <LangVersion>latest</LangVersion> или заменить new(buffer) на new ArraySegment<byte>(buffer).

Цитата Сообщение от SetAres Посмотреть сообщение
осталась вот такая непонятная ошибка
В NET STD 2 у сласса ClientWebSocket нет перегрузки метода SendAsync, принимающей ReadOnlyMemory.
Можно сигнатуру тоже сделать условной:
C#
1
2
3
4
5
6
7
8
#if NETSTANDARD2_0
   private async Task SendInternalAsync(ArraySegment<byte> message)
#else
   private async Task SendInternalAsync(ReadOnlyMemory<byte> message)
#endif
{
 
}
В теле метода то же самое в строках, где используется свойство Length, т.к. у ArraySegment оно называется Count.
То же придется сделать в точках вызова, где используется ReadOnlyMemory: условно менять на ArraySegment.

Можно, конечно, убрать из зависимостей .NET 5 и сделать одну зависимость на .NET Standard 2.0, переписав всё под ArraySegment — сборка будет работать под .NET 5, хоть и без нововведений из новых версий.
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
28.07.2021, 18:10  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
В NET STD 2 у сласса ClientWebSocket нет перегрузки метода SendAsync, принимающей ReadOnlyMemory
Всё поправил, компилируется без проблем, ошибок нет. Но при вызове метода
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        private void StartBackgroundThreadForSendingText()
        {
            messagesTextToSendQueue = Channel.CreateUnbounded<string>(
                new UnboundedChannelOptions
                {
                    SingleReader = true,
                    SingleWriter = false
                });
 
            _ = Task.Factory.StartNew(
                SendTextFromQueueAsync,
                cancellationTotal.Token,
                TaskCreationOptions.LongRunning,
                TaskScheduler.Default);
        }


возникает ошибка:
Code
1
System.IO.FileNotFoundException: 'Не удалось загрузить файл или сборку "System.Threading.Channels, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" либо одну из их зависимостей. Не удается найти указанный файл.'
В настройках проекта так указал:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>net5.0;netstandard2.0</TargetFrameworks>
  </PropertyGroup>
 
  <ItemGroup>
    <PackageReference Include="Disruptor" Version="4.0.0" />
    <PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="2.1.3" />
    <PackageReference Include="Serilog" Version="2.10.0" />
  </ItemGroup>
 
  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="System.Buffers" Version="4.5.1" />
    <PackageReference Include="System.Threading.Channels" Version="5.0.0" />
  </ItemGroup>
</Project>
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.07.2021, 20:59
Цитата Сообщение от SetAres Посмотреть сообщение
возникает ошибка
Откройте папку, в которую компилируются файлы проекта на .NET 4.8 и посмотрите — лежит ли рядом с экзешником System.Threading.Channels.dll.
Если не лежит, то это может быть глюк Студии — она время от времени не цепляет непрямые зависимости.
Закройте решение, удалите из папки с проектом (который 4.8) директории bin и obj, откройте и перестройте решение заново — должно помочь.
Если файл лежит, а исключение все равно вываливается, то тут может быть конфликт зависимостей из-за другой сборки: ваш клиент зависит от версии 5.0, а какая-нибудь другая сборка в проекте зависит от 4.7, в итоге она побеждает и ее версия оказывается в директории, на что потом агрится ваша сборка.
Откройте свойства dll-файла и в закладке с деталями посмотрите версию: если она не та, которая у вас указана в PackageReference, то это подтвердит второй вариант.
В этом случае можно либо обновить другую зависимость до версии, ссылающейся на 5.0, либо настроить редиректы в App.config, либо разнести разные версии сборки по разным папкам и в том же App.config настроить папки, в которых рантайм будет искать сборки.

Добавлено через 6 минут
А, ну и как вариант можете понизить зависимость вашей либы до 4.7, чтобы она не конфликтовала с другой сборкой.
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
29.07.2021, 16:20  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Откройте папку, в которую компилируются файлы проекта на .NET 4.8 и посмотрите — лежит ли рядом с экзешником System.Threading.Channels.dll.
Если не лежит, то это может быть глюк Студии — она время от времени не цепляет непрямые зависимости.
Закройте решение, удалите из папки с проектом (который 4.8) директории bin и obj, откройте и перестройте решение заново — должно помочь.
Если файл лежит, а исключение все равно вываливается, то тут может быть конфликт зависимостей из-за другой сборки: ваш клиент зависит от версии 5.0, а какая-нибудь другая сборка в проекте зависит от 4.7, в итоге она побеждает и ее версия оказывается в директории, на что потом агрится ваша сборка.
Откройте свойства dll-файла и в закладке с деталями посмотрите версию: если она не та, которая у вас указана в PackageReference, то это подтвердит второй вариант.
В этом случае можно либо обновить другую зависимость до версии, ссылающейся на 5.0, либо настроить редиректы в App.config, либо разнести разные версии сборки по разным папкам и в том же App.config настроить папки, в которых рантайм будет искать сборки.
Добавлено через 6 минут
А, ну и как вариант можете понизить зависимость вашей либы до 4.7, чтобы она не конфликтовала с другой сборкой.
Удалял папки bin и obj, перестраивал проект и т.д. - не помогало. Добавил в вызывающий проект на .NET 4.8 нугет пакет System.Threading.Channels.dll - всё заработало, хотя никаких ошибок не было..

Подскажите, пожалуйста, ещё вот что: скажется ли как-нибудь на производительности подобный рефакторинг кода, предложенный Вами выше?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 16:58
Цитата Сообщение от SetAres Посмотреть сообщение
Добавил в вызывающий проект на .NET 4.8 нугет пакет System.Threading.Channels.dll - всё заработало
Так себе решение.
По-хорошему сборка с клиентом должна тянуть за собой свои зависимости.

Цитата Сообщение от SetAres Посмотреть сообщение
скажется ли как-нибудь на производительности подобный рефакторинг кода, предложенный Вами выше?
Если вы про блоки #if/#else, то сами по себе они никак не сказываются, т.к. это директивы компилятору: какой код компилировать, а какой игнорировать.
Ну, разве на время компиляции повлияют.
Что касается кода внутри этих блоков — это уже зависит от того, как он реализован.

В целом подозреваю, что код под 4.8 будет работать чуть медленнее и/или мусорить в куче чуть больше — не зря же в .NET 5 его поменяли.
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
29.07.2021, 17:26  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Так себе решение.
По-хорошему сборка с клиентом должна тянуть за собой свои зависимости.
Не знаю почему зависимости не тянулись за сборкой.. Добивался работоспособности любой ценой, результат получил

Цитата Сообщение от kolorotur Посмотреть сообщение
В целом подозреваю, что код под 4.8 будет работать чуть медленнее и/или мусорить в куче чуть больше — не зря же в .NET 5 его поменяли.
Да, именно про это и спрашивал.

Спасибо большое за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2021, 17:26
Помогаю со студенческими работами здесь

.net framework и .net core входят в состав .net?
Какая там структура(в простом виде)?

Использование System.Net.NetworkInformation в консольном проекте
Windows 7, Visual Studio 2012 (2013), один ПК. Есть два консольных проекта на основе Net Framework 3.5. В проекте CsStudyCons при вводе...

Какую версию net framework использовать?
Добрый вечер, начел учить C#, и у меня возникло пару вопросов, может подскажите мне 1) Какую версию net framework лучшие использовать...

.NET Framework для разработчика и .NET Framework для простого пользователя это одно и тоже?
Если я обычный пользователь компьютера и не разрабатываю приложения .NET Framework, но запускаю их и пользуюсь ими на своём ПК и наоборот...

.NET Framework и .NET Framework Client Profile
Добрый день! Столкнулся со следующим непонятным мне поведением: при выборе в настройках проекта требуемой версии .NET если выбрать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru