MewUIC#으로 만드는 데스크톱 앱, 작은 네이티브 파일 하나로.

코드로 UI를 만드는 크로스 플랫폼 .NET GUI 프레임워크입니다. 앱은 몇 MB짜리 네이티브 실행 파일 하나로 나오고, .NET 런타임 없이 실행됩니다. XAML 없이 C#만으로 작성하며, 디자이너 도구도 필요 없습니다.

브라우저에서 바로 실행해 보기GitHub664NuGet13.5K

MIT 라이선스. .NET 8.0 / 10.0. 최신 릴리스 0.21.1.

라이트 테마로 실행한 MewUI Gallery 샘플같은 샘플의 다크 테마LightDark
마우스를 좌우로 움직이면 테마가 바뀌고, 클릭하면 더 크게 볼 수 있습니다. 실행 중에 테마 객체 하나만 바꾼 결과입니다.
라이트 테마로 실행한 MewUI Gallery 샘플같은 샘플의 다크 테마LightDark

시작하기

브라우저에서 바로 열어보거나, 명령 한 줄로 실행하거나, 프로젝트에 패키지를 넣습니다. 준비물이 적은 순서입니다.

  1. 1

    브라우저에서

    아무것도 설치하지 않아도 됩니다. Gallery 샘플을 WebAssembly로 컴파일해 브라우저에서 그대로 실행합니다.

  2. 2

    명령 한 줄

    .NET 10 SDK만 있으면 됩니다. 저장소를 클론하거나 프로젝트를 만들 필요 없이, GitHub에서 소스 파일 하나를 받아 바로 실행합니다.

    curl -sL https://raw.githubusercontent.com/aprillz/MewUI/refs/heads/main/samples/FBASample/fba_gallery.cs -o - | dotnet run -
  3. 3

    내 프로젝트에

    메타패키지 하나로 코어와 플랫폼 호스트, 렌더링 백엔드가 모두 들어옵니다.

    dotnet add package Aprillz.MewUI

MewUI의 특징

목표는 하나입니다. 작고, 런타임 설치 없이 실행되며, 빠르게 뜨는 데스크톱 앱입니다.

NativeAOT와 트리밍 우선

리플렉션 없는 명시적인 코드라 NativeAOT로 빌드해 .NET 런타임 없이 실행되는 실행 파일 하나로 배포합니다.

설계부터 작게

AOT 빌드의 결과물은 Hello World 창 3.17 MB, 전체 컨트롤 갤러리 7.84 MB입니다.

XAML 없는 C# 마크업

C#의 Fluent API만으로 UI 트리를 구성합니다. 코드 작성 편의를 위한 분석기와 포매터가 제공되고, 창 프리뷰는 주요 IDE에서 동작합니다.

코드 하나로 네 곳에서

Windows, Linux(X11), macOS 데스크톱에 더해, 같은 UI를 WebAssembly로 빌드해 브라우저에서도 실행합니다.

배포 크기

NativeAOT로 퍼블리시한 주 실행 파일의 크기입니다. 아래 두 수치는 Windows x64 / GDI 기준입니다.

3.17 MB

Hello World

7.84 MB

Gallery (전체 컨트롤 쇼케이스)

플랫폼 / 백엔드Hello WorldGallery
Windows x64 / GDI3.17 MB7.84 MB
Windows x64 / Direct2D3.33 MB7.99 MB
Windows x64 / MewVG3.57 MB8.24 MB
macOS arm64 / MewVG3.17 MB7.35 MB
Linux x64 / X11 + MewVG4.52 MB9.24 MB

앱 전체가 C#입니다

컨트롤을 Fluent API로 이어 붙입니다. 창 뒤에 숨은 마크업 파일이나 생성된 partial 클래스가 없어서, 보이는 코드가 실행되는 코드 전부입니다.

var window = new Window()
    .Title("Hello MewUI")
    .Resizable(520, 360)
    .Padding(12)
    .Content(
        new StackPanel()
            .Spacing(8)
            .Children(
                new Label()
                    .Text("Hello, Aprillz.MewUI")
                    .FontSize(18)
                    .Bold(),
                new Button()
                    .Content("Exit")
                    .OnClick(Application.Shutdown)));

Application.Run(window);

리플렉션 없는 바인딩

바인딩 소스로 Observable 값, INotifyPropertyChanged 뷰 모델, 다른 요소의 속성을 쓸 수 있고, 중첩 경로도 지원합니다. 경로는 컴파일 시점에 해석되므로 트리밍과 AOT에서도 그대로 동작합니다.

