Ответы пользователя по тегу C#
  • Как декомпелировать программу C#?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    кхмм... все выше - детский лепет.. Red Gate .Net Reflector.. но он не бесплатный...
    Ответ написан
    3 комментария
  • Как сделать чтобы OleDbConnection не терял БД?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    1 - вы разобрались с понятием connection string? где оно?
    2 - вы хотите видеть одну и ту же базу? или на "другом" компьютере копия базы?
    Ответ написан
    5 комментариев
  • Как найти окна по заголовку или исполняемому файлу?

    mindtester
    @mindtester Куратор тега Windows
    http://iczin.su/hexagram_48
    1 - найти окно, получить хендл (дубль ответа коллеги, тем не менее)
    [DllImport("USER32.DLL", CharSet = CharSet.Auto)]
            internal static extern IntPtr FindWindow(string lpClassName, string lpWindowName);


    2 - послать "энтрер"... а тут все может быть просто, или не совсем
    просто SendKeys мне не подошел (долгая история, но можете с него и начать ))

    3 - как вышло у меня, для типовых виндовых диалогов "открыть файл"/"сохранить файл" - надо "класс" приемник сообщения, и всю его иерархиею, начиная с хендла (диалога, в моем случае) (понадобится тула https://social.msdn.microsoft.com/Forums/vstudio/e... пример для сохранения

    "Save Table".hWndByTitle().setTitle(csvDlg).waitForIdle().sendString(
                    new string[] {
                        "DUIViewWndClassName",
                        "DirectUIHWND",
                        "FloatNotifySink",
                        "ComboBox",
                        "Edit" },
                    csv);


    реализация sendString

    internal static IntPtr sendString(this IntPtr hWnd, string[] classNames, string msg, bool verb = false)
            {
                var hCtrl = hWnd;
                if (classNames != null && classNames.Count() > 0)
                {
                    Thread.Sleep(to[toFileStdDlg]);
                    foreach (var c in classNames)
                    {
                        Thread.Sleep(to[toFileStdDlg]);
                        hCtrl = user32.FindWindowEx(hCtrl, IntPtr.Zero, c, null);
                        if (hCtrl.Equals(IntPtr.Zero))
                        {
                            $"\tERROR :: sendString not found class {c}".log();
                            return hWnd;
                        }
                        else
                            hCtrl.waitForIdle();
                    }
                }
                for (int i = 0; i < msg.Length; i++)
                    user32.PostMessage(hCtrl, WM_CHAR, msg[i], 0);
    
                Thread.Sleep(to[toFileStdDlg]);
                user32.PostMessage(hWnd, WM_KEYDOWN, user32.VkKeyScan('\r'), 0);
                user32.PostMessage(hWnd, WM_KEYUP, user32.VkKeyScan('\r'), 0);
                return hWnd;
            }
    Ответ написан
    Комментировать
  • Есть ли в c# удобная функция поиска массива байтов внутри другого массива байтов?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    эт точно... что мешает завернуть искомый шаблон в массив?

    ps
    using System;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] data = new int[128];
                /// init data
                int[] marker = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };  // фикция.. но и работа бесплатная
                bool marker_present = default;
                for (var i = 0; i < data.Length - marker.Length; i++) // data.Length-marker.Length важно, иначе можете получить вылет за границы диапазона
                {
                    marker_present = true;
                    for (var j = 0; j < marker.Length; j++)
                        if (data[i + j] != marker[j])
                        {
                            marker_present = false;
                            break;
                        }
                }
                Console.WriteLine($"marker_present = {marker_present.ToString().ToUpper()}");
            }
        }
    }
    Ответ написан
    4 комментария
  • Как самоуничтожить программу при невыполнении условия?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    любопытно..
    - можно создать процесс в памяти не из файла, и передать ему управление
    - чем вас не устраивает просто отказ от работы? )) .. начнем с того что ни кто не запрещает, не акредитованному пользователю, иметь копию в downloads (и тд) .. закончим тем, что без применения дотфускатора (хотя бы бесплатного) любая школота, с достаточным энтузиазмом, вылечит вашу "защиту"

    ps удалять нет смысла, если оригинал не защищен, хотя бы дотфускатором. если защищен - вряд ли стоит так заморачиваться, достаточно отказаться от работы

    pps тоже думал о привязках - мне больше нравится идея привязки к SID системы или пользователя. гарантировано уникально, зато можно позволить пользователю менять диск на больший или более быстрый.. и даже менять комп.. (в рамках одной сети сама винда начнет визг, при попытке дублирования SID ос, а вот SID юзера... в рамках корпоративного AD - да, может белее чем тиражироваться) (но кто запрещает проверять пару сидов сразу?)
    Ответ написан
    Комментировать
  • Удалить байты из файла без его полной перезаписи можно только с конца?

    mindtester
    @mindtester Куратор тега Windows
    http://iczin.su/hexagram_48
    философски все классно.. а где примеры C# кода то?
    мне не известен способ, без перезаписи файла (если ОС умеет оптимизировать - хвала ей upd но.. назовите ее )))
    а базовый набор инфы, к примеру тут - https://metanit.com/sharp/tutorial/5.4.php

    ps в современных компах, при размерах файла в считанные мегабайты - это все мелочи

    pps
    - нужна синхронизация по блокам/кластерам, в теории - да, нет проблем, вот только не C#

    ppps
    в лучшем случае это будут вызовы api системы, но тогда повторюсь - примеры в студию, и я присоединюсь к аплодисментам
    Ответ написан
  • Как вы пишите дебаг? Какие устоявшиеся методики существуют?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    собственная реализация логгера в каждом классе быстро утомит..
    1 - есть https://msdn.microsoft.com/ru-ru/library/system.di... там много готовых инструментов
    2 - можно реализовать свой простейший логгер в виде расширения (в утилитарном статическом классе), пример
    internal static void log(this string txt) => tbLog.AppendText(txt + Environment.NewLine);

    потом очень удобно использовать в любом месте
    $"что то прошло не так, параметры первый {x} и второй {y}".log();

    3 - еще удобные опции компилятора, для конструкций, которые явно не нужны в продакшене
    #if DEBUG
                var sw = new Stopwatch();
                sw.Start();
    #endif
                /// что то делаем
    #if DEBUG
                sw.Stop();
                var ts = sw.Elapsed;
                $"total time '{name_of_action}':".log();
                $"\t{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}.{ts.Milliseconds:000}".log();
    #endif
    Ответ написан
    Комментировать
  • Как правильно написать метод?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    у вас path содержит имя файла?
    или только целевую папку?
    если содержит:
    File.Delete(path);
    если нет, можно и всю папку зачистить
    foreach (var f in Directory.EnumerateFiles(path, "*.*"))
       File.Delete(f);

    или первый в папке
    File.Delete(Directory.EnumerateFiles(path, "*.*")[0]);

    а можно и папку грохнуть, со всем содержимым (это как раз одобряется вторым параметром)
    Directory.Delete(path, true);
    .. а потом пересоздать... ни когда не задумывался - что быстрее в итоге? ))
    Ответ написан
    Комментировать
  • Почему не работает метод Console.WriteLine (C#)?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    1 - код вообще то работает. хотя надежнее создавать из шаблонов приложений, пока не разберетесь что к чему

    2 - у вас подозрительно бледная строка using System; на скрине выделеноH9DF1J0.png это значит что библиотека не подключается реально. вот если в узле References все зачистить, возможно будет именно такой эффектtbnM76o.png
    Ответ написан
  • C# - Как исправить ошибку - Индекс находился вне границ массива?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    скорее всего причина на скрине
    pk91U3j.png
    Ответ написан
    6 комментариев
  • Как программно сменить значок любого элемента в Windows?

    mindtester
    @mindtester Куратор тега Windows
    http://iczin.su/hexagram_48
    не ответ на ваш вопрс в точности.. но фрагмент кода, формирующего типичный ярлык (на файрефокс)

    static void buildLinks(this IEnumerable<string> profiles, string bro)
            {
                try
                {
                    dynamic sh = Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")));
                    var successCount = 0;
                    foreach (var p in profiles)
                    {
                        var pl = p.Split(backSlashDelimiter, StringSplitOptions.RemoveEmptyEntries);
                        var pnPoint = pl.Length - 2;
                        var profileName = pl[pnPoint];
    
                        var profileLocation = new StringBuilder()
                            .Append("%APPDATA%").Append(backSlash)
                            .Append(pl[pnPoint - 3]).Append(backSlash)
                            .Append(pl[pnPoint - 2]).Append(backSlash)
                            .Append(pl[pnPoint - 1]).Append(backSlash)
                            .ToString();
    
                        try
                        {
                            dynamic lnk = sh.CreateShortcut(linkLocation + profileName + ".lnk");
                            lnk.TargetPath = bro;
                            lnk.Arguments = ffOptions + " " + profileLocation + profileName;
                            lnk.WorkingDirectory = profileLocation;
                            lnk.IconLocation = iconLocation + iconName + ", " + iconIndex;
                            lnk.Description = "created by ff.links on C#";
                            lnk.Save();
                            " .. created link for profile ".print(pfx, profileName);
                            successCount++;
                        }
                        catch (Exception e) { $"FAIL create link for profile {profileName} - {e.Message}".print(pfx); }
                    }
                    $"total created links {successCount}".print(pfx);
                }
                catch (Exception e) { $"FAIL 'build links' - {e.Message}".print(pfx); }
            }
    Ответ написан
    6 комментариев
  • Нужен ли установленный .NET для запуска программы?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Нужен ли установленный .NET для запуска программы?
    по самой формулировке - да. обязательно нужен установленный фреймворк. а вот какой - это уже зависит от системы (но об этом уже сказано вроде достаточно)

    ps в каментах есть подсказка, что иногда не нада
    Ответ написан
    5 комментариев
  • Смысл интерфейса (не GUI) и зачем он вообще нужен?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    я не готов дать оценку вашему пониманию ООП...
    но по ходу, в пору покувыркаться в функциональной парадигме... (хуже точно не станет)

    ps интерфейс - альтернатива множественному наследованию. как то так
    Ответ написан
    Комментировать
  • Связка Electron и C#?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    https://github.com/Wagnerp/Krypton-NET-4.70
    https://github.com/N-a-r-w-i-n/MetroSet-UI

    .. и кстати да - чем не угодил WPF? (в кровавом энтерпрайзе WinForms вообще не считают за платформу, более того - кто с нее начал, считается инвалидом)

    а еще - чем привлек Electron.NET? (там же придется овладевать js/css/html если кто то сказал, что это вместе - праздничный пирог... кхм...)

    и вспомогательный вопрос - вам нужна кроссплатформенность? (тогда только Electron.NET, точнее возможно Electron.NET, но вариантов на много больше.... но если цель винда - забудьте и про Electron.NET)

    upd вообще то "мордашек" до дури... как для форм, так и для впф... просто .. дружите с поисковиками
    Ответ написан
    Комментировать
  • Как полностью очистить массив?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Список List использовать уже не вариант, очень много переписывать)
    вообще то это единственный разумный вариант. а если освоить фичи рефакторинга VS то и переписывать навряд ли страшно много
    Ответ написан
    Комментировать
  • Как передать значение локальной переменной, на глобальную?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    1 - в шарпе нет глобальных переменных
    2 - если "другой майн" тоже на шарпе, но в другом проекте, ну так и вызовите его с параметрами, какие проблемы? <имя_проекта>.Main(new string[] { param0, param1, ....}); только в головной проект надо добавить ссылку на вторичный
    3 - или запускайте как внешний процесс, и формируйте строку параметров вызова, пример тут
    Ответ написан
    Комментировать
  • Деление меньшего на большее возвращает ноль. Как исправить?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    нет и нет... почти все слова. почти правильные...

    но суть в том, что если оба операнда int то и результат будет int...

    начните с этого
    Console.WriteLine((1.0 / 7).ToString());
    или
    Console.WriteLine((1 / 7.0).ToString());
    или
    Console.WriteLine((1f / 7).ToString());
    или
    Console.WriteLine((1 / 7d).ToString());
    или
    Console.WriteLine((((double)1) / 7).ToString());
    или
    Console.WriteLine((1 /((float)(7))).ToString());
    для верности сравните с
    Console.WriteLine(((float)(1 / 7)).ToString("0.##"));

    ... обдумайте, почему во последнем примере, приведени к "плавающей точке" запоздало... и будет полное понимание, удачи..

    ps

    ... по быренькому можно тут все проверить - https://dotnetfiddle.net/

    Давно я конечно не писал на C#..

    ..или изменилась правила деления?

    ... а тут огорчу )))... в C# так было всегда (еще точнее - во всех строготипизированых ЯП)
    Ответ написан
    2 комментария
  • Как сбросить настройки microsoft visual studio?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    правильнее так:

    1 wpJzYZG.png

    2 - DrtJdF7.png
    Ответ написан
    Комментировать
  • Какой сервер нужен для asp.net core?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    1 - все тайны тут https://docs.microsoft.com/ru-ru/aspnet/core/?view... (второй абзац)
    2 - если хостить будет на винсервере - доступны все варианты, если на линукс - IIS не доступен
    3 - даже mssql server доступен на линукс
    4 -
    В сайт заходит в 50000 человек в день
    а это уже вопрос к железу, а еще он зависит от архитектуры самомго приложения, и от архитектуры базы. оценить железо без нагрузочного тестирования невозможно
    5 - а вот
    что бы подробнее спрашивать
    скорее всего надо нанимать специалиста, это уже на площадки фриланса
    Ответ написан
    Комментировать
  • Есть ли какие-либо недостатки у статических методов?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    в C# есть очень элегантный механизм расширений возможностей существующих обьектов, он так и называется - расширения
    https://docs.microsoft.com/ru-ru/dotnet/csharp/pro...
    https://metanit.com/sharp/tutorial/3.18.php

    но реализуется он только статическими методами, и только в статических классах

    следующий пример - фабрики классов, так вот в C#, наиболее естественным образом, фабрики реализуются именно статическими методами

    всем этим приемам есть свое место и время, просто надо в этом разобраться

    ps
    Соответственно, я могу сделать метод и сам класс статическим(и иметь красивый код) или не делать(и каждый раз создавать экземпляр класса, чтобы вызвать метод) .
    и у вас будет один экземпляр класса. далеко не всегда это уместно. большинство прикладных задач, требует множества экземпляров различных классов

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

    Есть ли у статического варианта какие-то подводные камни, например, при вызове из нескольких потоков?
    у методов может и нет, зависит о того к чему они обращаются? если вызываете другие потокобезопасные методы (библиотечных классов) + изучите и будете применять потокобезопасные алгоритмы - какие могут быть проблемы? (пример - расширения LINQ, который вообще почти полностью на расширениях то и построен (то есть в основном на статических методах))

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

    вывод - статика классная штука!... однако применять ее действительно надо только тогда, когда ясно понимаете что делаете? и зачем делаете именно так?
    Ответ написан
    Комментировать