Ответы пользователя по тегу .NET
  • Проблема с Microsoft.Extensions.Logging старше версии 6.0.0-preview6.*?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    1. Если включен Trimming, то может просто вырезать метод.
    2. Это Preview.
    Покажи csproj
    Ответ написан
  • Какой Docker образ выбрать для запуска бинарного файла (.NET 6)?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Для self-contained есть образ со всеми зависимостями, но без ядра:
    https://hub.docker.com/_/microsoft-dotnet-runtime-deps/ - лучше использовать именно его.

    Но если будет несколько приложений - я бы лучше собирал не self-contained:
    mcr.microsoft.com/dotnet/nightly/runtime:6.0.0-rc.2-alpine3.14-arm64v8
    Ответ написан
  • Необходимо найти правильный подход к решению задачи на C#?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    2. Не избыточна ли тут ConcurrentQueue?


    Вместо неё лучше использовать System.Threading.Channels (https://www.stevejgordon.co.uk/an-introduction-to-...)
    3. Как сообщить основному потоку из Task.run() что все готово к обновлению карт? Я понимаю что есть Task.Result, но если Task выполняется постоянно (while true), смогу ли я это использовать?

    При помощи канала.
    А Task.Result испольщовать не следует

    В остальном всё звучит правдоподобно
    Ответ написан
    Комментировать
  • Как реализовать трансформации в ASP NET Core?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Никакая трансформация не нужна.
    Просто заводишь appsetting.*.json, где вместо * - название профиля.
    А в launchessettings выставляешь соответствующий DOTNET_ENVIRONMENT.

    При запуске будет выбран базовый appsettings.json + appsettings.*.json

    Вот подробнее об этом механизме:
    https://blog.elmah.io/config-transformations-in-as...
    Ответ написан
  • Возможен ли трансфер между SOH и LOH в .NET?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Нет, такое не происходит, тк размер объектов просто не может меняться в процессе работы.
    Объект либо сразу большой, либо сразу не большой
    Ответ написан
    Комментировать
  • Как организовать диспетчер и очередь подключений?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Очередь запросов можно реализовать через System.Threading.Channels.
    Чтобы сессии не отваливались - запусти ровно четыре таски, которые будут разгребать канал.
    Ответ написан
    Комментировать
  • Как исправить ошибку установка пакета Nuget?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    В этому случае - никак, тк эта библиотека нигде как nuget не опубликована.
    Можешь скопировать к себе её кож и использовать напрямую.
    Либо скопировать к себе код, собрать пакет, и опубликовать его локально
    Ответ написан
    Комментировать
  • Как создать правильную иерархию в asp.NET Core MVC?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Какого-то единого подхода нет, так что расскажу, как делаю я (но не в MVC проектах)

    В отдельный проект выносим всю бизнес-логику.
    В этом проекте, в отдельной папке лежит слой доступа к данным, а в другой папке всякие бизнесовые сервисы так, чтобы сервисы, которые относятся к одной общей оьласти были ближе друг к другу.

    В aspnet проекте иерархию уже выстраиваю от путей запросов.
    Тоесть если у меня будет эндпоинт GET /api/v1/orders, то и лежать он будет в папке api/v1/

    В MVC будет аналогично, только добавятся ещё razor файлы и css
    css лучше держать рядом с шаблонами, в которых они используются
    Ответ написан
    6 комментариев
  • Как скомпилировать проект на C# в один .exe файл?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Single File Application - фича современных дотнетов со времён .net Core 3
    Буквально при помощи одной опции в файле проекта или одной строкой в консоли собирает ваш проект в единый екзешник, в который ещё может быть опционально встроен рантайм.
    Вот пример csproj:
    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <Nullable>enable</Nullable>
      </PropertyGroup>
    
      <PropertyGroup>
        <!-- Вот это самое главное -->
        <PublishSingleFile>true</PublishSingleFile>
        <!-- Это чтобы тащить за собой рантайм До .NET 6 будут рядом лежать нативные библиотеки jit-а и сборщика мусора-->
        <SelfContained>true</SelfContained>
        <!-- Это необходимо, чтобы сборщик понимал, для какой ОС нужен экзешник -->
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
        <!-- Это чтобы ускорить запуск -->
        <PublishReadyToRun>true</PublishReadyToRun>
        <!-- Эти две строки, чтобы уменьшить размер бинарника -->
        <PublishTrimmed>true</PublishTrimmed>
        <TrimMode>link</TrimMode>
      </PropertyGroup>
    </Project>

    В результате получается единственный exe, который реально можно запустить где угодно, вне зависимости от установленной версии .NET

    Для старых версий дотнета есть ILMerge и Costura.Fody, но в .net 5+ они не нужны, и я крайне советую использовать именно .NET 8, тк он сейчас самый актуальный
    Ответ написан
  • Как создать Bitmap большого размера в C#?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Ну во-первых точно не получится использовать стандартный Bitmap.
    Хранить в куче такой большой объект тоже не следует, тк он 100% попадёт в LOH
    + в .NET есть ограничение в 2гб на объекты в управляемой куче.
    Описанное вами изображение как раз в этот лимит и не влезет.

    Остаётся два с половиной варианта:
    1. Делить огромное изображение на чанки по меньше (либо по пикселям, либо по каналам, либо и так и так)
    2. Хранить изображение в неуправляемой памяти, выделять и освобождать память вручную.
    В .net 6 как раз добавили Native alloc API для этого.
    3. Возможно есть какая-нибудь нативная библиотека для работы с большими изображениями.
    Возможно даже уже есть обёртка для работы с ней.

    Во всех случаях придётся отказаться от Bitmap и использовать другие подходы
    без доп. библиотек и массива битмапов

    Не получится
    Ответ написан
    9 комментариев
  • C#. Можно ли создать метод, в котором возвращаемый тип будет определятся в самом методе?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Возвращаемый тип будет зависеть от того, что придёт в ответе от АПИ (несколько вариантов типов, которые будут явно указаны в самом методе).

    Просто сделай класс, в котором будет какой-нибудь флаг, который сообщает о типе контента и N свойств для каждого типа.
    Если у тебя только два типа - результат и ошибка, то используй Either
    https://habr.com/ru/post/267231/
    Ответ написан
    Комментировать
  • Как найти хост, созданный CreateHostBuilder(args).Build()?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    То этот самый хост, запустится в отдельном фоновом-процессе? То есть, процесс консольного приложения отдельно, а процесс-хоста - отдельно?

    Нет. Он будет запущен в этом же процессе.

    PS: не забывайте писать await возле вызовов асинхронных методов
    Ответ написан
    2 комментария
  • Как и до какой версии понизить версию .NET в проекте C#?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Если не нужно поддерживать Windows 7 и 8, то переходи на .NET 5 и используй self contained + single file

    Если нужно поддерживать Windows 7, то переходи на .NET 4.6

    Если нужно поддерживать Windows XP, то переходи на .NET 3.5

    Ну или откажись от поддержки старых версий винды)
    Ответ написан
    Комментировать
  • Будет ли .NET MAUI кроссплатформенным и в итоге заменит WPF и Xamarin?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Xamarin.Native не заменит
    Xamarin.Forms заменит (тк это но и есть)
    WPF не заменит (но это не точно)

    Ну и не надо смотреть только на майков - есть и другие кроссплатформенные UI - например Avalonia или Uno
    Ответ написан
    1 комментарий
  • Что быстрее процедуры postgresql или sql запросы в базу из приложении?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    1. Небольшая экономия, за счёт того что не нужно длинный запрос по сети передавать, а только короткий вызов процедуры (относительно)
    2. В плане защищённости разницы нет, если злоумышленник имеет доступ к исполняемому файлу/исходнику.
    3. Из потенциальных удобств - можно менять запрос, не затрагивая приложение.

    Так что выбирай тот способ, который в твоём случае более оправдан.
    Ответ написан
    7 комментариев
  • Какую проблему признан решать интерфейс IDisposable?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    tl;dr; Чтобы дать интерфейс для явного освобождение какого-нибудь ресурса, как правило - неуправляемого.
    Цитата из документации

    В основном этот интерфейс используется для высвобождения неуправляемых ресурсов. Сборщик мусора автоматически освобождает память, выделенную управляемому объекту, если этот объект больше не используется. Однако невозможно предсказать, когда произойдет сборка мусора. Более того, сборщик мусора не имеет сведений о неуправляемых ресурсах, таких как дескрипторы окон, или открытых файлах и потоках.
    Используйте Dispose метод этого интерфейса для явного освобождения неуправляемых ресурсов в сочетании с сборщиком мусора. Потребитель объекта может вызвать этот метод, если объект больше не нужен.
    Ответ написан
    Комментировать
  • На сколько дорога поддержка потоков async/await?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    1. async/await никак не относится к потокам
    2. Зависит от настроек рантайма и написанного кода. Где-то может быть почти бесплатно, где-то дорого. Где-то много выгоды, а где-то без выгоды.
    3. Относительно полностью синхронного кода, есть оверхед по памяти для асинхронной стейт-машины + оверхед по CPU и памяти для работы машинерии.

    Зато не нужно выделять целый поток для ожидания IO
    Ответ написан
    4 комментария
  • Есть ли смысл изучать ASP.NET?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Есть ли смысл изучать его ради маленьких в пару страниц сайтов (но всё же серверным функционалом, не просто "отдать html по ссылке")?

    Для продакшена - да. HttpListener даже на линуксе вроде не будет работать, тк зависит от http.sys

    Какие у него есть киллер-фичи, облегчающие жизнь?

    1. Быстрый
    2. Гибкий
    По сравнению с httplistener.
    я слегка пересрался от вида "пустого проекта asp net" в visual studio.

    Ну там он действительно немного страшный, в .NET 6 его сделают чуть менее страшным.
    Вообще минимальный проект выглядит примерно так:
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder.UseKestrel(o =>
            {
                o.ListenLocalhost(5000);
            });
            webBuilder.ConfigureServices(services =>
            {
                services.AddRouting();
            });
            webBuilder.Configure(app =>
            {
                app.UseRouting();
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapGet("/", async context =>
                    {
                        await context.Response.WriteAsync("Hello World!");
                    });
                });
            });
        })
        .Build()
        .Run();

    В .NET 6 будет MinApi, который выглядит вот так (без юзингов):
    var app = WebApplication.Create(args);
    
    app.MapGet("/", string () => "Hello World!");
    
    app.Run();
    Ответ написан
    Комментировать
  • Как изменить разрядность приложения .net?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    На одном форуме подсказали что дело в разрядности приложения.

    Интересно, причём тут разрядность вообще.
    Когда указываю относительный путь выходит исключение.

    Относительный путь решит проблему, только если хром будет установлен в ту же папку, что и твоё приложение. Сейчас же он часто ставится в локальную папку пользователя.

    Вариантов несколько:
    1. Проси у пользователя явно указать путь к хрому
    2. Запускай дефолтный браузер. Для этого надо ввести просто Process.Start("https://www.google.com");
    Но это вроде будет работать только на винде
    3. Тащи бинарники хрома вместо со своим приложением.
    4. Перебирай все возможные пути к хрому: и Program Files, и Program Files (x86), и AppData
    Ответ написан
    Комментировать
  • Актуален ли .NET для старта карьеры в качестве junior backend в 2021 году?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    И к великому разочарованию не обнаружил там своего дотнета

    Опрос за 2020 год:
    https://insights.stackoverflow.com/survey/2020#mos...
    Судя по нему - ASP NET Core - самый любимый фреймворк среди веб-разработчиков
    Но при этом старый ASP NET - один из самых нелюбимых.
    Ответ написан
    2 комментария