Ответы пользователя по тегу C#
  • Почему форма не скрывается?

    tomnolane
    @tomnolane
    профессиональный разработчик
    в-первом случае - вы создаёте новый объект типа Form1 и его же скрываете. От сюда и эффекта ноль. Т.е. вы создали другой объект и его скрываете. Не главную форму...
    во-втором случае - происходит рекурсия - т.е. объект (типа Form1) создаёт сам себя по образу и подобию "оригинала", потом второй объект создаёт сам себя по образу "оригинала" и т.д., пока буффер памяти не переполнится.

    ОТВЕТ:
    Чтобы скрыть форму (текущую, в которой вы работаете) - достаточно
    this.Hide();
    Ответ написан
    Комментировать
  • Private недопустим для данного элемента?

    tomnolane
    @tomnolane
    профессиональный разработчик
    вот полностью работающий код (п.с. на форме должно быть у вас 3 кнопки, 3 label и 1 timer, названия у всех по умолчанию + у всех кнопок - события click должно быть (также по умолчанию) и событие Tick у timer)

    public partial class Form1 : Form
        {
            int m = 0;
            int s = 0;
            int ms = 0;
            public Form1()
            {
                InitializeComponent();
    
                // интервал - с какой частотой будет обновляться таймер (п.с. 2 раза в секунду = 500 миллисекунд
                timer1.Interval = 500;
    
                // называем кнопки
                button1.Text = "Пуск"; 
                button2.Text = "Пауза";
                button3.Text = "Сброс"; 
    
                // присваиваем label'ам "текст"
                label1.Text = "0"; // минуты
                label2.Text = "00"; // секунды
                label3.Text = "000"; // миллисекунды
    
                button2.Enabled = false; //  кнопку "приостановить" - "замораживаем" 
                button3.Enabled = false; //  кнопку "сброс" - "замораживаем" 
            }
    
            private void button1_Click(object sender, EventArgs e)
            { 
                // если таймер включен
                if (timer1.Enabled)
                {
                    timer1.Enabled = false; // останавливаем таймер
    
                    button1.Text = "Пуск"; // переименовываем кнопку
                    button2.Enabled = false;  // кнопку "приостановить" - "замораживаем" - т.е. делаем неактивной
    
                }
                else //если таймер выключен, тогда его запускаем
                {
                    // обнуляем значения (понадобится после второго и последующего запуска)
                    m = 0;
                    s = 0;
                    ms = 0;
    
                    timer1.Enabled = true; // запускаем таймер
                    button1.Text = "Стоп"; // переименовываем кнопку
                    button2.Enabled = true; // кнопку "приостановить" - "размораживаем" - позволяем делать её кликабельной 
                }
            }
            private  void timer1_Tick(object sender, EventArgs e) // то, что делает таймер, когда она запущен
            {
                 
                if (s < 60) // если секунды меньше 60
                {
                    s++; // увеличиваем секунды 
                    label2.Text = s.ToString(); // записываем в лабел2 где секунды (предварительно int переделав в string) 
                    // п.с. компилятор справа налево "читает"
                }
                else // если секунды равны 60 или более, то
                {
                    m++; //увеличиваем минуты
                    label1.Text = m.ToString(); // записываем в лабел для минут
                }
    
                label3.Text = DateTime.Now.Millisecond.ToString(); // записываем в лабел3 для миллисекунд текущие миллисекунд по времени 
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                if (timer1.Enabled) { timer1.Stop(); button2.Text = "Продолжить"; button3.Enabled = true; }
                else { timer1.Start(); button2.Text = "Пауза"; button3.Enabled = false; }
            } 
    
            private void button3_Click(object sender, EventArgs e) //кнопка "сброс" времени
            {
                timer1.Enabled = false; 
    
                // присваиваем первоначальные значения
                button1.Text = "Пуск";
    
                // обнуляем значения
                m = 0;
                s = 0;
                ms = 0;
    
                label1.Text = "0";
                label2.Text = "00";
                label3.Text = "000";
    
                button2.Enabled = false; //  кнопку "приостановить" - "замораживаем" 
                button3.Enabled = false; // тоже самое с кнопкой "сброс"
            }
    
           
        }

    7ba241471aa84f21a8df1aa09eff6268.PNG
    думаю разберётесь
    п.с. писал по проще - без рефакторинга

    п.с.с.
    Private недопустим для данного элемента

    весь ваш код неправильный и говорить о private преждевременно, да и (как я увидел и понял, что в книге должно было быть) -он никакой роли тут вообще не играет
    И что за странный способ выводить цифры через label, а не masked textbox?

    на вкус и цвет... п.с. я тоже всегда вывожу в label
    Ответ написан
    Комментировать
  • Разработка своих асинхронных функций, какой шаблон верный?

    tomnolane
    @tomnolane
    профессиональный разработчик
    всегда пользуюсь так:
    //для метода, который ничего не возвращает
    public async Task Blabla()
    {
        await Task.Run(()=>{
    
         //тут я что-то выполняю
    
         });
    }

    //для метода, который возвращает тип string (для примера)
    public async Task<string> Blabla()
    {
        return await Task.Run(()=>{
    
         return "я возвращаюсь!!!";
    
         });
    }

    и всё.

    просто. работает. читабельно.

    upd.
    Петр - мэрси, напомнили)

    upd2
    Славка: вот тут ответ на то, где TaskCompletionSource применяется на практике
    Ответ написан
    1 комментарий
  • Правильно ли я размышляю по поводу ref и out?

    tomnolane
    @tomnolane
    профессиональный разработчик
    Правильное ли мое утверждение в этом коде, что a,b - ref по дефолту в CLR ?

    нет.
    Ключевое слово ref используется для передачи аргумента по ссылке, а не по значению.
    Эффект передачи по ссылке в том, что все изменения вызываемого метода отражаются на значении переменной аргумента, используемой в вызове метода. Например если вызывающий объект передает выражение локальной переменной или выражение доступа к элементу массива и вызванный метод заменяет объект, на который ссылается параметр ref, то локальная переменная или элемент массива взывающего объекта теперь ссылаться на новый объект.
    (источник)
    вы передаёте (в примере) в static void Add значение, а не ссылку на это значение.

    если не используете ref - то переменная будет менять своё значение (если к ней что-то добавите/отнимите и т.д.).
    условно:
    int a = 1;
    a = a*5+9; // a=14;


    Если будете использовать ref - то, "значение" будет меняться по ссылке

    static void Method(ref int i)
            { 
                i = i + 30;
            }
    
            static void Main()
            {
                int val = 1;
                Method(ref val);
                Console.WriteLine(val); 
                // Output: 31
            }
    Ответ написан
    Комментировать
  • Как сделать "глубокий" массив с разными типами данных в C#?

    tomnolane
    @tomnolane
    профессиональный разработчик
    в вашем случае, (лично я) использовал бы примерно так:
    Dictionary<string, string[]> wordDictionary = new Dictionary<string, string[]>();
    wordDictionary.Add("YANDEX", new string[] {'yandex1','yandex2'});
    wordDictionary.Add("GOOGLE", new string[] {'google1','google2'});


    или так

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication5
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<UserInfo> my_list = new List<UserInfo>();
    			my_list.Add(new UserInfo { name = "Вася", age = 19, male = true});
    			my_list.Add(new UserInfo { name = "Маша", age = 23, male = false});
    
                Dictionary<string, UserInfo> dic = new Dictionary<string, UserInfo>();
                dic.Add("YAndeX", my_list[0]);
                dic.Add("GooGle", my_list[1]);
    
                foreach (var temp in dic)
                {
                    Console.WriteLine("Key: " + temp.Key + " Value: Age" + temp.Value.age + " Name: " + temp.Value.name + " is male: " + temp.Value.male);
                }
                Console.ReadLine();
            }
        }
    
        class UserInfo
        {
            public string name { get; set; }
            public int age { get; set; }
            public bool male { get; set; }
        }
    }


    --------------------------------------------------------

    надеюсь вам поможет:
    1) массивы для знакомства
    2) кортеж
    3) класс Dictionary< TKey, TValue >
    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApplication1
    {
        class UserInfo
        {
            // Метод, реализующий словарь
            public static Dictionary<int, string> MyDic(int i)
            {
                Dictionary<int, string> dic = new Dictionary<int,string>();
                Console.WriteLine("Введите имя сотрудника: \n");
                string s;
                for (int j = 0; j < i; j++)
                {
                    Console.Write("Name{0} --> ",j);
                    s = Console.ReadLine();
                    dic.Add(j, s);
                    Console.Clear();
                }
                return dic;
            }
        }
    
        class Program
        {
            static void Main()
            {
                Console.Write("Сколько сотрудников добавить? ");
                try
                {
                    int i = int.Parse(Console.ReadLine());
                    Dictionary<int, string> dic = UserInfo.MyDic(i);
    
                    // Получить коллекцию ключей
                    ICollection<int> keys = dic.Keys;
    
                    Console.WriteLine("База данных содержит: ");
                    foreach (int j in keys)
                        Console.WriteLine("ID -> {0}  Name -> {1}",j,dic[j]);
                }
                catch (FormatException)
                {
                    Console.WriteLine("Неверный ввод");
                }
    
                Console.ReadLine();
            }
        }
    }
    Ответ написан
    Комментировать
  • Почему webbrowser теряет ссылку после #?

    tomnolane
    @tomnolane
    профессиональный разработчик
    вот мой код который работает (п.с. ВК ругается на низкие IE версии, и в своё время моё приложение работало на моём компе, но когда поставил на комп сестры (у нас ВИН7, но у меня ИЕ обновлённый (11), у неё нет (8), у неё ВК отказывался запускать - мол старый бразуер... по-этому я использую awesomium вместо стандартного браузера):
    public Form1()
            {
                InitializeComponent();
                 
                webbrowser.BringToFront(); 
                webbrowser.Visible = true;
                string url = "https://oauth.vk.com/authorize?client_id=" + VK_main.ID_APP + "&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=" + VK_main.SCOPE + "&response_type=token&v=" + VK_main.VERSION; 
                webbrowser.LoadingFrameComplete += Webbrowser_LoadingFrameComplete; //жду окончания загрузки
                webbrowser.Source = new Uri(url);
            }
    
            private void Webbrowser_LoadingFrameComplete(object sender, FrameEventArgs e)
            {
                if (!e.IsMainFrame) return;
    
                if(e.Url.ToString().Contains("https://oauth.vk.com/blank.html#access_token="))
                { 
                    int start = e.Url.Fragment.IndexOf("=");
                    int end = e.Url.Fragment.IndexOf("&");
                    VK_main.TOKEN = e.Url.Fragment.Substring(start+1, end-start-1); // записываю в "глобальную переменную токен
                    webbrowser.LoadingFrameComplete -= Webbrowser_LoadingFrameComplete;
                    webbrowser.Visible = false;
                }
            }


    п.с. проблема может быть в версии IE (по умолчанию webbrowser - использует ядро IE)
    Ответ написан
  • Как написать linq выражение?

    tomnolane
    @tomnolane
    профессиональный разработчик
    string[] input = { "Нет", "20000", "30000", "45000", "50000", "75000" }; int t; const int maxSum = 60000;
    var output = (from f in input where int.TryParse(f, out t) ? t < maxSum : true select f).ToArray();
    Ответ написан
    Комментировать
  • Использование одной переменной несколькими объектами. Как это происходит?

    tomnolane
    @tomnolane
    профессиональный разработчик
    Не понимаю, как в одну переменную записывается 2 разных значения

    People humanoid_1 = new People("Name1"); // humanoid_1 -> переменная раз
                People humanoid_2 = new People("Name2"); // humanoid_2  -> переменная дваз

    тобишь уже две разные переменные типа People.
    Все типы значений являются производными от типа System.ValueType и размещают свое значение в стеке.
    тобишь вы создали две переменны ссылочного типа People. А ссылочные типы хранятся в куче. А при создании объекта ссылочного типа People humanoid_1 = new People("Name1"); в стеке помещается ссылка на адрес в куче.
    Главный тобишь: у вас две кучи)
    Ответ написан
    1 комментарий
  • Что почитать по теме "Электронная цифровая подпись"?

    tomnolane
    @tomnolane
    профессиональный разработчик
    я сейчас занимаюсь аналогичным.
    статья
    статья

    вкратце:
    Простая ЭП. является электронная подпись, которая посредством использования кодов, паролей или иных средств подтверждает факт формирования электронной подписи определенным лицом.

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

    Квалифицированная ЭП. Может быть получена только в удостоверяющем центре, аккредитованном Минкомсвязи России, а используемое ПО должно быть сертифицировано ФСБ. Квалифицированная ЭП безусловно наделяет документы всей полнотой юридической силы, и поэтому используется для информационного обмена с органами государственной власти и для участия в электронных торгах.

    в итоге сейчас в свой проект решил использовать услуги СБИС, точнее их API для ЭЦП и документооборота, т.к. у них есть сертификация от ФСБ, да и геморроя меньше при работе с другими контрагентами/компаниями, т.к. собственный алгоритм(механизм проверки/защиты/шифрования) - наверняка не вызовет "доверия" у компаний, когда оборот идет на *миллионов рублей. Т.е. я смотрю на использование процедуры подписания/проверки ЭЦП уже у популярного, акредитованного, сертифицированного (и известного) для всех участников компании/центра (СБИС), нежели самому всё это создавать и потом ещё доказывать, что я (как разработчик) не смогу подделать чужую подпись на договоре и т.д. и т.п.

    п.с. если есть аналоги СБИСа - прошу отписаться

    п.с.с. под c# нашёл API тык, но пока ещё с ним не работал (только собираюсь)
    Ответ написан
    7 комментариев
  • Слишком длинная строка.Как передать большой массив в хранимую процедуру VK API?

    tomnolane
    @tomnolane
    профессиональный разработчик
    вот как я отправляю через post
    // сам post
    public async Task<string> POST(string url, NameValueCollection nvc = null)
            {
                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                    request.Method = WebRequestMethods.Http.Post;
                    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0";
                    request.AllowAutoRedirect = true;
                    request.ProtocolVersion = HttpVersion.Version11;
                    request.AllowWriteStreamBuffering = true;
                    request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
                    string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
                    request.ContentType = "multipart/form-data; boundary=" + boundary; 
                    request.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
                    request.Headers.Add("Accept-Encoding", "gzip, deflate");
                    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
    
                    if (nvc != null)
                    {
                        Stream rs = request.GetRequestStream();
    
                        byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
                        string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
                        string _key = String.Empty;
                        foreach (string key in nvc.Keys)
                        {
                            rs.Write(boundarybytes, 0, boundarybytes.Length);
                            string formitem = string.Format(formdataTemplate, key, nvc[key]);
                            byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
                            rs.Write(formitembytes, 0, formitembytes.Length);
                        }
                        rs.Write(boundarybytes, 0, boundarybytes.Length);
                    } 
    
                    return await Task.Run(() =>
                    {
                        string resp = RESPONSE(request);
                        return resp;
                    });
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
    //  post обращается к  ответу
     public string RESPONSE(HttpWebRequest request)
            {
                try
                {
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    string answer = "";
                    var headers = response.Headers.ToString();
    
                    if (Convert.ToInt32(response.StatusCode) == 302 || Convert.ToInt32(response.StatusCode) == 200)
                    {
                        using (Stream rspStm = response.GetResponseStream())
                        {
                            using (StreamReader reader = new StreamReader(rspStm, Encoding.UTF8, true))
                            {
                                answer = String.Empty; answer = reader.ReadToEnd();
                            }
                        } 
                        return answer;
                    }
                    else
                    {
                        response.Close(); return WebUtility.HtmlDecode(response.StatusDescription);
                    }
                }
                catch (Exception ex)
                {
                    return WebUtility.HtmlDecode(ex.Message);
                }
            }
    
    //после этого сам  код: (на примере wall.get)
    public async System.Threading.Tasks.Task<bool> GetWall(int id_group, int offset = 0)
            {
                try
                {
                    string url = "https://api.vk.com/method/wall.get?";
                    Main_Tools mt = new Main_Tools();
    
                    // вот что вам надо: создать коллекцию и передать в post (и добавлять/заполнять через for || foreach для вашего случая
    
                    NameValueCollection nvc = new NameValueCollection();
                    nvc.Add("access_token", VK_main.TOKEN);
                    nvc.Add("owner_id", id_group.ToString());
                    nvc.Add("count", "1");
                    if(offset != 0) nvc.Add("offset", offset.ToString());
                    nvc.Add("filter", "owner"); 
                    nvc.Add("v", VK_main.VERSION);
                    
                    // добавляете сколько вам нужно параметров и передаёте в метод POST вторым аргументом
    
                    string t = await mt.POST(url, nvc);
                   dynamic d = JObject.Parse(t);
                   // и далее разбираете json
    //.. и т.д.
    Ответ написан
    1 комментарий
  • В чем ошибка в обращении к хранимой процедуре vk api?

    tomnolane
    @tomnolane
    профессиональный разработчик
    https://api.vk.com/method/execute.getFriends?&access_token=aaaaaabbbbbbbccccc&users=1,23

    между execute.getFriends?&access_token у вас ?&. Это не правильно. Знак амперсанда уберите из запроса и добавьте "&v=5.63"
    Ответ написан
    1 комментарий
  • Зачем тут тип dynamic?

    tomnolane
    @tomnolane
    профессиональный разработчик
    тип dynamic существует только во время компиляции, но не во время выполнения

    источник
    т.е. после компиляции, компилятор сам его преобразует (если получится) в нужный тип (например в int)
    зачем тип счетчика вообще указывать как dynamic

    я тоже не вижу (никакого) смысла так указывать. Эта точно не та вещь, ради которой ввели саму сущность ( dynamic ). Более рациональное использование - это в JSON объектах и для взаимодействия с .COM
    Ответ написан
    Комментировать
  • Как избавится от ошибки при загрузки страницы в WebBrowser C#?

    tomnolane
    @tomnolane
    профессиональный разработчик
    тык - раздел "примеры"

    п.с. с IE (webbrowser использует IE как "ядро") - у меня постоянно было полно проблем... т.к. на разных компах (у клиента) могли быть разные версии IE. И что-то работало, что-то нет (например ВК ругается на низкую версию IE). И я решил установить "встроенный" сторонний браузер: awesomium. У него меньше проблем, чем у IE... он будет работать у всех клиентов... не зависимо от ОС (ну я имею ввиду от Win7 и выше) единственное, не очень удобно использовать javascript через него (своеобразно скажем так...). А так я очень доволен и использую ТОЛЬКО его (awesomium).

    upd
    js in awesomium:
    тык
    тык
    Ответ написан
    Комментировать
  • Тематика курсовой работы?

    tomnolane
    @tomnolane
    профессиональный разработчик
    первое, вот -> моя программа CatPost написанная полностью на c# (wpf) которая использует оф. API (в т.ч. и ВК)
    так что - на C# МОЖНО работать с API (да и наверно с любым языком ООП или Функциональным, прототипно-ориентированный и некоторых других видах)
    второе, (простое) приложение для VK на c#: подробная статья

    п.с. на youtube полно видео уроков - как создать (простое) приложение для работы с API VK на C#
    п.с.с. на github тоже можно найти разные и полезные решения/наработки

    насколько это сложно, насколько целесообразно ?

    Просто(гугл/яндекс/ютуб/хабрахабр/тостер в помощь), целесообразно

    Тематика:
    по аналогии Алексей Лебедев -> создать приложение, которые ищет всех в ВК, кто учится в вашем учебном заведении - показать в списке: вместе с имя/фамилия + ава + id + пол (п.с. если память не изменяет, максимум API может за раз показать список первых 5000 юзеров)
    Ответ написан
    1 комментарий
  • Как определить на какой Control было нажатие, если он создан кодом?

    tomnolane
    @tomnolane
    профессиональный разработчик
    вы обращали на объект sender при создания метода Click у кнопки?
    private void button1_Click(object sender, EventArgs e)  
      {
      // тут какой-то код
      }

    так вот, этот sender и есть - та вещь, которая вам нужна, т.е.
    private void label_Click(object sender, EventArgs e)  
      {
        Label lb = sender as Label;
          lb.Content = "какой-то текст";
    // или 
         int x;
        switch((sender as Label).Name)
        { 
              case "label":  x = 0; break; 
              case "label2": x = 1; break; 
              case "label3": x = 2; break; 
              default: x = -1; break; 
        }
      }

    вот и всё) sender - знает тот объект, по которому "кликнули"
    Ответ написан
    1 комментарий
  • Как правильно конвертировть картинку в Base64 для последующего вывода в браузере?

    tomnolane
    @tomnolane
    профессиональный разработчик
    вот мой код:
    Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
    
                Graphics graphics = Graphics.FromImage(printscreen as Image);
    
                graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
    
                var ms = new MemoryStream();
    
                printscreen.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
    
                string convertedImg = Convert.ToBase64String(ms.ToArray(), Base64FormattingOptions.None);


    получаю на выходе:
    /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAMABVYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRV... и т.д.


    вставляю в ручную в браузер (п.с. без пробелов, как у вас
    <img alt="" src="data:image/png;base64,ТУТ_ПРОБЕЛА_У_ВАС CONVERTED_BASE64"/>
    между base64, и CONVERTED_BASE64)

    получаю:
    86911b10be4643f1b42b3ca4172c7a6a.PNG
    а получаю скриншот из Visual Studio
    Ответ написан
    1 комментарий
  • C# книги какие прочитать?

    tomnolane
    @tomnolane
    профессиональный разработчик
    ИМХО: я рекомендую начать с видео курса - так быстрее и проще втянуться в язык и понять его. Не обращайте внимание, что видео не совсем новое - для знакомства с C# вполне достаточно. После того, как посмотрите этот курс + можно парочку других, потом скачайте купите книгу Джеффри Рихтера например эту - и эта будет ваша "библия". Только сразу, после прочтения (или во время) каждой главы - пробуйте сразу всё повторить в Visual Studio 2015/2017

    Вот собственно краткий ответ
    Ответ написан
    2 комментария
  • Как организовать авторизацию и аутентификацию в WPF приложении?

    tomnolane
    @tomnolane
    профессиональный разработчик
    у меня аналогичная проблема была Как ограничить использование своего декстоп-приложения (.exe) только тем, кто зарегистрирован у меня на сайте (как это выглядит примерно?)?
    Смысл в чём: всё что вы напишите на c# || vb можно будет посмотреть (тем или иным образом). Т.е. если едёт аутентификация внутри приложение - то более менее грамотный специалист через CIL увидет, что и с чем сравнивается. Обусфакция - уберёт праздошатающих и студентов. Я пока (лично для себя) решил так: кто пользуется моим приложением - должен ввести логин и пароль, после чего (используя любой принцип шифрования) - отправляется ко мне на сайт, где сравнивается с логином/паролем из БД. Если гуд, тогда обратным вызовом я передаю непосредственно тот файл, который "рабочий" (exe,dll). Точнее ссылку для скачивания его. Приложение подключает его через рефлексию. Перед закрытием, файл (exe,dll) удаляется. Более грамотно - это использовать API. Т.е. вы создали приложение в WPF - в котором нету никакой информации - только кнопки, методы, классы, сво-ва и т.д. Ваше приложение (после аутентификации) обратным методом возвращает в JSON или XML формате данные, которые непосредственно вставляются в ваш WPF. И это наверно самый правильный вариант - сделать, всё через API. Все проверки/добавления/удаления в БД - только через php вашего сайта. В самой программе - никаких паролей и прочего.

    от слов к делу: https://tomnolane.ru собственно это он

    п.с. регистрацию сделал через сайт
    Ответ написан
  • Какие требования для разработки приложений под Windows XP и выше?

    tomnolane
    @tomnolane
    профессиональный разработчик
    Какие требования для разработки приложений под Windows XP и выше?

    использовать максимум .Net framework 4.0 (не выше, можно ниже). И синстаксис c#4-5 версий, т.к. XP понятия не имеет что это значит на версии c#7:
    string my_text = "Hello";
    string nickname = "ogpol32!";
    Console.WriteLine(string.Format($"({my_text}, {nickname})"));

    ещё можно добавить, что постараться сделать приложение максимально не требовательно к ресурсам компьютера/памяти (хотя это касается любых приложений под любые ОС)
    и (в идеале) постараться использовать как можно меньше костылей и дополнительных(не родных) библиотек в проекте. Вообщем, чем проще, тем лучше.
    И есть ли существенная разница?

    существенная. Я лично пишу под/на .Net 4.5 и (конечно) с XP пролетаю... Между 4 и 4.5 разница достаточно существенная: особенно касается обработки исключений и многопоточности. Но увы и ах... на .Net 4 придётся пожертвовать "синтаксическим сахаром" в результате чего, код будет менее читабелен и удобен.
    Как вы относитесь к Telerik?

    к сожалению я им не пользовался( и не могу подсказать, разве что, Telerik заточен под .Net 4 Client (не ниже)
    fa1746047c24437d8854507ff13331e2.PNG

    вообщем, используйте .Net framework 4 Client и версию c#4-5 и да прибудет с вами сила...

    upd
    677a22bb956243e8b66c717184bcd4bf.PNG
    Ответ написан
    1 комментарий
  • C# SendKeys.Send в игре?

    tomnolane
    @tomnolane
    профессиональный разработчик
    6 комментариев