Ответы пользователя по тегу .NET
  • Для написания полноценного телеграм бота на c# надо юзать ASP.NET?

    tomnolane
    @tomnolane
    профессиональный разработчик
    бота можно написать хоть на чём угодно, зависит от "хотелок" и возможностей.
    ASP.NET лишь одно из средств (но не самое нужное для этого).
    ASP используют для серьезных web приложений, для каких-то широких целей. Создавать бота только используя ASP не рационально. Для этих целей подойдет и что-нибудь попроще - php, node.js...

    но если предполагается использовать под сервис, где к боту будут обращаться 1кк раз в сутки, то да.. можно и на ASP
    также можно для знакомства с ASP (и c#) (частью функционала) можно попробовать... Опять же зависит от потребностей и возможностей

    п.с. если хостинг в РФ (российский IP) помоем телеграмм не будет работать из-за роскомнадзора... понадобится прокси/VPN/зарубежный VPS
    Ответ написан
  • Возможно ли создать универсальный парсер html на .net?

    tomnolane
    @tomnolane
    профессиональный разработчик
    если вы под
    универсальный парсер новостей на c #
    подразумеваете: написать код один раз и дальше его использовать для разных новостных сайтов, то нет
    если написать код сразу под конкретные сайты, то "почти" да, возможно. Но могуть быть миллион и одна проблема в архетиктуре самого сайта, к примеру:
    достаточно попробовать пропарсить сайт госзакупок и сразу поймете о чем я.
    Или к примеру собрать БД по автомобилям: чтобы под каждую категорию, версию, модели, комплектации авто были все данные.

    Возможно ли чтобы он работал на большинстве сайтов

    НЕТ, работать будет если под каждый сайт делать свой парсер, либо будет "много мусора" собираться: реклама, отзывы, соседние блоки, либо браться часть контента, либо браться совсем не то...
    Ответ написан
  • Как правильно дождаться выполнения всех потоков, созданных в цикле?

    tomnolane
    @tomnolane
    профессиональный разработчик
    оффтоп
    люди подписались чисто поглазеть или поржать?

    вы уверены, что вам нужен Thread?
    Task или Thread в C#.NET 4.0 WPF? ( Павел Елизарьев доступно описал разницу в ответе)
    я бы использовал Task для начала, т.к. есть такая замечательная штука, как пулл потоков (подзабыл как на английском называется) который лучше обычного программиста (автоматически) понимает, когда и кто закончил, сколько есть свободных, сколько нужно и что с ним дальше делать. И нужно у вас в коде делать акцент не на блокирование/синхронизацию потоков (оставьте их в покое - чем быстрее сделают, тем лучше), а использовать вот такую простую штуку: Оператор lock
    а зависание происходит потому, что вы и основной поток блокируете.
    Ключевое слово lock не позволит ни одному потоку войти в важный раздел кода в тот момент, когда в нем находится другой поток. При попытке входа другого потока в заблокированный код потребуется дождаться снятия блокировки объекта.
    Ответ написан
  • Как получить *.mdf файл из Access?

    tomnolane
    @tomnolane
    профессиональный разработчик
    добавляем в rerefences библиотеку из COM: Miscrosoft ADO Ext.6.0 for DLL and Security
    59dd1c9316f57094123256.png
    далее рабочий код:
    using System;
    using ADOX;
    using System.Data.OleDb;
    using System.Data;
    using System.IO;
    
    namespace ConsoleApplication4
    {
        class Program
        {
            static void Main(string[] args)
            {
                CreateMdb("toster_ru.mdb");
                string fileNameWithPath = Environment.CurrentDirectory + "\\toster_ru.mdb";
    
                CreateTableInToMdb(fileNameWithPath);
                InsertToMdb(fileNameWithPath);
                UpdateToMdb(fileNameWithPath);
    
                var myDataTable = new DataTable();
                using (var conection = new OleDbConnection("Provider = Microsoft.JET.OLEDB.4.0;  Data Source = " + fileNameWithPath))
                {
                    conection.Open();
                    var query = "Select info From my_table";
                    var adapter = new OleDbDataAdapter(query, conection);
                    adapter.Fill(myDataTable); 
                    Console.WriteLine(myDataTable.Rows[0][0].ToString()); //output: toster2.ru
                    Console.ReadKey();
                }
            }
    
            static void CreateMdb(string fileNameWithPath)
            {
                if (File.Exists(fileNameWithPath))
                    return;
    
                Catalog cat = new Catalog();
                string connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Jet OLEDB:Engine Type=5";
                cat.Create(String.Format(connstr, fileNameWithPath));
                cat = null; 
            }
    
            static void InsertToMdb(string fileNameWithPath)
            {
                var con = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + fileNameWithPath);
                var cmd = new OleDbCommand();
                cmd.Connection = con;
                cmd.CommandText = "insert into my_table (ID, [Info], [text])  values (@ID, @Info, @text);";
                cmd.Parameters.AddWithValue("@ID", 1);
                cmd.Parameters.AddWithValue("@Info", "toster.ru");
                cmd.Parameters.AddWithValue("@text", "blabla");
                con.Open(); 
                cmd.ExecuteNonQuery();
                con.Close();
            }
    
            static void UpdateToMdb(string fileNameWithPath)
            {
                var con = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + fileNameWithPath);
                var cmd = new OleDbCommand();
                cmd.Connection = con;
                cmd.CommandText = "UPDATE my_table SET [Info] = ?, [text] = ? WHERE ID = ?;";
                cmd.Parameters.AddWithValue("@p1", OleDbType.VarChar).Value = "toster2.ru";
                cmd.Parameters.AddWithValue("@p2", OleDbType.VarChar).Value = "blabla2";
                cmd.Parameters.AddWithValue("@p3", OleDbType.VarNumeric).Value = 1;
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
    
            static void CreateTableInToMdb(string fileNameWithPath)
            {
                try
                {
                    OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + fileNameWithPath);
                    myConnection.Open();
                    OleDbCommand myCommand = new OleDbCommand();
                    myCommand.Connection = myConnection;
                    myCommand.CommandText = "CREATE TABLE my_table([ID] NUMBER, [Info] TEXT, [text] TEXT)";
                    myCommand.ExecuteNonQuery();
                    myCommand.Connection.Close();
                }
                catch { }
            }
        }
    }


    UPD
    MDF
    Ответ написан
  • Как создать WPF окно в Dll?

    tomnolane
    @tomnolane
    профессиональный разработчик
    стандартно... подключаете dll (add references)
    подключаете пространство имен using в вашем xaml.cs

    в любом удобном методе создаете новый экземпляр класса окна... далее SHOW(); ... профит...
    ------------------------------------------------------------------
    условно так:
    1) подключили dll
    2) в основном xaml.cs
    using MyWindowInDLL;
    
    ....
    ...
     public MainWindow()
            {
                InitializeComponent();
                var wind = new MyWindowInDLL.SuperWindow();
                wind.Show();
            }
    Ответ написан
  • Как написать 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"); в стеке помещается ссылка на адрес в куче.
    Главный тобишь: у вас две кучи)
    Ответ написан
  • Как избавится от ошибки при загрузки страницы в WebBrowser C#?

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

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

    upd
    js in awesomium:
    тык
    тык
    Ответ написан
  • Как визуализировать загрузку через WebClient?

    tomnolane
    @tomnolane
    профессиональный разработчик
    вот тут -> Progress Bar & Thread в C#? я дал хороший ответ на ваш вопрос
    Ответ написан
  • Как организовать авторизацию и аутентификацию в 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
    Ответ написан
  • Как в c# в TextBox вывести текст с параметрами {0}?

    tomnolane
    @tomnolane
    профессиональный разработчик
    доп.
    в c# (версии 6) есть такая возможность (чтобы не цифры использовать):
    string bla = "первое слово";
    string bla2 = "второе слово";
    textBox1.Text = string.Format($"({bla}, {bla2})"); //знак $ нужен для того, чтобы сказать, что тут именованные переменные нужно брать
    Ответ написан
  • Как на сайте имитировать щелчёк мыши по кнопке, а после этого получить новуй страницу и записать её html в переменную?

    tomnolane
    @tomnolane
    профессиональный разработчик
    сразу быстро не ответишь.. есть несколько вариантов и вам рекомендую начать с самого простого:
    посмотреть какие запросы отправляются при нажатии на кнопку и этот запрос воссоздать через HttpWebRequest и HttpWebResponse:

    string urlAddress = "http://google.com";
    
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    
    if (response.StatusCode == HttpStatusCode.OK)
    {
      Stream receiveStream = response.GetResponseStream();
      StreamReader readStream = null;
    
      if (response.CharacterSet == null)
      {
         readStream = new StreamReader(receiveStream);
      }
      else
      {
         readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
      }
    
      string data = readStream.ReadToEnd();
    
      response.Close();
      readStream.Close();
    }


    или так:
    using System.Net;
    
    using (WebClient client = new WebClient())
    {
        client .QueryString.Add("ключ", "значение"); //для get
        string htmlCode = client.DownloadString("http://somesite.com/index.html");
    }
    
    //post запрос:
    string url = "http://site.com/";
    
                using (var webClient = new WebClient())
                {
                    // Создаём коллекцию параметров
                    var pars = new NameValueCollection();
    
                    // Добавляем необходимые параметры в виде пар ключ, значение
                    pars.Add("ключ", "значение");
    
                    // Посылаем параметры на сервер
                    // Может быть ответ в виде массива байт
                    var response = webClient.UploadValues(url, pars); 
                }


    если не удастся так сделать, то выход через COM библиотеку MSHTML (для этого добавьте её "references" -> "COM" -> «Microsoft HTML object library»
    далее using mshtml;
    тут пример использования

    где полученный html вы передаёте в
    HTMLDocument doc = new HTMLDocument();
                    IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
                    doc2.clear();
                    doc2.write(//тут html-код (string));
     
                    IHTMLDocument3 doc3 = (IHTMLDocument3)doc2;
                    IHTMLElement btns = doc3.getElementById("YouId or ne YouId");

    далее находите кнопку:
    IHTMLElementCollection buttons = btns.all;
     
                    foreach (IHTMLElement element in buttons )
                    { 
                            element.click(); 
                     }


    далее опять парсим страницу.
    (п.с.с. примерно так)

    можно через webbrowser выполнить javascript
    тык и тык
    Ответ написан
  • Есть какой-нибудь профайлер для .NET CORE под OS X?

    tomnolane
    @tomnolane
    профессиональный разработчик
    ставить винду в виртуалку)))
    Ответ написан
  • При попытке компиляции появляется ошибка - Входная строка имела неверный формат,в чем проблема?

    tomnolane
    @tomnolane
    профессиональный разработчик
    тут (проблема) с пробелами:
    Console.WriteLine("SC.color ={ 0},SC.ves ={ 1},SC.power ={ 2},SC.transmission ={ 3},SC.complete_drive{ 4}", SC.color, SC.ves, SC.power, SC.transmission, SC.complete_drive);

    уберите пробелы:
    Console.WriteLine("SC.color ={0},SC.ves ={1},SC.power ={2},SC.transmission ={3},SC.complete_drive={4}", SC.color, SC.ves, SC.power, SC.transmission, SC.complete_drive);

    (где { 0}, { 1} ... нужно {0}, {1})
    Ответ написан
  • Как передать нажатую кнопку в другой метод C#?

    tomnolane
    @tomnolane
    профессиональный разработчик
    public void TakeMessage(string btnStatus, string userName, Button btnTest)
            {
    
    
                if (userName == "")
                {
                    MessageBox.Show("Введите Ваше имя!");
                }
    
                else if (btnStatus == "Red")
                {
                    btnTest.BackColor = Color.Green;
                    btnTest.Text = "Свободно";
                }
                else
                {
                    btnTest.BackColor = Color.Red;
                    btnTest.Text = userName;
                }
            }
    
    private void btnClick(object sender, EventArgs e)
            {
                var btn = sender as Button; 
    
                if (btn.BackColor == Color.Green)
                {
                    btnStatus = "Green";
                }
    
                else
                {
                    btnStatus = "Red";
                }
    
                Server.SendMessageToAll(btnStatus, tbLogin.Text);
                TakeMessage(btnStatus, tbLogin.Text, btn);
            }


    в вашем случае не вижу смысла создавать отдельный метод TakeMessage ... все что есть в TakeMessage, можно реализовать в одном методе обработчике: btnClick
    Ответ написан
  • Как парсить HTML при помощи HttpClient?

    tomnolane
    @tomnolane
    профессиональный разработчик
    способов много, но предложу использовать универсальный, пусть это и костыль, но много место не занимает, дополнительные (сторонние библиотеки не нужны...):
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Http;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication3
    {
        public static class Program
        {
            private static string html = "Ошибка";
    
            private static void Main()
            {
                ShowTags("https://www.yandex.ru/","a");
                Console.ReadKey();
            }
    
            private static async void ShowTags(string my_url, string tag = "a") // Тег по умолчанию для поиска, ищем теги <a></a>
            { 
                // Загружем страницу 
               string data = await GetHtmlPageText(my_url);
    
               if (!data.Contains("Ошибка"))
                { 
                    string pattern = string.Format(@"\<{0}.*?\>(?<tegData>.+?)\<\/{0}\>", tag.Trim());
                    // \<{0}.*?\> - открывающий тег
                    // \<\/{0}\> - закрывающий тег
                    // (?<tegData>.+?) - содержимое тега, записываем в группу tegData
    
                    Regex regex = new Regex(pattern, RegexOptions.ExplicitCapture);
                    MatchCollection matches = regex.Matches(data);
    
                    foreach (Match matche in matches)
                    {
                        Console.WriteLine(matche.Value);
                        Console.WriteLine("Содержание:");
                        Console.WriteLine(matche.Groups["tegData"].Value);
                        Console.WriteLine("---------------------------");
                    } 
                }
                else
                {
                    Console.WriteLine("Ошибка при загрузке со страницы: " + my_url);
                }
            }
    
            private static async Task<string> GetHtmlPageText(string url)
            {  
                await Task.Run(async()=>{
                   
                    // ... используем HttpClient.
                    using (HttpClient client = new HttpClient())
                    using (HttpResponseMessage response = await client.GetAsync(url))
                    using (HttpContent content = response.Content)
                    {
                        // ... записать ответ
                        string result = await content.ReadAsStringAsync();
                        if (html != null)
                        {
                            html = result;
                        }
                    } 
                });
                return html;
            }
        }
    }


    результат на примере yandex.:
    <a href="http://mail.yandex.ru"onclick="c(this,17,1080)">Войти&nbsp;в&nbsp;почту</a>
    Содержание:
    Войти&nbsp;в&nbsp;почту


    Regex работает быстрее чем остальные парсеры
    Ответ написан
  • Зависимость размера шрифтов от разрешения экрана?

    tomnolane
    @tomnolane
    профессиональный разработчик
    Через binding: тык
    (п.с. только вместо ползунка - размер экрана)
    System.Windows.SystemParameters.PrimaryScreenWidth;
    System.Windows.SystemParameters.PrimaryScreenHeight;

    п.с.с. доп.
    Ответ написан