Ответы пользователя по тегу .NET
  • Почему только .net framework является частью windows?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Почему новые обновление не могут перейти например на net 6?

    1. Потому что .NET 6 не имеет обратной совместимости с .NET Framework.
    2. Включение .NET Runtime в состав Windows усложнит развёртывание и доставку обновлений. Будет сложно раз в год выпускать большие обновления. Сейчас можно спокойно поставить .net runtime любой версии параллельно или вообще тащить нужную версию вместе с приложением. При поставке рантайма вместе с ОС, это будет гораздо сложнее.
    Ответ написан
  • Как правильно создать описание кода при упаковке в Nuget Packet?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист

    Или я возможно проглядел галочку при упаковке?

    Типа того.
    https://stackoverflow.com/questions/5205738/how-do...
    Ответ написан
    1 комментарий
  • Как организовать изолированную среду выполнения собранного dotnet приложения?

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

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

    Никакие софтовые решения (обфускация, контейнеры, шифрованные виртуалки, передача критичного исполняемого кода по сети) не спасут от тех людей, которые хотят с вами конкурировать или осознанно хотят нарушить соглашения.
    Ответ написан
    4 комментария
  • Как сделать приложение Windows Forms автономным в одном файле?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Вот такая команда в результате соберёт всё в один файл. На hello world работает. Если в вашем проекте не работает - надо смотреть на код.
    dotnet publish -r win-x64 --self-contained -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ./publish-path

    https://docs.microsoft.com/en-us/dotnet/core/deplo...
    Ответ написан
    1 комментарий
  • Можно код-ревью проекта на C# с юнит тестами?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Сначала замечания по реализации:

    1. Раз уж мы делаем свой аналог List - тогда есть смысл вынести его в библиотеку, а не с Exe.
    TargetFramework стоит делать чуть более новым. Сейчас LTS - .NET 6 (но это не так уж и критично)

    2. Почему List Только для char реализован? Почему не сделать его обобщённым?

    3. Почему List не реализовывает стандартные интерфейсы? Тот же IEnumerable<T> хотябы.

    4. PrintForward - явно какой-то лишний метод. Список не должен отвечать за вывод в консоль.

    5. Публичный сеттер в Node выглядит как что-то опасное. Так можно изменить Next или Previous - лист изменится, вплоть до изменения количества элементов, но значение Count в самом листе не изменится, от чего всё поломается.

    А вот тесты наоборот выглядят вполне неплохо, но надо бы покрытие посмотреть.
    Ответ написан
    3 комментария
  • Как собрать DLL из ранее разобранной и измененными файлами?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    В dotPeek есть волшебная кнопка "Export to project" которая появляется, когда нажимаешь ПКМ на нужной сборке.
    После экспорта тебе нужно просто открыть этот проект в Visual Studio и собрать заново, предварительно изменив те файлы, которые тебя интересуют.
    6261aa0e3a180411558339.png
    Ответ написан
    Комментировать
  • У меня высветилась ошибка NETSDK1 текущий пакет SDK для .NET не поддерживается выберите .NET 5.0 или более раннюю версию. Что делать?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Сделать то что просят - поменять TargetFramework на net5.0
    Либо установить новую версию sdk
    Ответ написан
    Комментировать
  • Как сконфигурировать Worker Service для логгирования запросов Entity Framework через NLog?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Тебе нужен пакет NLog.Extensions.Logging:
    https://github.com/NLog/NLog.Extensions.Logging

    Но вообще советую перейти на serilog.
    Ответ написан
    Комментировать
  • Почему старая документация в окне справки VS?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Предположу, что документация обновляется так часто, что решили её просто больше так не паковать.
    Заходи на MSDN

    Встроенная документация API у тебя и так загружается в рамках SDK и nuget-пакетов.
    Ответ написан
  • Какой формат и расширение файлов типичного .net core бекэнд приложения?

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

    Когда ты публикуешь приложение для Linux - оно будет с расширением исполняемого файла от линукса.
    А именно - ни с каким.
    Если будешь публиковать платформонезависимое приложение, то тогда будет .dll и в любом случае понадобится установленный рантайм.
    Нужен ли на установленный .net на платформе где будет запускаться такое .net приложение?

    Если публиковал с флагом --self-contained или --self-contained true, то не нужен.
    Если публиковал без флага --self-contained или с флагом --self-contained false, то нужен.

    Это всё ты мог проверить самостоятельно, просто скомпилировав хеллоу ворлд.

    PS: вот что конкретно выдаётся в результате:
    C:/workspace
    ❯ dotnet new console -o DemoLinuxPublish
    Шаблон "Консольное приложение" успешно создан.
    
    Идет обработка действий после создания...
    Выполнение "dotnet restore" для C:\workspace\DemoLinuxPublish\DemoLinuxPublish.csproj...
      Определение проектов для восстановления...
      Восстановлен C:\workspace\DemoLinuxPublish\DemoLinuxPublish.csproj (за 113 ms).
    Восстановление выполнено.
    
    
    C:/workspace took 2s
    ❯ cd .\DemoLinuxPublish\
    
    C:/workspace/DemoLinuxPublish via .NET v6.0.100  net6.0 took 12s
    ❯ dotnet publish -c Release -r linux-x64 --self-contained -v q --nologo -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:DebugType=None -p:DebugSymbols=false -p:PublishReadyToRun=true -p:PublishTrimmed=true
    
    C:/workspace/DemoLinuxPublish via .NET v6.0.100  net6.0 took 2s
    ❯ ls .\bin\Release\net6.0\linux-x64\publish\
    
        Directory: C:\workspace\DemoLinuxPublish\bin\Release\net6.0\linux-x64\publish
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    -a---          21.03.2022     3:25       15866695 DemoLinuxPublish

    PPS: я немного упоролся с дополнительными параметрами сборки
    Ответ написан
    2 комментария
  • Try and Finally - Что вернет функция?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Твой код не скомпилируется :)
    Нельзя в блок finally пихать return.
    https://docs.microsoft.com/en-us/dotnet/csharp/mis...

    А так вообще да - finally выполняется в любом случае, хоть выпало хоть не выпало исключение.
    Ответ написан
    2 комментария
  • Как преобразовать десериализацию при переходе к null reference types?

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


    как видим, после десериализации значения полей перепутались.

    А зачем специально его запутывать? Если есть конструктор, то серилизатор будет использовать информацию из него, а ты сам его решил обмануть.
    Если очень нужно так назвать - ты можешь разметить параметры при помощи атрибутов.

    Инициализировать значением по-умолчанию совершенно не обязательно, хотя сделать конструктор - это хорошая идея (System.Text.Json умеет с ними хорошо работать)
    Например ты можешь как значение по-умолчанию использовать "= null!; " - тогда предупреждения не будет.

    И я использую Newtonsoft.Json (13.0.1)

    Советую переходить на STJ


    типы без ? принимать null не могут.

    Формально могут. NRT ничего не гарантирует.



    А если серьезно, то как все же гарантировать правильную работу кода при применении похода null reference type?
    Можно ли все таки гарантировать что поле не будет равно null и при этом не пользоваться конструктором?

    1. Переходи на NRT постепенно, проверяя весь код вручную, либо какими-нибудь навороченными статическими анализаторами.
    2. Нет, без конструктора с проверками на null ты ничего не сможешь гарантировать.
    Хотя если серилизатор очень умный и через emit напрямую фигачит в приватные поля - это также не спасёт.

    Так что вот тебе дополнительная причина по скорее покрыть тестами хотябы наиболее важные сценарии в твоём приложении
    Ответ написан
    Комментировать
  • Определить IP в ASP Core MVC?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    На скрине ты смотришь LocalIpAddress. А что с Remote? И с какой машины запрос делаешь? Если ты с локалхоста на локалхост будешь делать запрос, то Remote Будет localhost :)
    Ответ написан
  • Какакой тип .NET приложения выбрать если нужна отказоустойчивость - обычное консольное, ASP.NET или Worker Service?

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

    Тогда уж уже 6. .NET 5 скоро end of life настигнет.
    Крайне желательно обеспечить отказоустойчивость всего этого дела, то есть даже если вдруг будет какой-то баг, то чтобы можно было легко закодить автоматический перезапуск.

    Перезапуск решается не на уровне приложения, а на уровне выше - через systemd/docker/k8s
    Они умеют автоматически отслеживать, что твой сервис упал, и перезапускать обратно.
    Если сервис может сломаться не падая полностью - смотри на Health checks (https://docs.microsoft.com/en-us/aspnet/core/host-...)
    получать по HTTP

    Ну тут очевидно - asp net бери.
    Worker Service - это про некоторую работу, которая выполняется в фоне постоянно (например слушатель очереди логичнее делать на нём)
    Просто консольное приложение - будет как aspnet, только хуже (если говорить про HttpListener/TcpListener), Придётся самому изобретать AppHost чтобы отслеживать состояние сервиса.

    Только не надо это всё на GET-запросах делать) Семантически корректнее будет использовать POST.
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddHttpClient();
    var app = builder.Build();
    
    app.MapPost("/value", async ([FromBody] SensorReadings data, [FromServices] HttpClient httpClient) =>
    {
        // Что-то делаем с полученными данными
        await httpClient.PostAsJsonAsync("https://example.com", data);
    });
    
    app.Run();
    
    record SensorReadings(Guid SensorId, DateTimeOffset Timestamp, double Value);


    Но в принципе, раз у тебя датчики - я бы посмотрел на сочетание mqtt и worker service
    Ответ написан
    Комментировать
  • .Net 7, добавят ли что нибудь значительное?

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

    Так и есть. В основном стабилизация и расширение уже внесённых API с повышением производительности
    Возможно, в следующем превью покажут больше.
    Как минимум, ожидается C# 11 с новыми фичами, например "raw string literal" и required при объявлении свойств.
    Ещё ожидается стабилизация generic math и abstract static в интерфейсах.

    Ну и кстати вот цитата:
    Major areas of focus for .NET 7 include improved support for cloud native scenarios, tools to make it easier to upgrade legacy projects, and simplifying the developer experience by making it easier to work with containers.

    Вроде как ещё на Orleans больше внимания обращают - мб в него больше фичей привнесут (ну и с Azure его интегрируют)

    у .NET сейчас такой этап, что надо как-то его окупать - значит будут чуть больше внимания обращать на Azure, чем на сам .NET
    Ответ написан
    2 комментария
  • Как правильно сравнивать ENUM на C#?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    var hiddenAndOffline = FileAttributes.Hidden | File.Attributes.Offline;
    if((dir.Attributes & hiddenAndOffline) == hiddenAndOffline)
    {
      /* Файл скрыт и offline*/
    }
    if((dir.Attributes & hiddenAndOffline) != 0)
    {
     /* Файл скрыт или offline или всё вместе */
    }
    Ответ написан
  • Как собрать приложение на .net без файла с расширением .csproj?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Это делается при помощи csc.exe
    Ну или через mono (mcs) - зависит от того что за проект.
    Ещё когда-то был nant - прародитель msbuild.
    В нём тоже имеется своя модель проекта и файлы для сборки
    Ответ написан
    Комментировать
  • Дорого ли обходиться использовавние lock, зачем делать Singleton with double check locking?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    зачем делать Singleton with double check locking

    Синглтон имеет смысл делать только тогда, когда (все три):
    1. Не факт, что за время работы приложения, понадобится экземпляр этого класса (иначе разруливаем через обычный static)
    2. Создавать его очень дорого, и его экземпляр требует много ресурсов (памяти, или может каких-то неуправляемых), по тому его нужно ещё и переиспользовать везде. (иначе зачем в принципе синглтон?)
    3. Нет возможности разрулить это на уровне Dependency Injection (иначе разруливаем через DI)

    Double check-lock необходим, чтобы гарантировать, что экземпляр синглтона будет создан только 1.
    Считается, что создавать экземпляр синглтона дороже, чем 1 лок.
    А проверка перед локом нужна затем, чтобы не блокировать лишний раз.
    сказали что lock это одна из самых дешевых оперций по синхронизации.

    Да, это так. Если гораздо более дорогие операции.

    get
                {
                      lock (Loker)
                      {
                            // only one check and everything is fine :)
                          if (_instance == null)
                          {
                              _instance = new Singleton1();
                          }
                    }
    
                    return _instance;
                }

    А зачем тебе Lock, если ты не собираешься изменять переменную?
    Сначала проверяешь на null, чтобы проверить, придётся ли тебе её менять.
    Потом поднимаешь lock и проверяешь снова, чтобы гарантировать, что ты один обращаешься.
    Для чтения lock не нужен.
    Проверка на null - гораздо дешевле, чем lock, по тому перед поднятием блокировки есть смысл проверить на null
    Ответ написан
  • Как исправить ошибку "To run this application, you must install .NET Core"?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Есть несколько вариантов:
    1. Использовать .net 6 - он умеет тащить за собой не весь рантайм, а только то что нужно для работы.
    По крайней мере Hello World в 12мб получалось уместить (single file + self contained + assembly trimming)
    2. Поставлять программу вместе со скриптом, который проверит, установлен ли .net runtime и установит его сам, скачав из интернета
    3. Забить и оставить как есть (засунуть в архив)
    4. Использовать .NET Framework, который идёт на винде из коробки, но имхо - это шаг назад по всем параметрам, и так делать не стоит.

    UPD: Hello world таки весит 12 мегабайт
    Ответ написан
    6 комментариев
  • C# 10. Как отказаться от программы верхнего уровня?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Ну вообще это удобно. и я не вижу каких-то причин. чтобы писать по старому.
    Но если очень сильно хочется - ты можешь создать свой собственный шаблон, в котором будет создаваться старый public static void Main и без неявных юзингов.

    Вот так выключаются global usings:
    <Project Sdk="Microsoft.NET.Sdk">
        <PropertyGroup>
            <TargetFramework>net6.0</TargetFramework>
            <Nullable>enable</Nullable>
            <ImplicitUsings>disable</ImplicitUsings>
        </PropertyGroup>
    </Project>

    Вот так создавать свой шаблон:
    https://docs.microsoft.com/ru-ru/dotnet/core/tools...
    Ответ написан
    3 комментария