Ответы пользователя по тегу C#
  • Как выбрать версию .NET Framework?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Правильно ли я понял, что для разработки интерфейса используем WPF? Насколько он мне даст потом возможности к кастомизации и добавлению свистилок/перделок?

    Только WPF дает максимальную свободу в плане кастомизации интерфейса, тоже самое на winforms будет сделать порой крайне сложно.
    Касаемо выбора .NET Framework, первый вопрос, минимальная версия windows.
    Скажем, вы ориентированы на Windows 7 и выше, то ваш выбор это 4.7 (последняя версия). Дальше от вас требуется проверять совместимость при переходе на новую версию framework-а с тем списком ОС, который вы поддерживаете.

    А если вдруг вам потребуется поддержка других ОС, то советую посмотреть в сторону кроссплатформенных UI библиотек сразу.
    Ответ написан
    1 комментарий
  • На каких GUI можно писать программы для Windows Mac Linux на C#?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Можно посмотреть https://github.com/AvaloniaUI/Avalonia , кроссплатформенный UI фреймворк, который берет свое вдохновление из WPF, если так можно выразиться.

    Потом, можно посмотреть на https://github.com/picoe/Eto , достаточно зрелый фреймворк для разработки кроссплатформенных приложений.
    Ответ написан
    Комментировать
  • Как добавить дополнительную обработку при подписывании делегата на событие?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Допустим, у вас есть класс API.
    В нем, у вас есть вот такой event:
    public event TokenRecivedEventHandler OnTokenRecived;

    и метод:
    public async Task GetTokenEvtAsync(Models.LoginViewModel loginModel)
    {
        var response = await GetToken(loginModel);
        OnTokenRecived?.Invoke(this, new TokenRecivedEventArgs(response));
    }


    В другом месте(классе, форме и т.п) вы делаете:
    var api = new API();
    api.OnTokenRecived += Api_OnTokenRecived;
    api.OnTokenRecived += Api_OnTokenRecived2;
    
    await api.GetTokenEvtAsync(loginModel: viewModel);
    
    api.OnTokenRecived -= Api_OnTokenRecived;
    api.OnTokenRecived -= Api_OnTokenRecived2;


    И два обработчика:

    private void Api_OnTokenRecived(object sender, TokenRecivedEventArgs args)
    {
        TokenDecoder.Decode(args.Token, tokenResult);
    }
    
    private void Api_OnTokenRecived2(object sender, TokenRecivedEventArgs args)
    {
        buttonLogin.Enabled = false;
        buttonLogout.Enabled = !buttonLogin.Enabled;
        buttonApiGetUser.Enabled = !buttonLogin.Enabled;
        buttonApiGetUserFields.Enabled = !buttonLogin.Enabled;
    }


    И все. Примеры взяты из рабочего кода и адаптированы под условие вопроса. Все работает. Вы просто вешаете два обработчика на свое событие.

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

    P.S. Если вам не два обработчика нужно, а именно какое-то дополнительное действие, то тут немного по-другому.

    private EventHandler _eventHandler;
    
    public event EventHandler OnCustomEvent
    {
        add 
        { 
            _eventHandler += value; 
            Log("Обработчик добавлен");
        }
        remove 
        { 
            _eventHandler -= value; 
            Log("Обработчик удален");
        }
    }
    Ответ написан
    Комментировать
  • Как реализовать чтение и выполнение запросов из DBContext в портативной библиотеке?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    В целом, можно.
    Можно сделать сервис-локатор уровня приложения, посредством которого все модули могут получать те или иные сервисы.

    А дальше, просто: Регистрируете сервис, который отдает нужную логику или просто Unit Of Work по верх DbContext-а и используете из плагина.
    ApplicationBoostrap:
    private void ConfigureContainerBuilder(ContainerBuilder builder)
            {
                builder.Register(c => EngineConfigurationHandler.Current)
                    .As<IConfiguration>().SingleInstance();
    
                //Зарегистрируем сервисы 
                builder.RegisterAssemblyModules(typeof(RegisterDomainIocModule).Assembly);
                builder.RegisterAssemblyModules(typeof(BaseService<>).Assembly);
                builder.RegisterAssemblyModules(typeof(Bootstrapper).Assembly);
            }


    И, где-то в недрах:

    using(var uov = ApplicationContext.Resolve<IUnitOfWork>())
    {
        var data = uov.Query<SomeDomainModel>().Where(...);
    
        uow.Save(new SomeDomainModel{  Name = "Name" });
        uow.Commit();
    }


    Почему я сказал про Unit Of Work,а не конкретный DbContext - потому что DbContext вы не контролируете, в отличии от вашего же Unit Of Work. И, соответственно, поддержку будет сделать куда проще. Опять же, в Unit Of Work вы можете напихать дополнительную логику пост- и пре-обработки (фильтрация по флагу IsDeleted), автоматическое присвоение ModifyDate при сохранение и т.п.

    P.S. и да, я надеюсь, вы не имели ввиду Portable Library, вот тогда вам точно не обойтись от своих абстракций, определенных именно в Portable Library и повсеместно эксплуатируемых.
    Ответ написан
    Комментировать
  • C#, как производить вычисления на видеокарте?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    CUDA можно использовать из C#:
    kunzmi.github.io/managedCuda
    Общая информация:
    https://stackoverflow.com/questions/6475490/coding...
    P.S. Есть еще вот это - https://github.com/kaby76/campynet
    Ответ написан
  • Как построить связь NET Compact Framework и PostgeSQL 9.4?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Если вам нужно из устройства попасть во внешнюю БД то напрямую "не пройти". В вашем случае нужно сделать SOAP или REST веб-сервисы (я делал SOAP), и посредством их получить нужные данные.
    Ответ написан
    Комментировать
  • Передача исключения в родительскую форму. Как сделать без костылей?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Вообще, можно оставить так, как у вас. Просто ловить только исключения логики ВАШЕЙ программы.

    Остальные можно отдать на откуп глобальным обработчикам:
    https://msdn.microsoft.com/en-us/library/system.ap...
    https://stackoverflow.com/a/406473

    Лично мне предложенный мной вариант не нравится, т.к. обобщенный перехватчик сообщений - это последнее, к чему нужно идти, последняя инстанция.

    На мой взгляд, лучше проработать логику. дабы уменьшить вероятность возникновения исключений, перейти на события - т.е. внутри у вашего класса-обработчика есть try..catch, который делает вызов события при ошибке.
    Ответ написан
  • C#-SQLite Error: Database is locked, почему?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Вообще, проблема могла быть в том, что база была открыта ее владельцем. Т.к. SQLite однопоточная, то при открытии ее процесс лочит файл базы, чтобы не повредить данные.
    Ответ написан
    1 комментарий
  • Linq, связь многие ко многим в EF?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Вообще, тут несколько вариантов. Мы можете руками добавить нужную связывающую таблицу в контекст.

    Или же сделать примерно так:

    var data = db.Products.Include("Repositories");
    var values = new List<ProductWithRepoDTO>();
    
    foreach(var record in data)
    {
        var reposArray = record.Repositories.Select(x=>x.Name).ToArray();
        var reposString = string.Join(",", reposArray);
        
        values.Add(new ProductWithRepoDTO
        {
            Id = record.Id,
            Name = record.Name,
            Cound = record.Count,
            Price = record.Price,
            Repository = reposString 
        });        
    }
    //дальше работать с values


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

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Вообще, я бы сделал бы модель данных, привязал бы ее к контролам через DataBindings и сохранял/загружал бы уже именно ее.

    Пример с формой входа (на форме два текстовых поля, txtUserName и txtPassword, и две кнопки, buttonSave и buttonLoad):
    Форма
    public partial class Form1 : Form
    {
        private readonly LoginViewModel viewModel;
    
        public Form1()
        {
            InitializeComponent();
    
            viewModel = new LoginViewModel();
    
            txtUserName.DataBindings.Add(new Binding("Text", viewModel, "UserName", false, DataSourceUpdateMode.OnPropertyChanged));
            txtPassword.DataBindings.Add(new Binding("Text", viewModel, "Password", false, DataSourceUpdateMode.OnPropertyChanged));
    
        }
    
        private void buttonSave_Click(object sender, EventArgs e)
        {
            var file = GetFilePath();
    
            using (var buffer = File.OpenWrite(file))
            {
                var formatter = new BinaryFormatter();
    
                formatter.Serialize(buffer, viewModel);
            }
        }
    
        private void buttonLoad_Click(object sender, EventArgs e)
        {
            var model = LoadContent() as LoginViewModel;
    
            if (model != null)
            {
                viewModel.Password = model.Password;
                viewModel.UserName = model.UserName;
            }
        }
    
        private static object LoadContent()
        {
            var file = GetFilePath();
    
            if (!File.Exists(file))
                return null;
    
            using (var buffer = File.OpenRead(file))
            {
                var formatter = new BinaryFormatter();
    
                try
                {
                    return formatter.Deserialize(buffer);
                }
                catch
                {
                    //TODO Add error handling
                    return null;
                }
            }
        }
    
        private static string GetFilePath()
        {
            var directory = Path.GetDirectoryName(typeof(Form1).Assembly.Location);
            return Path.Combine(directory, "store.txt");
        }
    }


    Модель:
    [Serializable]
    public class LoginViewModel : INotifyPropertyChanged
    {
        private string _userName;
        private string _password;
    
        public string UserName
        {
            get { return _userName; }
            set
            {
                _userName = value;
                NotifyPropertyChanged(nameof(UserName));
            }
        }
    
        public string Password
        {
            get { return _password; }
            set
            {
                _password = value;
                NotifyPropertyChanged(nameof(Password));
            }
        }
    
        private void NotifyPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    
        [field: NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged;
    }


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

    Один из вариантов обхода, это именно DataBindings, как я показал на примере.
    Ответ написан
    Комментировать
  • Можно-ли при узнать координаты устройства и вывести их в приложении на C#?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Для начала, вам нужно установить на машину GPS-устройство, которое будет слать данные на вашу службу (какая-то абстрактная служба в вакууме). Есть ряд таких устройств, можно нагуглить.
    Затем вам нужна подложка для карты, к примеру тот же OSM.
    Ну и наконец, само приложение, которое дергает с вашей службы данные, к примеру каждые 5 секунд (ну или через SignalR в режиме реального времени). Вы получаете координаты и рисуете их на контроле карты. Самый тупой и простой способ - использовать контрол веб-браузера и вызывать оттуда javascript-функцию, которая отрисует ваши координаты.
    Ответ написан
    2 комментария
  • Как создать форму, чтобы при следующем открытии значения сохранялись?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Можно поступать еще проще - вы не закрываете форму, а скрываете. У формы есть метод Hide.
    Опять же, все зависит от контекста задачи, но скрывать - самое простое, что можно предложить.
    Ответ написан
    Комментировать
  • Как вызвать форму из DLL?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Ну вообще-то точно так же.
    Форма просто будет в библиотеке. Добавляете ее в ссылки проекта и все. Класс должен быть публичным (public).
    Ответ написан
    4 комментария
  • Как извлечь данные из Excel (.xslx) файла в двухмерный массив (по столбцам)?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Если единоразовая операция, сохраняете файл в формат Таблица XML 2003 и спокойно работаете с ним как с XML. Там вообще все элементарно, через XPathNavigator можно спокойно размотать документ как угодно.

    Еще вариант - использовать провайдер Microsoft.ACE.OLEDB.12.0.
    Там такая строка подключения:
    Provider=Microsoft.ACE.OLEDB.12.0; Data Source=NameOfFile.xlsx;Extended Properties="Excel 12.0;HDR=No;IMEX=1"

    Вот тут пишут:
    stackoverflow.com/questions/6649363/microsoft-ace-...

    Оба варианта использовал - первый на PHP, второй на .NET - работают прекрасно.
    Ответ написан
    Комментировать
  • Как работает метод GetData?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    В данный метод пихается коллбэк, метод, который вернет данные.
    Далее, GetData вызывает данный коллбэк, и передает в него данные в виде коллекции _books, которая сформирована где-то в недрах BookService.

    Сам коллбэк представлен анонимной функцией, которая выполняет только то, что присваивает свойству Books класса ShellViewModel значение items, а по сути, все те же _books из BookService.
    Ответ написан
    1 комментарий
  • Не добавляется MySQL Connector в проект?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Попробуйте добавить его через Nuget, что-то у вас там странное в ошибках.
    Я не помню, чтобы с ним были какие-то проблемы - но я его использовал года 2 назад, в связке с EF.
    Ответ написан
    Комментировать
  • Как ускорить выполнение операций?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Я бы вам посоветовал посмотреть на Dapper.
    Ну или не заполнять таблицу в Get а возвращать IDbReader и его разматывать в цикле, заполняя структуру данными.
    Простой маппер на коленке можно написать за пару минут, там нет ничего сложного. Таким образом, вы уберете достаточно дорогую операцию преобразования данных в таблицу, обеспечите минимум операций посредников между Get и return li.
    Ответ написан
    Комментировать
  • Почему не работают виртуальные поля у моделей?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Вы где-то IQueryable разматываете и и внутри этого процесса вы еще раз идете в DbContext за чем-то.
    Сложно точнее сказать.
    Посмотрите, где с IQueryable коллекциями работаете.
    Ответ написан
    Комментировать
  • Какая бд лучше подойдёт для реализации очереди?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Мы в своем решение, написанном на .NET, в момент, когда потребовалось внедрить очередь, просто поставили Microsoft Message Queue. Сейчас, если бы у меня был выбор и подобная задача, я бы остановился скорее на RabbitMQ, а может и нет. Все зависит от задач.

    Отвечая на вопрос, используйте ZeroMQ/RabbitMQ/MSMQ и не изобретайте колесо. Для них не нужно БД, да и реализовывать это куда проще чем городить взаимодействие с БД.

    А еще, можно попробовать к примеру, Hangfire, но это не совсем очередь а больше планировщик задач.
    Ответ написан
  • Как правильно перенести проект ASP.Net MVC на другой сервер? Ошибка 0x80070021 HTTP Error 500.19?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Либы все на месте? Ничего не забыли доставить?
    Версия .net framework для пула и вообще .net framework на машине соответствует требуемой?

    Еще момент, пул из под кого запущен? У этого пользователя есть права на работу с папкой, где развернут сайт?
    Ответ написан
    Комментировать