Ответы пользователя по тегу .NET
  • Кто-нибудь знает/использовал компонент WinForms .Net: график + инструменты маркировки?

    @Sterk
    Программист
    Первый постарше, второй поновей:
    OxyPlot
    LiveCharts
    Ответ написан
    Комментировать
  • Инсталлятор для своего приложения со встроенным дистрибутивом .NET?

    @Sterk
    Программист
    Inno Setup. Пример скрипта:
    ; Script generated by the Inno Script Studio Wizard.
    ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
    
    #define MyAppName "Моя программа"
    #define MyAppVersion "1.6.2.0"
    #define MyAppPublisher "ООО Бирюльки"
    #define MyAppURL "http://www.example.com/"
    #define MyAppExeName "NameOfMainExeFile.exe"
    #define SetupName "setup_my_programm"
    
    [Setup]
    ; NOTE: The value of AppId uniquely identifies this application.
    ; Do not use the same AppId value in installers for other applications.
    ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
    AppId={{390B67EF-46E4-45B6-B6F9-C9C6362FE337}
    AppName={#MyAppName}
    AppVersion={#MyAppVersion}
    ;AppVerName={#MyAppName} {#MyAppVersion}
    AppPublisher={#MyAppPublisher}
    AppPublisherURL={#MyAppURL}
    AppSupportURL={#MyAppURL}
    AppUpdatesURL={#MyAppURL}
    DefaultDirName="{pf}\MyProgramm"
    DefaultGroupName={#MyAppName}
    OutputBaseFilename={#SetupName}{#MyAppVersion}
    Compression=lzma
    SolidCompression=yes
    
    [Languages]
    Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
    
    [Tasks]
    Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
    
    ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
    
    [Files]
    Source: "{#SourcePath}NDP461-KB3102436-x86-x64-AllOS-ENU.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall; Check: not DotNetFrameworkIsInstalled
    Source: "{#SourcePath}DopCalc\bin\Release\MyProgramm.dll"; DestDir: "{app}"; Flags: ignoreversion
    Source: "{#SourcePath}DopCalc\bin\Release\MyProgramm.exe"; DestDir: "{app}"; Flags: ignoreversion
    Source: "{#SourcePath}DopCalc\bin\Release\MyProgramm.exe.config"; DestDir: "{app}"; Flags: ignoreversion
    Source: "{#SourcePath}DopCalc\bin\Release\GalaSoft.MvvmLight.dll"; DestDir: "{app}"; Flags: ignoreversion
    Source: "{#SourcePath}DopCalc\bin\Release\System.Web.Razor.xml"; DestDir: "{app}"; Flags: ignoreversion
    Source: "{#SourcePath}DopCalc\bin\Release\System.Windows.Interactivity.dll"; DestDir: "{app}"; Flags: ignoreversion
    Source: "{#SourcePath}DopCalc\bin\Release\Templates\*"; DestDir: "{app}\Templates"; Flags: ignoreversion createallsubdirs recursesubdirs
    
    [Icons]
    Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
    Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
    
    [Run]
    Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
    Filename: "{tmp}\NDP461-KB3102436-x86-x64-AllOS-ENU.exe"; Parameters: "/passive /showfinalerror /norestart /x86 /x64"; Check: not DotNetFrameworkIsInstalled; StatusMsg: Microsoft Framework 4.6.1 устанавливается. Пожалуйста подождите... 
    
    [Code]
    function DotNetFrameworkIsInstalled(): Boolean;
    var
      bSuccess: Boolean;
      regVersion: Cardinal;
    begin
      Result := False;
      bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Release', regVersion);
      if (True = bSuccess) and (regVersion >= 394254) then begin
        Result := True;
      end;
    end;


    В функции проверки установлен ли .NET нужно будет заменить 394254 на код вашей версии .NET: MSDN
    Ответ написан
    Комментировать
  • Какой выбрать бесплатный компонент для построения графиков в Winforms .NET?

    @Sterk
    Программист
    Без лишних слов: OxyPlot и более молодой проект LiveCharts
    Ответ написан
    Комментировать
  • Какой механизм кэширования выбрать для нескольких NET приложений, работающих с одной БД?

    @Sterk
    Программист
    Вот библиотека CacheManager. Ее можно настроить на работу с тем или иным кеширующим сервисом\сервером.
    Ответ написан
    Комментировать
  • Как устроены события в WPF?

    @Sterk
    Программист
    1 Вариант "Общие сведения о перенаправленных событиях"
    2 Вариант это сделать сервис с нужным вам функционалом, инъектить его в каждое окно и в каждый обработчик добавить вызов какого либо метода
    3 Вариант использовать пост обработку кода: Fody и например MethodDecorator или MrAdvice, посмотрите на странице репозитория Fody, там большой список обработчиков.

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

    @Sterk
    Программист
    Лучший вариант использовать Windows Service. Для .net C# есть замечательная библиотека Topshelf.
    Ответ написан
    Комментировать
  • Какие есть возможности в .Net использовать Web UI(Js фреймворки, asp mvc) для desktop приложений?

    @Sterk
    Программист
    Если весь вопрос в поднятие встроенного сервера то я посоветую вам nancy либо asp.net core. katanaproject это первая попытка уйти от IIS от microsoft. после этого как раз и появился asp.net core.
    По поводу браузеров вам ответил Rou1997.
    Ответ написан
    Комментировать
  • Как обмануть оптимизатор C#?

    @Sterk
    Программист
    Понятно что проблему можно решить по другому, но мне кажется вам стоит посмотреть в сторону CancellationTokenSource.
    Ответ написан
    Комментировать
  • Какие существуют альтернативы .Net технологий?

    @Sterk
    Программист
    Да даже в .net стеке тоже самое можно решить другими методами.
    • WinForms - WPF
    • WinService - self-hosted Web Server или просто Web решение для IIS, не понятно что предполагается под "выполняет различные фоновые операции"
    • WCF - WebApi, NancyFx
    • EF - dapper, NPoco, linq2db, nhibernate
    Ответ написан
    Комментировать
  • Как организовать взаимодействие основной программы и GUI?

    @Sterk
    Программист
    Я бы посоветовал вам узнать про dependency injection. С использованием его все становится гораздо проще.
    Приведу пример организации проекта:
    1 Модуль описание интерфейсов для работы
    interface ICore {...}
    interface IDeviceManager {...}

    у этого модуля не должно быть зависимостей
    я думаю в нем же можно объявить структуры данных, но у них так же не должны быть зависимостей от других модулей программы
    2 Модуль ядро - в нем должна быть реализована вся логика работы с приборами(или еще чем то) как сервис
    class Core : ICore {...}
    class DeviceManager : IDeviceManager{...}

    этот модуль в зависимостях должен иметь только модуль 1
    он должен быть автономным - работать в потоках
    3 Модуль Gui - здесь есть варианты, но объединяет их одно - использование шаблона проектирование "внедрение зависимостей". Вот сравнение контейнеров. Я использую LightInject он быстр и прост.
    Метод запуска окошек с контейнером на примере LightInject.
    допустим у вас есть главное окно и окно с приборами
    public partial class MyMainForm
    {
        private LightInject.IServiceContainer _container;
        public MyMainForm(LightInject.IServiceContainer container)
        {
            _container = container;
        }
        public void ShowDeviceWindow()
        {
             var form = _container.Create<MyDeviceForm>();
             form.Show();
        }
    }
    public partial class MyDeviceForm
    {
        private IDeviceManager _deviceManager;
        public MyDeviceForm(IDeviceManager devicemanager)
        {
            _deviceManager = devicemanager;
        }
        public void ButtonClick()
        {
         // Здесь вы делаете все что хотите и работаете с менеджером
        // Например загружаете список приборов в лист
        foreach(var device in _deviceManager.GetDevices())
            listBox.Add(device.ToString());
        }

    для того что бы не создавать все объекты и зависимости окнам руками используем контейнер
    если вы используете WinForms то скорее всего это надо прописать в programm.cs
    var container = new LightInject.ServiceContainer();
    container.RegisterInstance<IServiceContainer>(container);
    container.Register<ICore, Core>(new PerContainerLifetime());
    container.Register<IDeviceManager, DeviceManager>(new PerContainerLifetime());
    var form = container.Create<MyMainForm>();
    //Не помню как выводятся окна в WinForms
    //Но логика надеюсь понятна
    form.Show();

    Таким образом у нас любое окно может запросить любой нужный ему интерфейс для работы с ядром\логикой.
    Что бы в каждое окно не совать IServiceContainer я бы создал IWindowManager в реализации которой получал бы контейнер и выводил окно что то вроде manager.ShowWindow<MyDeviceForm>(); и всем окнам подсовывал бы его. Так проще контролировать создание окон.
    Для WPF я бы мог посоветовать глянуть различным MVVM фрейворки Calibrun.Micro, Catel и тд.
    Есть даже модульная система выглядящая как IDE gemini
    Не знаю чем обусловлен выбор WinForms, но для него тоже есть фреймворки, но вроде бы в них применяется шаблон MVP.
    Для своих нужд я написал клон gemini со своим видением некоторых моментов. Надеюсь это поможет в разделение логики и окон, несколько лет назад я так же искал информацию как же вообще строить окна, но подсказать было некому.

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

    @Sterk
    Программист
    вот самое простое решение

    var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    PrintList(list);
    bool delete = false;
    while (list.Count > 1)
    {
        for (int i = 0; i < list.Count; i++)
        {
            if (delete) list.RemoveAt(i--);
            delete = !delete;
        }
        PrintList(list);
    }
    Console.Read();

    функция печати
    static void PrintList(IEnumerable<int> list)
    {
        foreach (var item in list)
            Console.Write("{0} ", item);
        Console.WriteLine();
    }
    Ответ написан
    Комментировать