Ответы пользователя по тегу .NET
  • Как Discord.NET обеспечивает связь между командами и атрибутами?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    При помощи System.Reflection ты можешь узнать, какие классы и методы сейчас загружены в память, и прочитать, какие у них стоят атрибуты, а также содержимое этих атрибутов, а потом динамически вызвать нужный метод с нужными параметрами.

    https://metanit.com/sharp/tutorial/14.1.php
    Ответ написан
    Комментировать
  • Как загрузить две сборки разных версий?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    На net framework ты можешь динамически загрузить разные версии сборок в один AppDomain, если они имеют строгое имя (с publicKey) и имеют разные номера версий.

    Если какая-то из сборок или обе не имеют publicKey, то тогда ты можешь динамически создать новый AppDomain и загрузить сборки в разные домены.
    Но тогда вместе их использовать не получится.
    https://stackoverflow.com/questions/20686362/c-sha...

    Ещё, если вдруг это какие-то зависимости у тебя требуют разные версии библиотек - ты можешь сделать так называемый binding redirect

    А на net (core) ты можешь использовать AssemblyLoadContext из ответа 0x25CBFC4F
    Ответ написан
    1 комментарий
  • Книги, курсы по архитектуре приложений?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Чтобы понимать, где domains, где infrastructure и т.д

    Чистая архитектура от дяди Боба

    Как проектировать микросервисы правильно

    Не делить на микросервисы, пока преимущества от их применения не станут очевидны.
    Ответ написан
    Комментировать
  • Как установить сертификат ssl для .net api?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Мб что-то типа такого? А полученные сертификаты добавить в локальное хранилище.
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
    
        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            var certificate = store.Certificates.OfType()
                .First(c => c.FriendlyName == "Ivan Yakimov Test-only Certificate For Server Authorization");
    
            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder
                        .UseKestrel(options =>
                        {
                            options.Listen(System.Net.IPAddress.Loopback, 44321, listenOptions =>
                            {
                                var connectionOptions = new HttpsConnectionAdapterOptions();
                                connectionOptions.ServerCertificate = certificate;
    
                                listenOptions.UseHttps(connectionOptions);
                            });
                        })
                        .UseStartup();
                });
        }
    }


    https://habr.com/ru/post/581740/
    Ответ написан
    4 комментария
  • Как запустить программу C# в фоновом режиме?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Если в windows, то сделать сервис aka службу.
    https://docs.microsoft.com/en-us/dotnet/core/exten...
    Ответ написан
  • Почему только .net framework является частью windows?

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

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

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

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

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

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

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

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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Вот такая команда в результате соберёт всё в один файл. На 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 Куратор тега C#
    Токсичный шарпист
    Сначала замечания по реализации:

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

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

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

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

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

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

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

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

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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Нужно создать приложение под платформу .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
    Токсичный шарпист
    и кроме как слов об оптимизаций я ничего особо не заметил....

    Так и есть. В основном стабилизация и расширение уже внесённых 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 комментария