{"id":14963690,"url":"https://github.com/algmironov/winappframeworkscomparison","last_synced_at":"2025-10-25T02:31:01.257Z","repository":{"id":251904869,"uuid":"838724644","full_name":"algmironov/WinAppFrameworksComparison","owner":"algmironov","description":"Проект - сравнение фреймворков для написания оконных приложений на C#","archived":false,"fork":false,"pushed_at":"2024-08-07T10:21:34.000Z","size":1296,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-31T05:03:55.806Z","etag":null,"topics":["avalonia","csharp","desktop-app","maui","uno-platform","winforms","winui3","wpf"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/algmironov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-06T08:09:47.000Z","updated_at":"2024-08-17T10:04:40.000Z","dependencies_parsed_at":"2024-08-06T13:16:47.088Z","dependency_job_id":"12a12b22-800c-49c3-aa3b-b669f62e4200","html_url":"https://github.com/algmironov/WinAppFrameworksComparison","commit_stats":null,"previous_names":["algmironov/winappframeworkscomparison"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algmironov%2FWinAppFrameworksComparison","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algmironov%2FWinAppFrameworksComparison/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algmironov%2FWinAppFrameworksComparison/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algmironov%2FWinAppFrameworksComparison/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/algmironov","download_url":"https://codeload.github.com/algmironov/WinAppFrameworksComparison/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238065141,"owners_count":19410587,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avalonia","csharp","desktop-app","maui","uno-platform","winforms","winui3","wpf"],"created_at":"2024-09-24T13:32:00.382Z","updated_at":"2025-10-25T02:31:00.434Z","avatar_url":"https://github.com/algmironov.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Сравнение технологий для написания оконных приложений.\n\nКак-то раз в одном чате прозвучала идея сравнить разные технологии для написания оконных приложений. В частности, под Windows. Используя средства языка C#. То есть, конечно, можно это сделать и с помощью C++, Python, Rust, JS и других языков, но мы же шарписты, нам интереснее именно то, что мы можем сами использовать, не меняя язык программирования.\nВ итоге, сам предложил, сам и написал ))\nИтак, оконные приложения на C#. Их можно написать, используя:\n-\tWindows Forms\n-\tWPF\n-\tWinUI\n-\t.NET MAUI\n-\tAvalonia\n-\tUno Platform\n\nТакое многообразие фреймворков обусловлено тем, что язык развивался, менялись подходы, совершенствовались технологии. А в какой-то момент к разработке подключились сторонние разработчики и к средствам Microsoft добавились Avalonia и Uno.\n\nТаким образом, для того чтобы начать писать оконные приложения надо решить, используя какую технологию использовать. Но, кроме того, неплохо бы понимать, где будет приложение использоваться – только на Windows или есть необходимость в запуске на MacOS и Linux. F может быть еще и на IOS и Android?\n\nВ общем, в этой статье попробуем разобраться в возможностях этих фреймворков и сравним их. А сравнивать будем по таким критериям:\n-\tПлатформы, в которых можно запустить приложение\n-\tСложность разработки\n-\tОбъем приложения\n\nДля корректности сравнения будем использовать одну логику для всех приложений. Более того, попытаемся сделать их максимально похожими друг на друга. \n\n## Часть 1. Логика\nИтак, чтобы не сравнивать пустые приложения без какой-либо функциональности, реализовал простейшую версию игры Крестики-Нолики. Логика самой игры простая: есть два игрока Х и О. Начинает игрок Х потом ходит О. Кто первым соберет три своих символа в ряд - выигрывает, если после последнего хода победителя нет, то ничья. \nВесь код логики практически один в один переходит из приложения в приложение, за исключением некоторых особенностей в разных фреймворках. Например, в Авалонии нет встроенного механизма отображения всплывающих окон (Message Box) и для того, чтобы он появился надо установить дополнительный пакет. Не сложно, но нюанс. В некоторых фреймворках нельзя напрямую посчитать кнопки из интерфейса и надо придумывать обходные пути.\nВажно так же отметить, что везде, кроме WinForms по-хорошему следует использовать паттерн MVVM, однако для простейшего приложения заморачиваться не стал и работает все напрямую.\n\n## Часть 2. Пользовательский интерфейс\nРазработка UI в приложениях C# отличается не очень сильно друг от друга. Выделяется разве что WinForms, где элементы интерфейса размещаются обычно вручную в графическом редакторе, что в свою очередь весьма дружелюбно по отношению к людям без опыта. Еще можно размещать элементы вручную в WPF, однако рекомендуется все же выстраивать интерфейс вручную задавая параметры в коде страницы. \nОсложняет процесс разработки внешнего вида отсутствие интерактивного отображения получаемого результата в MAUI и WinUI – там посмотреть на результат можно только после сборки и запуска. Да, есть такая функция как Hot Reload, когда изменения будут появляться после горячей перезагрузки без перезапуска всего приложения, но тоже не без нюансов. Во-первых, при горячей перезагрузке теряется состояние приложения (если оно отдельно не сохраняется где-то), например при игре уже есть несколько крестиков и ноликов, то после Hot Reload они «забываются». Во-вторых, бывает, что изменения не отображаются и все равно приходится перезапускать приложение. Не баг, а фича, как говорится.\nВ целом же привыкнуть можно ко всему и даже потом возвращаться к WinForms становится тяжко – хочется все настраивать самому. \n\n### Как приложения выглядят в готовом виде:\n1. Windows Forms: ![Windows Forms](https://github.com/algmironov/WinAppFrameworksComparison/blob/master/Previews/winforms.png)\n2. WPF: ![WPF](https://github.com/algmironov/WinAppFrameworksComparison/blob/master/Previews/wpf.png)\n3. WinUI: ![WinUI](https://github.com/algmironov/WinAppFrameworksComparison/blob/master/Previews/winui.png)\n4. MAUI: ![MAUI](https://github.com/algmironov/WinAppFrameworksComparison/blob/master/Previews/maui.png)\n5. Avalonia: ![Avalonia](https://github.com/algmironov/WinAppFrameworksComparison/blob/master/Previews/avalonia.png)\n6. Uno Platform: ![Uno Platform](https://github.com/algmironov/WinAppFrameworksComparison/blob/master/Previews/uno.png)\n\nЯ не сильно старался сделать их идентичными, потому что и задачи такой не было, да и необходимости такой нет. Более того, можно обратить внимание, что некоторые между собой похожи. Это результат применения в них компонентов WinUI. В MAUI дополнительно используются фирменные шрифты и MaterialDesign – поэтому кнопки со скругленными углами. А еще WinUI подтягивает основную тему из системы и поэтому все, кроме WinForms и WPF темные. Соответственно в первых двух нужно отдельно добавлять обработку светлой/темной темы. \n\n## Часть 3. Платформы\nТут мы подходим к глобальным возможностям всех фреймворков. Итак, таблица ниже показывает, под какие платформы может быть собрано приложение.\n\n\n|                     |     Windows    |     MacOS    |     Linux    |     Android    |     iOS    |\n|---------------------|----------------|--------------|--------------|----------------|------------|\n|     WinForms        |     +          |              |              |                |            |\n|     WPF             |     +          |              |              |                |            |\n|     WinUI           |     +          |              |              |                |            |\n|     .NET MAUI       |     +          |     +        |              |     +          |     +      |\n|     Avalonia        |     +          |     +        |     +        |     +          |     +      |\n|     Uno Platform    |     +          |     +        |     +        |     +          |     +      |\n\nКак видим, что вполне логично, все шесть фреймворков позволяют писать оконные приложения для Windows. Но есть и различия. Они кроются как в кроссплатформенности MAUI, Avalonia и Uno, так и в компонентах, которые используются для отрисовки графического интерфейса. Углубляться сильно не будем в дебри, но стоит знать, что MAUI Авалония используют компоненты WinUI, Uno в cвою очередь может реализовывать оконное приложение как в WPF варианте, так и WinUI. Это может быть полезно в отдельных случаях. Кроме того, нативные фреймворки WinForms, WPF и WinUI отличаются технически:\n- Windows Forms использует GDI+ для отрисовки интерфейса\n- WPF использует DirectX для рендеринга\n- WinUI использует для рендеринга DirectX/DirectComposition\n\nКроме того, есть различие в используемых компонентах, библиотеках и подходах. Иными словами, все технологии, представленные в статье, имеют множество различий при схожей функциональности даже в рамках одной целевой платформы.\n\n## Часть 4. Память\nСейчас мы подошли к той части «исследования», когда в дело вступают цифры. В данной части посмотрим на то, сколько приложения занимают места в оперативной памяти. Сравнивать будем в двух режимах: в Visual Studio в режиме Debug и в диспетчере задач запущенное опубликованное приложение.\n\n\n|                     | WinForms   | WPF         | WinUI       | .NET MAUI   | Avalonia    | Uno Platform |\n|---------------------|------------|-------------|-------------|-------------|-------------|--------------|\n|     Debug (Mb)      |     15     |     80      |     80      |     132     |     82      |     62       |\n|     Release (Mb)    |     6,1    |     19,6    |     26,2    |     54,4    |     32,6    |     13,6     |\n \nРезультаты интересные. Закономерно, что WinForms приложение самое легкое – задействует меньше всего ресурсов, как при отладке, так и при работе собранного приложения. А вот с остальными интереснее. Самое «тяжелое» приложение получилось на MAUI. Возможно, это результат кроссплатформенности – слишком много всего «внутри». Зато удивил Uno Platform – готовое приложение занимает меньше всех места, после WinForms и это отличный результат. \n\nОтдельно хотел замерить скорость запуска приложений, но в итоге делать этого не стал. Скажу только, что MAUI и тут проигрывает, явно уступая в скорости запуска всем остальным приложениям.\n\n\n## Часть 5. Сборка и развертывание\nОтдельно пару слов про то, насколько сложно подготовить проект к публикации и использовать его потом. При публикации приложений почти у всех можно получить файлы библиотек и запускающий файл, однако без установки запускаются только WinForms и WPF приложения, а так же, внезапно, Avalonia. Впрочем, это не такая уж проблема.. Была бы, если не одно Но: для того, чтобы поделиться приложением или его где-то разместить нужен сертификат. Тестовый вы можете создать на своем компьютере, а вот заверенный, чтобы Windows не ругалась и не считала приложение подозрительным, просто так не получить. То есть он стоит денег, а в текущих условиях еще и надо найти, где его приобрести. И да, он ограничен по времени. \nКонечно, что все нюансы и наверно есть каки-то пути решения вопроса, да и вопрос сам не первоочередной важности. Но знать о таких нюансах стоит.\n\n## Часть 6. Итог\nЧто ж, стоит подвести итоги нашего небольшого исследования-сравнения. Для кого вообще оно делалось? Для тех, кто не занимался разработкой оконных приложений, но хотел бы понять, какие есть актуальные технологии. И вот эти технологии мы рассмотрели. Весьма поверхностно, конечно, но и задачи писать энциклопедию о том, как написать оконное приложение со всеми тонкостями, не стояло. А вот сделать вывод о том, с чего начать вкатываться в мир разработки приложений под Windows, а потом и других платформ, вполне можно. Мое видение, основанное на имевшемся ранее и полученном сейчас такое:\n- Начинать стоит все-таки с базы – с Windows Forms. Да, технология не нова, даже можно ее считать устаревшей. Но она живая и функциональная. Многие приемы на ней можно отработать, да и собрать действительно сложно приложение с графическим интерфейсом вполне реально. Да чего там – так делали, делали много и долго.\n- Вторым шагом стоит изучить WPF. Эта технология позволит развить понимание паттерна MVVM, проектирование интерфейса в XAML и откроет путь к более современным стекам. \n- Дальше путь открыт ко всему. Я был приятно удивлен возможностям Uno Platform, не ожидал. Кроме того, что можно написать приложение под любую актуальную ОС, в том числе и мобильную, так еще и весьма щадяще эта технология относится, как оказалось, к ресурсам. Не то, чтобы это сильно критично, но, когда проект большой и нужно бороться за производительность, приложение, потребляющее меньше ресурсов будет выглядеть предпочтительнее на мой взгляд. Еще из важного – возможность собрать дизайн приложения Uno в Figma и импортировать код интерфейса прямо в проект в виде XAML-кода! Такого нет ни у кого из других рассмотренных фреймворков.\n\nИ, напоследок, пару слов о размере приложения на диске.\n![Место на диске](https://github.com/algmironov/WinAppFrameworksComparison/blob/master/Previews/Место.png)\n\nЗдесь в папках располагаются те файлы, которые либо нужны для установки, как в случае с WinUI, MAUI и Uno, так и файлы проекта для запуска WinForms, WPF и Avalonia. \nИ да, максимально удивил Uno, который и тут занимает места чуть больше WinForms и почти в 70 (!) раз меньше Avalonia. \n\nНа этом все. Делайте свои выводы, пробуйте разрабатывать оконные приложения и успехов!\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falgmironov%2Fwinappframeworkscomparison","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falgmironov%2Fwinappframeworkscomparison","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falgmironov%2Fwinappframeworkscomparison/lists"}