var percent = new ObservableValue<double>(
    initialValue: 0.25,
    coerce: value => Math.Clamp(value, 0, 1));

var slider = new Slider()
    .BindValue(percent);

var label = new Label()
    .BindText(percent, value => $"Percent ({value:P0})");

// Nested path. Rewired when Customer is replaced.
var city = new TextBlock()
    .Bind(TextBlock.TextProperty, order, x => x.Customer.City);

개발 도구

코드로 만든다고 화면을 못 보는 것은 아닙니다. 에디터 안에서 창을 미리 보고, 실행 중인 앱에 수정이 바로 반영됩니다.

에디터 프리뷰

앱을 띄우지 않고 Window나 UserControl을 에디터 패널에 렌더링합니다. Visual Studio, VS Code, Rider를 지원하며, 처음 한 번만 빌드하고 이후에는 저장할 때마다 다시 그립니다.

핫 리로드

dotnet watch로 실행하면 수정한 내용이 실행 중인 앱에 반영됩니다. 빌드 코드가 실제로 바뀐 노드만 다시 만들고, 따로 설정할 것은 없습니다.

DevTools

실행 중인 앱의 비주얼 트리와 요소 속성을 창에서 그대로 들여다봅니다. 프레임 통계 오버레이와 프로파일러 타임라인도 함께 제공합니다.

분석기

Fluent 마크업용 Roslyn 분석기와 리팩터링입니다. 객체 초기화자를 체인으로 바꾸거나, 체인을 펼치고 접거나, 여러 문장을 체인 하나로 합칩니다.

코딩 에이전트와 함께

Claude Code, Codex, GitHub Copilot용 에이전트 스킬을 제공합니다. 에이전트가 추측으로 채우던 부분을 미리 알려주어, 생성된 코드가 실제로 컴파일되게 합니다.

기본 제공 컨트롤

버튼, 텍스트 입력, 리스트, 트리, 그리드, 탭, 메뉴, 툴바, 피커, 내비게이션, 그리고 이들을 배치하는 패널까지 갖추고 있습니다. Gallery 샘플에서 전부 볼 수 있고, 설치 없이 브라우저에서 실행됩니다.

버튼ButtonToggleButtonRepeatButtonSplitButtonDropDownButton
텍스트LabelTextBlockTextBoxMultiLineTextBoxPasswordBoxSyntaxViewer
선택CheckBoxRadioButtonToggleSwitchComboBoxListBox
데이터TreeViewGridView
SliderProgressBarProgressRingNumericUpDownColorPickerDatePickerCalendar
컨테이너TabControlGroupBoxExpanderBorderScrollViewerNavigationView
메뉴와 바MenuBarContextMenuToolTipToolBar
미디어Image
WindowDispatcherTimer
패널GridStackPanelDockPanelUniformGridWrapPanelCanvasSplitPanel
Gallery 열기샘플 둘러보기

확장 패키지

코어는 가볍게 유지하고, 큰 기능은 필요할 때만 참조하는 별도 패키지로 제공합니다.

MewDock

Visual Studio 스타일 도킹. 문서·도구 탭, 드래그로 재배치, 분할, 자동 숨김, 팝아웃.

SVG

순수 C#으로 구현한 SVG 파싱·렌더링. System.Drawing 없이 동작하며 AOT와 호환됩니다.

Skia

SkiaSharp으로 그리는 SkiaCanvasView. 렌더링 백엔드와 GPU 텍스처를 직접 주고받아 빠르게 동작합니다.

MewCharts

LiveChartsCore 엔진 기반의 직교·파이·폴라 차트. SkiaSharp에 의존하지 않습니다.

WebView2

Win32 WebView2 컨트롤. Microsoft Edge WebView2 런타임이 필요합니다.

플랫폼과 렌더링 백엔드

창 관리는 플랫폼 호스트가, 그리기는 렌더링 백엔드가 맡습니다. 퍼블리시할 때 백엔드 하나만 고르면 나머지는 트리밍됩니다.

플랫폼호스트백엔드
Windows 10+Win32Direct2D, GDI, MewVG
LinuxX11MewVG (OpenGL)
macOS 12+AppKitMewVG (Metal)
BrowserWebAssemblyMewVG (WebGL2)

프로젝트 상태

현재 버전은 0.21.1이고 활발히 개발 중입니다. 공개 API가 아직 안정화 단계라 마이너 릴리스 사이에도 호환이 깨지는 변경이 있을 수 있습니다. 패키지 버전을 고정하고, 업그레이드 전에 릴리스 노트를 확인하세요.

릴리스 노트

문서

영어와 한국어로 제공됩니다.