Skip to content

Проект демонстрация, как запустить WPF-приложение, собранное под .NET Framework с использованием Wine.

Notifications You must be signed in to change notification settings

Merrcurys/WPF-Docker-Example

Repository files navigation

Запуск WPF-приложения в Docker с помощью Wine

Этот проект демонстрирует экспериментальный способ запуска WPF-приложений (.NET Framework или .NET Core) внутри Docker-контейнера с использованием Wine — совместимого слоя Windows API для Unix-систем.

⚠️ Важно: WPF — это технология, которая офицально не поддерживается на Linux. Однако с помощью Wine можно попытаться запустить такие приложения в изолированной среде. Данное решение предназначено в первую очередь для тестирования, образовательных целей или специфических сценариев. Простые приложения могут запуститься, но сложный UI скорее всего нет, либо придется как-то докачивать зависимости.

🤨 Предыстория

Зачем вам это, когда уже есть Avalonia я не знаю. Но мне дали такое задание как дополнительное в моем техникуме по Docker'у. Многие пишут: «You cannot run a WPF application in docker.». Я проверил: возможно, но больно.

Я изрядно помучался, поднял 1000 и 1 контейнер, прочитал тонну статей на StackOverflow и других сайтах, где явно писали 'это невозможно'. Смотрел YouTube. Пытался гуглить на английском, хинди и китайском безрезультатно.

Была идея использовать dockur/windows, но мне не подходила необходимость в KVM и огромный размер образа. В итоге, благодаря Scotty Hardy и его образу docker-wine, я смог запустить WPF в Docker, сначала на .NET Framework, потом через Alpine, и наконец — на .NET Core." Чтобы больше никто не мучался был и создан этот репозиторий.

📦 Требования

  • Docker Desktop - демон docker'а.
  • Xming - для отображения GUI. Можно взять любой другой X-сервер.
  • NET Framework - я не знаю возможно ли запустить на NET Core, но лично я пробовал на NF 4.7.2 и NF 4.8.
  • Скомпилированное WPF-приложение с .exe (например, WpfApp.exe)
  • dotnet - установленный dotnet на хост машине нужной версии (той же что и ваше приложение). Этот пункт только если вы запускаете .NET Core.

🛠️ Подготовка

  1. Убедитесь, что ваше WPF-приложение скомпилировано и содержит исполняемый .exe файл (например, WpfApp.exe).
  2. Можете удалите мои тестовые WPF приложения.
  3. Добавьте в корень проекта ваше приложение, где также будет .exe.
  4. Запустите Docker Desktop и Xming если еще это не сделали.

🐳 Сборка образа

Выполните в корне проекта:

.NET Framework

# Вариант 1: На основе образа scottyhardy/docker-wine
docker build -f Dockerfile.docker-wine -t wpf-app .

# Вариант 2: На основе Alpine (меньше размер)
docker build -f Dockerfile.alpine -t wpf-app .

.NET Core

docker build -f Dockerfile.alpine-core -t core-alpine .

🖥️ Запуск контейнера

.NET Framework

docker run --rm wpf-app

.NET Core

docker run -it --rm --name core-alpine-container core-alpine /bin/sh
# В запущенном контейнере в sh введем winecfg, который создаст диск C:\
winecfg
# В отедльном терминале cкопируем наш dotnet с хост машины в контейнер диска C. 
docker cp "C:\Program Files\dotnet" core-alpine-container:"/root/.wine/drive_c/Program Files/dotnet"
# После чего снова в контейнере через sh запускаем приложение через wine, которое подтянет NET Core, который мы переместили в Program Files
wine /app/WPFCore.exe

⚙️ Особенности работы

  • Графический интерфейс может отображаться некорректно или медленно.
  • Мышь и клавиатура могут работать нестабильно — используйте клавиши Tab и Enter для навигации по элементам. Или поищите зависимости, которые нужно установить, чтобы исправить это.
  • Wine не поддерживает все функции WPF. Приложения с тяжёлой графикой, анимациями или сторонними библиотеками могут не запуститься.

🔧 Советы по отладке

  • Для более сложных сценариев может потребоваться установка дополнительных компонентов через winetricks.

Альтернатива: Если вы разрабатываете новое приложение, рассмотрите переход на .NET 6/8 с Avalonia UI или MAUI, которые поддерживают кроссплатформенную разработку с нативным UI.

About

Проект демонстрация, как запустить WPF-приложение, собранное под .NET Framework с использованием Wine.

Topics

Resources

Stars

Watchers

Forks

Languages