Ответы пользователя по тегу C#
  • Как правильно настроить Dependency Injection в ASP.NET MVC?

    Нужно разомкнуть зависимости.

    Когда Dependency Injection либа пытается ресолвнуть "самую глубокую" зависимость, в вашем случае это IAccountsService, то она не может этого сделать, т.к. встречает цикл.

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

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

    По этой теме есть хорошая книга - Симан Марк "Внедрение зависимостей в .NET".
    Ответ написан
    2 комментария
  • Где находится статический класс в памяти?

    Вспомнил, что читал про такое в книге "Оптимизация приложений на платформе .Net".


    Таблица методов
    Поле указателя на таблицу методов ссылается на внутреннюю структуру CLR под названием таблица методов (method table), которая в свою очередь ссылается на другую внутреннюю структуру под названием EEClass (где ЕЕ, это аббревиатура от Execution Engine - механизм выполнения). Вместе, таблица методов и EEClass, содержат информацию, необходимую для выбора виртуального метода, метода интерфейса, статической переменной, определения типа объекта во время выполнения, доступа к методам базового класса и многих других целей. Таблица методов содержит часто используемую информацию, требуемую для выполнения операций такими механизмами, как механизм выбора виртуального метода, а структура EEClass содержит информацию, используемую реже, например, механизмом рефлексии. Ознакомиться с содержимым обеих структур данных можно с помощью команд !DumpMT и !DumpClass библиотеки SOS.

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


    Есть таблицы, где вся информация хранится.
    В windbg можно посмотреть подробней.

    Пример класса:
    class MyClass
    {
        private string _field1 = "Some string 1";
        public string Field2 { get; set; }
    }
    
    0:003> !do 0000005400006600
    Name:        ConsoleApplication1.MyClass
    MethodTable: 00007ffa2b5c4378
    EEClass:     00007ffa2b6d2548
    Size:        32(0x20) bytes
    File:        E:\...\ConsoleApplication1.exe
    Fields:
                  MT    Field   Offset                 Type VT     Attr            Value Name
    00007ffa89d60e08  4000002        8        System.String  0 instance 0000005400006620 _field1
    00007ffa89d60e08  4000003       10        System.String  0 instance 00000054000035a0 <Field2>k__BackingField


    Если интересно ставьте SOS и играйтесь.
    Я это уже делал, и выкладывал результаты в https://habr.com/ru/post/260047/
    Заминусили, многого не знал тогда. Но это уже история.
    Ответ написан
    2 комментария
  • Как проверять запущен ли процесс и если не запущен - запустить?

    1) Сделать его службой, с автозапуском.
    2) Сделать два процесса, которые смотрят друг на друга, и при необходимости "подымают" (такое использовалось при атаке на атомные электростанции, Марк Руссинович своими утилитами на докладе вычищал это дело). Чтобы не запускалось копий больше чем необходимо можно использовать объект синхронизации ядра (это пару строк на C#).

    Вот видео с привязкой ко времени с Марком - https://youtu.be/bNJ3HR6Z0v8?t=1964

    О, обратил внимание что вы увлекаетесь ИБ, я там около года крутился, столько всего насмотрелся, что в интернет боюсь заходить :)
    Рекомендую связаться с ребятами из Pentestit, там и чат есть.
    Ответ написан
    2 комментария
  • Есть ли деобфускатор исходных файлов C#?

    Проблем то нет, скомпилируйте, и прогоните через то что нашли.

    А так по этой теме есть лучший ресурс в сети интернет - exelab. Тема "Опять .net (part 2)". Там вы найдете все что вам понадобится и "дружелюбное" комьюнити :D
    Я там как то зависал давно, ребята лучшие в своем деле.
    Ответ написан
  • Как развернуть окно по нажатию горячих клавиш?

    На сколько я понял, нажатие клавишь направляется не в окно вашего приложения а в любое другое, например Explorer. Так как такие действия не направлены в ваш app, то словить вы их стандартным способом никак не сможете. Например у меня открыт калькулятор и браузер, то что я пиши в браузере не попадает в калькулятор, и наоборот.

    Чтобы отлавливаеть такие нажатия как вы хотите нужен глобальный хук, т.е. вы будите ловить все нажатия в Windows.
    Global keyboard capture in C# application
    Ответ написан
    Комментировать
  • Как отлавливать исключения в методе другого класса?

    Все нормально.

    class A просто обрабатывает только исключение типа "SQLExeption", и видать знает что с этим делать, а с другими ничего поделать не может, поэтому и не ловит.

    Вам же нужно либо расширить обработку class A всех других исключений, или ловить их уже в других классах, которые используют class A.

    try-catch (Справочник по C#)
    Ответ написан
    Комментировать
  • Использование неявного типизирования для определения типа переменной цикла?

    Наоборот, если вы явно укажите тип сами проблем точно не будет.

    Просто var более короткая запись, и очень часто используется когда тип справа точно известен, или наоборот неизвестен (анонимный var a = new { A = 1, B = 2}).

    С var могут быть и проблемы, например, когда мы ожидали FLOAT, а получили DOUBLE (для этого можно как указывать тип, так и ипспользовать постфикс F или D). (var приведется к ближайшему вмещающему типу)

    Я когда начинал изучать C# тоже не сразу понял в чем прикол, а со временем сам перешел на var.

    Код получается короче, и меньше дублирующейся информации:
    Customer c = new Customer();
    var c = new Customer();

    When to Use and Not Use var in C#
    Ответ написан
    Комментировать
  • Помощь в архитектуре ПО?

    Если правильно понял задачу, то:
    1) Создаем интерфейс ITestDevice, который будет единым для всех железок.
    2) Для каждой железки создается свой адаптер, который реализует ITestDevice. В нем учитываются особенности каждой железки, и подгоняются под единый интерфейс.
    3) Каждый девайс должен иметь свой уникальный Id (GUID/int32/string). Инициализируется этот Id в адаптере, или в классе устройства, который используется в адаптере.

    4) Создается интерфейс ITest. Он единый для всех тестов.
    5) Создаем тесты.

    6) Забиваем пары Id_testDevice - Id_test в храналище данных.
    7) Запускаем приложение, оно читает данные из хранилища, и передает каждому ITestDevice свои списки тестов, затем запускает их.

    ITestDevice - имеет список тестов (ITest) которые он запускает.
    ITest - может быть как атомарным тестом (1 шт), так и композитным (внутри себя содержит список других тестов, без фанатизма и рекурсий)).
    Если есть тесты только для конкретных девайсов, то тестам можно прописать типы, и проверять их (иерархией или полем type).

    А) Если тест не пройдет, то девайс завершает прогон. Это делает сам дейвайс, который смотрит на возвращаемое значение каждого теста, перебирая их в цикле. У теста может быть булево свойство Success.
    Б) Или можно сделать TestManager, который получает ITestDevice и его список ITest, и по одной штуке в цикле начинает скармливать тесты девайсу (например в метод ITestDevice.Run(ITest test)), проверяя результат, записывая в лог и решать продолжить тестирование или перейти к следующему дейвасу. Такой подход отделит правила прохода набора тестов от самого девайса, менеджер может получать их из хранилища.
    Ответ написан
  • Чем конструктор отличается от метода?

    Конструктор - специальный метод, который призван создавать экземпляры класса или структуры. У него нет возвращаемого значения (неявный void).
    Дефолтный конструктор - конструктор без аргументов.

    Метод тоже может создавать новый экземпляр, но его нельзя вызвать через оператор new .... ().

    Условно:
    Конструктор - метод для создания экземпляра.
    Метод - это поведение созданных экземпляров.

    var a = new Constructor();
    a.Method();

    https://docs.microsoft.com/ru-ru/dotnet/csharp/pro...
    Ответ написан
    Комментировать
  • Изучил C#, написал пару своих проектов. Стоит ли переходить на С++?

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

    C# - это web и игры (unity3d).
    C++ не знаю.

    И прикол - сложность языка и з.п. на нем почти никак не связаны. (ИМХО)
    Ответ написан
    3 комментария
  • Ресурсы по изучение ASP.NET CORE?

    Я почти всегда по таким вопросам первым делом захожу на metanit.com.
    А так верно, если хочется не просто ознакомиться что там такого, то оф документация и курсы на https://docs.microsoft.com/ru-ru/learn/.
    Ответ написан
    Комментировать
  • Как отключить Alt+Tab C#?

    Блог - C# Disable CTRL-ALT-DEL, ALT-TAB, ALT-F4, Start Me...

    How to Suppress task switch keys (winkey, alt-tab,...

    Сайт для поиска сигнатур импорта - pinvoke.net

    Идея - импорт dll, и блокировка средствами Windows напрямую.
    Ответ написан
    Комментировать
  • Как вернуть нумерацию в C#?

    Для парсинга HTML можно воспользоваться этой статьей на Хабре - Распарсить HTML в .NET и выжить: анализ и сравнени....

    Когда вы распарсите HTML, тогда уже и сможете делать любые нужные вам запросы к ней.
    Ответ написан
    1 комментарий
  • В чем ошибка кода?

    Если вам нужно проверять запускается ли ваша программа единственный раз на ПК, то лучше использовать такой подход:

    public static void Main ()
    	{
    	    bool IsExist;
    	    using ( new Semaphore ( 0, 1, "MyAppUniqueString", out IsExist ) ) 
    		{
    		    if ( IsExist )
    			{ /* Этот поток создает ядро, другие копии программы не смогут запуститься. */ }
    		    else
    			{ /* Этот поток открывает существующее ядро с тем же именем.
    			        Ничего не делаем, ждем возвращения управления от метода Main, чтобы завершить вторую копию приложения. */  }
    }}
    Ответ написан
    Комментировать
  • Как работать с временем (C#)?

    Мало данных.

    1) Что будет если к файлу не будет доступа?
    2) Что будет если на диске закончится место?
    3) Что будет если программу закроют, и ни о каких 20 минут не может быть и речи?
    4) Какую строку удалять если их там тысячи одинаковых?
    5) Что будет если через 20 минут файла уже не будет на диске?

    Чтобы удалить файл тем же процессом который его создал/обновил, он должен работать больше 20 минут.
    Если это невозможно, то нужно создавать другую программу, которая через 20 минут удалит из него нужный текст. А запускать ее джобой.

    Если речь о задачке для себя, то можно просто использовать Timer.
    В C# 4 типа таймеров, по линку выше они описаны.
    System.Timers.Timer
    System.Threading.Timer
    System.Windows.Forms.Timer
    System.Web.UI.Timer
    Ответ написан
  • Нужен совет: чему учиться,в какое направление идти?

    JS - быстро, работы в разы больше чем на любом другом языке. Проще изучить, проще найти первую работу.
    C# - долго, работы много. Изучать ощутимо сложнее чем JS.

    Я лично начинал с C#, потом подключил JS.

    ЗП - тут все сложно, "крутость" языка ничего не значит. Можно формочки клепать, условно за 100к (JS), а можно сложную логику мутить за те же 100к (C#). Все зависит от города, должности, компании, рынка, ваших умений торговаться. Но в целом на C# потолок будет выше (300-500+), чем просто JS. Но до потолка еще дойти нужно, а это много лет работы.
    Ответ написан
  • Как сделать генератор тестов ASC.NET C#?

    Проще самому сделать.

    class Question {
    List<Answer> Answers { get; set; }
    }
    
    class Answer {
    string Text;
    bool isValid;
    }


    На metanit.com/sharp/ читаем про Entity Framework, делаем приложение по шаблону сущности (создать, прочитать, удалить), и накидываем функционал. Можно найти видео как люди делают список книг или еще что-нибудь похожее, и переделать это под свое.
    Ответ написан
    Комментировать
  • Рисование и написание символов по трафарету. Как это работает?

    Если речь о мобильных клиентах, то простой путь - использование готовых фреймворков.
    1) Бегло читаем мануал по Unity3d.
    2) Смотрим видео по запросу "unity3d text animation".
    3) Смотрим видео как рисовать на экране - "Unity Mobile Dev from Scratch: Drawing on the Screen".

    Просто как 1, 2, 3. Только в сказке :)

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

    Я давно делал подобное.

    Из заметок:
    - AForgeNet — библиотеки компьютерного зрения и искусственного интеллекта;
    - Tesseract — программа для распознавания текстов;
    - Fanndotnetwrapper — обертка .NET нейросети FANN;
    - алгоритм поиска связанности CCLA от Omar Gameel Salem. (поиск ближайших соседей, как определять буквы, и отделять их друг от друга).

    Есть уже ML .NET - https://github.com/dotnet/machinelearning-samples

    У вас картинка идеальная, можно сказать тут и онлайн бесплатные распозновалки отработают на 100%.

    Готовые решения думаю гуглятся, помоему даже в AForgeNet есть). - https://www.codeproject.com/Articles/11285/Neural-...

    Компьютерное зрение, готовое API - https://azure.microsoft.com/ru-ru/services/cogniti...

    Но да, первый раз сложно доходит, но как только один раз заведете это дело, то потом уже в разы проще будет.
    Ответ написан
    1 комментарий
  • Как открыть dll файл как текст в c#?

    Самый простой и удобный способ, если изменений много или они не простые.
    Качаем бесплатный dotpeek.
    Открываем в нем dll или exe как проект (будут сгенерированы файлы проекта).
    Редактируем и компилируем снова, но уже с внесенными изменениями.

    Если хочется без перекомпила, то тут много других утилит, названия забыл уже, но их много.
    Ответ написан
    Комментировать