- Linux контейнер для .NET Framework приложения (когда сложно уйти на .Net Core)
- Завязка и предпосылки
- Один из вариантов исполнения и его особенности
- Первые сложности и условности
- Компромисс и развязка
- Итоги, выводы, размышления
- 7.3 Работа с Wine
- Установка Wine
- Установка программ на Wine
- Запуск программы
- Префиксы Wine
- Удаление программ в Wine
- Работа с реестром
- Установка Winetricks
- Установка пакета Dotnet
- Работа с Mono
- Установка Gecko
- Винные Трюки или установка компонентов Windows в Wine
- Установка.
Linux контейнер для .NET Framework приложения (когда сложно уйти на .Net Core)
Хочу поделиться с миром достаточно нетипичной, по крайней мере для меня, задачкой и её решением, которое мне кажется вполне приемлемым. Описанное ниже, возможно, не является идеальным выходом из ситуации, но это работает, и работает так, как задумывалось.
Завязка и предпосылки
Появилась по работе задача: нужно на сайт вынести 3D-превьюшки BIM-моделей разного оборудования, материалов, объектов. Нужно что-то легковесное, несложное.
На сайте модели этих объектов хранятся и доступны для скачивания в проприетарных форматах различных САПР и в виде открытых форматов 3D-моделей. Среди них есть и формат IFC. Его-то я и буду использовать, как исходник для решения этого задания.
Один из вариантов исполнения и его особенности
Формально можно было бы ограничиться написанием какого-нибудь конвертера *.ifc во что-то для отображения на web-странице. С этого я и начал.
Для подобного преобразования был избран замечательный тулкит — xBIM Toolkit.
В примерах использования этого инструмента просто и доходчиво описано, как работать с IFC и специализированным для web-форматом *.wexBIM.
Далее полученный файл используется в «плеере» xBIM WeXplorer.
Что ж, поехали. Беру nuget’ы от xBIM. Пишу консольное приложение, которое на вход принимает пачку путей к *.ifc-файлам, рядом с ними складывает пачку *.wexBIM-файлов. Всё, можно выкладывать на сайт.
Но как-то это простенько… Хочется, чтобы эта программа стала неким сервисом, который по событию загрузки *.ifc на портал, сразу создаёт необходимый *.wexBIM, и он сразу отображается в подготовленном контейнере.
Ок, формирую новые требования:
- пусть задания на конвертацию приходят от нашего RabbitMQ;
- сами задания хочу видеть в виде бинарного сообщения, которое на самом деле будет готовым для десериализации классом, описанным в protobuf-файле;
- задание будет содержать ссылку для скачивания исходного *.ifc-файла с нашего Minio;
- задание также будет сообщать мне, в какой bucket в Minio складывать результат;
- пусть само приложение будет собрано под .net core 3.1 и работет внутри Linux docker-контейнера на нашей «docker-ферме»;
Первые сложности и условности
Описывать подробно первые 4 пункта реализации не стану. Возможно позже.
Заставил приложение слушать очередь заданий и отсылать сообщение с результатом в очередь из CorrelationId сообщения-задания. Прикрутил генерированные классы запрос/ответ из protobuf. Научил скачивать/загружать файлы в minio.
Всё это делаю в проекте консольного приложения. В настройках проекта:
И на моей машине с Windows 10 всё вполне отлаживается и работает. Но при попытке запустить приложение в WSL ловлю ошибку System.IO.FileLoadException:
Recently at work, we were evaluating a few options to render building models in the browser. Building Information Modeling (BIM) in interoperability scenarios is done via Industry Foundation Classes, mostly in the STEP Physical File format. The schema is quite huge and complex with all the things you have to consider, so we were glad to find the xBim open source project on GitHub. They’ve got both projects to visualize building models in the browser with WebGL as well as conversion tools to create the binary-formatted geometry mesh. To achieve that, native C++ libraries are dynamically loaded (so no .Net Core compatibility) which must be present in the bin folder. The C++ libraries are expected either in the same folder as the application binaries or in a x64 (or x86, respectively) sub folder (See here for more details). In regular projects, the xBim.Geometry NuGet package adds a build task to copy the dlls into the build output folder, but this doesn’t work with the new tooling. You can, however, get it to work in Visual Studio 2015 by taking care of supplying the interop dlls yourself.
И подобные трудности не у одного меня. Многим хочется xBIM под .Net Core.
Не критично, но многое меняет… Всё упирается в невозможность нормально загрузить Xbim.Geometry.Engine64.dll. Нужно иметь на машине vc_redist.x64.exe. Какие у меня варианты?
Первое, что подумалось: «А может виндовый контейнер с полным .Net Framework использовать?
Доставить Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019 в этот контейнер, и всё будет ок?» Я это попробовал:
Сменил .Net Core на:
Что ж, это сработало… It’s alive! Но. А как же наша хостовая Linux-машина с docker? Не получится на неё загнать контейнер с образом на Windows Server Core. Надо выкручиваться…
Компромисс и развязка
To make things worse:
All binaries are 32-bits (x86).
Some require visual C++ redistributable runtime components.
Some require the .NET runtime.
Some need a windowing system, even though we only use the command-line interface (CLI).
В посте описывается потенциальная возможность запуска Windows-приложений в wine в Linux-контейнере. Любопытно, решил я.
После некоторых проб, багов и дополнений был получен Dockerfile:
Build идёт небыстро, но заканчивается удачно. Пробую, проверяю. Работает!
Итоги, выводы, размышления
5.2Гб), но вполне быстро стартует и внутри работает консольное Windows-приложени на .Net Framework 4.7, которое слушает RabbitMQ, пишет логи в Graylog, скачивает и загружает файлы на/в Minio. Обновлять само приложение буду по remote docker API.
Решение утилитарной выделенной задачи реализовано. Возможно, и скорее всего, не универсальное. Но меня в принципе устроило. Может быть кому-то тоже пригодится.
Спасибо, что прочли. На Хабр пишу впервые. Увидимся в комментариях.
Источник
7.3 Работа с Wine
Wine — свободное программное обеспечение, позволяющее пользователям ОС на базе ядра Linux исполнять 16-, 32- и 64- битные приложения созданные исключительно для Microsoft Windows. Название W.I.N.E. расшифровывается как «Wine Is Not an Emulator» — «W.I.N.E. — это не эмулятор». Имеется в виду, что Wine не является эмулятором компьютера или виртуальной машиной, как, например, qemu, VirtualBox и другие подобные им. Wine — это свободная реализация Windows API.
Смотрите видеоролик о работе с WINE в РЕД ОС на нашем официальном YouTube канале.
Установка Wine
Для установки необходимо открыть терминал, войти под суперпользователем root и начать установку:
если вы используете РЕД ОС версии 7.1 или 7.2, выполните команду:
если вы используете РЕД ОС версии 7.3 и старше, выполните команду:
Установка программ на Wine
Eсли установщик программы запускается файлом с расширением .msi, используем команду:
Устанавливаются программы в ваш домашний каталог, в папку .wine (папка скрытая).
Запуск программы
Чтобы запустить программу, необходимо указать полный путь к исполняемой программе или имени программы, как показано в примере ниже:
Первый запуск программы может длиться достаточно долгое время.
Префиксы Wine
Для разных программ могут потребоваться разные дополнительные компоненты, разные настройки Wine и т. п. Для этого и существуют префиксы Wine. Используя для каждой программы свой префикс, Вы сможете обеспечить им индивидуальное окружение. Для того, чтобы задействовать эту возможность, выполняем команду от обычного пользователя :
Где example, например, может быть название программы, которая в этом префиксе будет располагаться. Будет создан новый префикс и откроется панель управления Wine. Здесь можно что-то настроить, можно ее просто закрыть.
Все дальнейшие команды выполняем добавляя:
Например, запуская установщик нужной программы, вводим:
С помощью механизма префиксов можно создать 32 битное окружение wine и запускать в нем программы. Некоторые компоненты Windows и программы работают только или стабильнее в 32 битном префиксе.
Создайте сам 32 битный префикс командой
Пример установки dotnet35sp1 в 32-битный префикс:
Ключ «-q» означает автоответ, т.е на все вопросы отвечать «Yes».
И запустите в нем любую программу добавив в начале путь к префиксу и его архитектуру:
Удаление программ в Wine
Для удаления программ необходимо войти под суперпользователем root и использовать команду
После этого откроется окно «Установка/удаление программ», где следует выбрать нужную программу и нажать кнопку «Удалить»
Работа с реестром
Для открытия реестра используется инструмент regedit:
Чтобы перемещаться по реестру, кликните на ключах в левой части панели, чтобы перейти на следующий уровень глубины. Чтобы удалить ключ, кликните на нем и в меню Edit выберите «Delete». Чтобы добавить ключ или значение, определите место, где вы хотите поместить его, и выберите «New» из меню Edit. Чтобы изменить существующий ключ, выделите его в правой панели и выберите «Modify» из меню Edit. Другой способ проделать то же самое, это щелчок правой кнопкой мыши на ключе или значении.
Установка Winetricks
Wwinetricks — вспомогательный скрипт для загрузки и установки различных распространяемых библиотек, необходимых для запуска некоторых программ в Wine, а так же настройки окружения.
Для установки winetricks требуются права root:
для РЕД ОС версии 7.1 или 7.2:
для РЕД ОС версии 7.3 и старше:
ВАЖНО. Теперь winetricks готов к работе, все остальные операции с winetricks необходимо выполнять строго под обычным пользователeм .
Чтобы открыть диалоговое окно программы для работы в графическом режиме, необходимо вызвать команду:
По умолчанию выделен пункт «Выбрать путь для wine по умолчанию» — С ним обычно и предстоит работать, так как он указывает на дефолтный wine-префикс, который содержит drive_c и позволяет производить операции по его настройке.
При выборе пункта меню, установленного по умолчанию, открывается следующее окно, которое содержит список доступных над вайнпрефиксом операций, где можно доустановить библиотеки, шрифты, вызвать редактор реестра или окошко настроек wine (winecfg).
Установка пакета Dotnet
Для установки пакета в графическом режиме необходимо запустить winetricks.
Запускать программу надо именно под тем пользователем, под которым у вас работает wine, иначе программа установится не туда, куда нужно. Права root не нужны.
При открытии окна выбрать пункт меню, установленный по умолчанию, затем необходимо выбрать пункт «Установить библиотеку DLL или компонент Windows». В списке приложений следует выбрать пакет для установки, в зависимости от того, какая версия необходима, и нажать «ОК».
Затем откроется окно установки программы, где необходимо изучить и принять условия лицензионного соглашения и следовать инструкциям по установке.
Для полуавтоматической установки (название и описания компонентов выводятся по ключу — help):
Пример установки NET Framework 4.5 :
Работа с Mono
Mono — программная платформа, позволяющая разработчикам достаточно просто создавать развитые кроссплатформенные приложения. Технология Mono разрабатывается в виде open source реализации технологии .NET Framework от Microsoft и поддерживает стандарты ECMA-334 (стандарт языка C#) и ECMA-335 (стандарт среды исполнения (Common Language Runtime, CLI). Открытость указанных стандартов позволяет уменьшить проблемы создания кроссплатформенных приложений.
В базовом варианте Mono состоит из нескольких компонентов:
- Компилятор языка C#
- Среда исполнения Mono — состоит из среды исполнения (CLI) непосредственно, компилятора среды исполнения (Just-In-Time, JIT), генератора машинного кода (Ahead-Of-Time, AOT), загрузчика сборок, сборщика мусора, подсистемы управления многопоточностью и компонентов поддержки взаимодействия между сборками и COM (или аналогами в Linux, например XCOM).
- Базовая библиотека классов — набор стандартных классов, совместимых с классами Microsoft .NET Framework.
- Библиотека классов Mono — набор классов, поддерживающих дополнительные функции для разработки Linux-приложений. Например, классы для поддержки Zip, OpenGL, Cairo, Gtk+.
Начиная с версии Mono 2.2 реализована поддержка классов компилятора Mono.CSharp.Evaluator (сборка Mono.Sharp.dll) для создания собственных сервисов компиляции.
Среда исполнения Mono поддерживает инфраструктуру промежуточного языка CLI (Common Language Infrastructure), соответствующую стандарту ECMA-335. Виртуальная машина среды исполнения допускает возможность запуска приложений и сборок, скомпилированных в других системах (например, возможно запускать в Linux без перекомпиляции приложения, созданные при помощи Microsoft Visual Studio для исполнения в Microsoft Windows).
Также, вместо использования виртуальной машины, среда исполнения может быть интегрирована в приложение с целью создания встраиваемой системы, не требующей установки Mono для запуска и обладающей высоким быстродействием. При этом, в приложение включаются только необходимые компоненты среды исполнения.
Данный пакет ставится автоматически при установке Wine из репозитория версии 4.4.
Установка Gecko
Gecko – это свободный движок вывода веб-страниц для браузера при работе в интернете wine. Если wine не работает с интернетом и вы не запускаете windows exe браузер, то вам Gecko не нужен.
Обычно при запуске приложения для работы с веб-страницами Wine автоматически ищет Gecko сперва в /usr/share/wine/gecko. Если Wine не находит архив с Gecko там, то оно автоматически загружает его из интернета, но некоторые приложения не любят ждать, пока загрузиться Gecko и зависают или вылетают.
Данный пакет ставится автоматически при установке Wine из репозитория версии 4.4.
Если вы нашли ошибку, выделите текст и нажмите Ctrl+Enter.
Источник
Винные Трюки или установка компонентов Windows в Wine
Удивлен, что на Хабре все еще нет описания программы winetricks и плюсов, которые она может дать.
Многие сталкивались с ситуацией, когда Windows-программе требуется какой-то компонент для запуска. Например, .NET, Mono или DirectX.
Устанавливать их руками — долго и муторно — нужно искать дистрибутивы, скачивать, указывать параметры… Особенно в ситуации, когда установка wine выполняется впервые и ставить нужно много.
Сообщество Wine решило эту проблему.
Для облегчения этой задачи появилась отличная программа winetricks. В последней версии она имеет как консольный, так и графический интерфейс. Сам интерфейс предельно прост — выбор пакета и кнопка начала установки.
Установка.
Для корректной работы программы нам потребуется собственно wine, cabextract и сама winetricks.
Первое и второе вы можете установить через пакеты дистрибутива, а вот сам WT придется ставить руками.
Самую свежую версию winetricks можно взять на:
winezeug.googlecode.com/svn/trunk/winetricks (Спасибо TiGR за ссылку). Ниже приведена устаревшая стабильная версия.
$ su
Password:
# wget -c www.kegel.com/wine/winetricks -O winetricks
# mv winetricks /usr/sbin/
# chmod a+rwx /usr/sbin/winetricks
# exit
Запускать программу надо именно под тем пользователем, под которым у вас работает wine, иначе софт установится не туда, куда нужно. Права root НЕ НУЖНЫ.
Для открытия GUI с выбором компонента:
Для полуавтоматической установки (название и описания компонентов выводятся по ключу —help):
$ winetricks «components names»
На данный момент winetricks знает около сотни различных компонентов и приложений, включая Mono, FireFox, .NET Framework, IE и DirectX.
Источник