Нативное по для ос windows

Время на прочтение9 мин

Количество просмотров5K

Сегодня продолжаем рассказ о том, как мы вместе с ребятами из Университета Иннополис разрабатываем технологию Active Restore, чтобы позволить пользователю как можно раньше начать работу на своей машине после сбоя. Речь пойдет о нативных приложениях Windows, включая особенности их создания и запуска. Под катом – немного о нашем проекте, а также практическое руководство как писать нативные приложения.

В прошлых постах мы уже рассказывали о том, что такое Active Restore, и как студенты из Иннополиса разрабатывают сервис. Сегодня я хочу остановиться на нативных приложениях, до уровня которых мы хотим “закопать” наш сервис активного восстановления. Если все получится, то мы сможем:

  • Намного раньше запустить сам сервис
  • Намного раньше связаться с облаком, в котором лежит бэкап
  • Намного раньше понять, в каком режиме находится система – нормальной загрузки или восстановления
  • Намного меньше файлов восстанавливать заранее
  • Позволить пользователю приступить к работе еще быстрее.

Что вообще такое нативное приложение?

Чтобы ответить на этот вопрос, давайте взглянем на последовательность вызовов, которые совершает система, например, если программист в своем приложении пытается создать файл.

Pavel Yosifovich — Windows Kernel Programming (2019)

Программист использует функцию CreateFile, которая объявлена в заголовочном файле fileapi.h и реализована в Kernel32.dll. Однако сама эта функция не занимается созданием файла, она лишь проверяет аргументы на входе и вызывает функцию NtCreateFile (приставка Nt как раз свидетельствует о том, что функция нативная). Данная функция объявлена в заголовочном файле winternl.h и реализована в ntdll.dll. Она производит подготовку к прыжку в ядерное пространство, после чего совершает системный вызов для создания файла. В данном случае получается, что Kernel32 – всего лишь обертка для Ntdll. Одна из причин для чего это сделано, Microsoft таким образом имеет возможность изменять функции нативного мира, но при этом не трогать стандартные интерфейсы. Microsoft не рекомендует напрямую вызывать нативные функции и не документирует большую часть из них. Кстати, недокументированные функции можно найти тут.

Основное преимущество нативных приложений заключается в том, что ntdll загружается в систему значительно раньше kernel32. Это логично, ведь kernel32 требует наличия ntdll для работы. Как следствие, приложения, использующие нативные функции, могут начать работу значительно раньше.

Таким образом, Windows Native Applications – это программы, способные запускаться на раннем этапе загрузки Windows. Они используют ТОЛЬКО функции из ntdll. Пример такого приложения: autochk который исполняет chkdisk utility для проверки диска на ошибки еще до запуска основных сервисов. Именно на таком уровне мы и хотим видеть наш Active Restore.

Что нам понадобится?

  • DDK (Driver Development Kit), ныне также известный под названием WDK 7 (Windows Driver Kit).
  • Виртуальная машина (например, Windows 7 x64)
  • Не обязательно, но могут помочь заголовочные файлы которые можно скачать тут

Что же в коде?

Давайте немного потренируемся и для примера напишем небольшое приложение которое:

  1. Выводит сообщение на экран
  2. Аллоцирует немного памяти
  3. Ждет ввода с клавиатуры
  4. Освобождает занятую память

В нативных приложениях точкой входа является не main или winmain, а функция NtProcessStartup, так как мы фактически напрямую запускаем новые процесс в системе.

Начнем с вывода сообщения на экран. Для этого у нас есть нативная функция NtDisplayString, которая в качестве аргумента принимает указатель на объект структуры UNICODE_STRING. Инициализировать его нам поможет RtlInitUnicodeString. В результате, для вывода текста на экран мы можем написать вот такую небольшую функцию:

//usage: WriteLn(L"Here is my text\n");
void WriteLn(LPWSTR Message)
{
    UNICODE_STRING string;
    RtlInitUnicodeString(&string, Message);
    NtDisplayString(&string);
}

Так как нам доступны только функции из ntdll, и других библиотек в памяти просто еще нет, у нас обязательно возникнут проблемы с тем как аллоцировать память. Оператора new ещё не существует (потому что он родом из слишком высокоуровнего мира C++), также нет функции malloc (для нее нужны библиотеки runtime C). Можно конечно пользоваться лишь стэком. Но если нам нужно динамически аллоцировать память, делать это придется в куче (т.е. heap). Поэтому давайте создадим для себя кучу и будем брать из нее память когда нам потребуется.

Для этой задачи подойдет функция RtlCreateHeap. Далее, используя RtlAllocateHeap и RtlFreeHeap, мы будем занимать и освобождать память когда нам это будет нужно.

PVOID memory = NULL;
PVOID buffer = NULL;
ULONG bufferSize = 42;

// create heap in order to allocate memory later
memory = RtlCreateHeap(
  HEAP_GROWABLE, 
  NULL, 
  1000, 
  0, NULL, NULL
);

// allocate buffer of size bufferSize
buffer = RtlAllocateHeap(
  memory, 
  HEAP_ZERO_MEMORY, 
  bufferSize
);

// free buffer (actually not needed because we destroy heap in next step)
RtlFreeHeap(memory, 0, buffer);

RtlDestroyHeap(memory);

Перейдем к ожиданию ввода с клавиатуры.

// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
  USHORT UnitId;
  USHORT MakeCode;
  USHORT Flags;
  USHORT Reserved;
  ULONG  ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;

//...

HANDLE hKeyBoard, hEvent;
UNICODE_STRING skull, keyboard;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK Iosb;
LARGE_INTEGER ByteOffset;
KEYBOARD_INPUT_DATA kbData;

// inialize variables
RtlInitUnicodeString(&keyboard, L"\\Device\\KeyboardClass0");
InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);

// open keyboard device
NtCreateFile(&hKeyBoard,
			SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
			&ObjectAttributes,
			&Iosb,
			NULL,
			FILE_ATTRIBUTE_NORMAL,
			0,
			FILE_OPEN,FILE_DIRECTORY_FILE,
			NULL, 0);

// create event to wait on
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);

while (TRUE)
{
	NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
	NtWaitForSingleObject(hEvent, TRUE, NULL);

	if (kbData.MakeCode == 0x01)    // if ESC pressed
	{
			break;
	}
}

Все что нам нужно – это использовать NtReadFile на открытом устройстве, и ждать, пока клавиатура не вернет нам какое либо нажатие. В случае, если нажата клавиша ESC, мы продолжим работу. Чтобы открыть устройство, нам потребуется вызвать функцию NtCreateFile (открыть нужно будет \Device\KeyboardClass0). Также мы вызовем NtCreateEvent, чтобы инициализировать объект для ожидания. Мы самостоятельно объявим структуру KEYBOARD_INPUT_DATA, которая представляет данные клавиатуры. Это облегчит нам работу.

Работа нативного приложения завершается вызовом функции NtTerminateProcess, потому что мы просто убиваем свой собственный процесс.

Весь код нашего небольшого приложения:

#include "ntifs.h" // \WinDDK\7600.16385.1\inc\ddk
#include "ntdef.h"

//------------------------------------
// Following function definitions can be found in native development kit
// but I am too lazy to include `em so I declare it here
//------------------------------------

NTSYSAPI
NTSTATUS
NTAPI
NtTerminateProcess(
  IN HANDLE               ProcessHandle OPTIONAL,
  IN NTSTATUS             ExitStatus
);

NTSYSAPI 
NTSTATUS
NTAPI
NtDisplayString(
	IN PUNICODE_STRING String
);

NTSTATUS 
NtWaitForSingleObject(
  IN HANDLE         Handle,
  IN BOOLEAN        Alertable,
  IN PLARGE_INTEGER Timeout
);

NTSYSAPI 
NTSTATUS
NTAPI
NtCreateEvent(
    OUT PHANDLE             EventHandle,
    IN ACCESS_MASK          DesiredAccess,
    IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
    IN EVENT_TYPE           EventType,
    IN BOOLEAN              InitialState
);



// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
  USHORT UnitId;
  USHORT MakeCode;
  USHORT Flags;
  USHORT Reserved;
  ULONG  ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;

//----------------------------------------------------------
// Our code goes here
//----------------------------------------------------------

// usage: WriteLn(L"Hello Native World!\n");
void WriteLn(LPWSTR Message)
{
    UNICODE_STRING string;
    RtlInitUnicodeString(&string, Message);
    NtDisplayString(&string);
}

void NtProcessStartup(void* StartupArgument)
{
	// it is important to declare all variables at the beginning
	HANDLE hKeyBoard, hEvent;
	UNICODE_STRING skull, keyboard;
	OBJECT_ATTRIBUTES ObjectAttributes;
	IO_STATUS_BLOCK Iosb;
	LARGE_INTEGER ByteOffset;
	KEYBOARD_INPUT_DATA kbData;
	
	PVOID memory = NULL;
	PVOID buffer = NULL;
	ULONG bufferSize = 42;

	//use it if debugger connected to break
	//DbgBreakPoint();

	WriteLn(L"Hello Native World!\n");

	// inialize variables
	RtlInitUnicodeString(&keyboard, L"\\Device\\KeyboardClass0");
	InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);

	// open keyboard device
	NtCreateFile(&hKeyBoard,
				SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
				&ObjectAttributes,
				&Iosb,
				NULL,
				FILE_ATTRIBUTE_NORMAL,
				0,
				FILE_OPEN,FILE_DIRECTORY_FILE,
				NULL, 0);

	// create event to wait on
	InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
	NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);
	
	WriteLn(L"Keyboard ready\n");
	
	// create heap in order to allocate memory later
	memory = RtlCreateHeap(
	  HEAP_GROWABLE, 
	  NULL, 
	  1000, 
	  0, NULL, NULL
	);
	
	WriteLn(L"Heap ready\n");

	// allocate buffer of size bufferSize
	buffer = RtlAllocateHeap(
	  memory, 
	  HEAP_ZERO_MEMORY, 
	  bufferSize
	);
	
	WriteLn(L"Buffer allocated\n");

	// free buffer (actually not needed because we destroy heap in next step)
	RtlFreeHeap(memory, 0, buffer);

	RtlDestroyHeap(memory);
	
	WriteLn(L"Heap destroyed\n");
	
	WriteLn(L"Press ESC to continue...\n");

	while (TRUE)
	{
		NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
		NtWaitForSingleObject(hEvent, TRUE, NULL);

		if (kbData.MakeCode == 0x01)    // if ESC pressed
		{
				break;
		}
	}

	NtTerminateProcess(NtCurrentProcess(), 0);
}

PS: Мы можем запросто использовать в коде функцию DbgBreakPoint() для остановки в дебаггере. Правда нужно будет подключить WinDbg к виртуальной машине для кернельной отладки. Инструкцию как это сделать можно найти тут или просто использовать VirtualKD.

Компиляция и сборка

Самый простой способ собрать нативное приложение – это использовать DDK (Driver Development Kit). Нам нужна именно древняя седьмая версия, так как более поздние версии имеют несколько иной подход и тесно работают с Visual Studio. Если же использовать DDK, то нашему проекту нужны всего лишь Makefile и sources.

Makefile

!INCLUDE $(NTMAKEENV)\makefile.def

sources:

TARGETNAME			= MyNative
TARGETTYPE			= PROGRAM
UMTYPE				= nt
BUFFER_OVERFLOW_CHECKS 		= 0
MINWIN_SDK_LIB_PATH		= $(SDK_LIB_PATH)
SOURCES 			= source.c

INCLUDES 			= $(DDK_INC_PATH); \
				  C:\WinDDK\7600.16385.1\ndk;

TARGETLIBS 			= $(DDK_LIB_PATH)\ntdll.lib	\
				  $(DDK_LIB_PATH)\nt.lib

USE_NTDLL			= 1

Ваш Makefile будет точно таким же, на sources же давайте остановимся чуть подробнее. В данном файле указываются исходники вашей программы (файлы .c), опции сборки и другие параметры.

  • TARGETNAME – имя исполняемого файла, который должен получиться в итоге.
  • TARGETTYPE – тип исполняемого файла, это может быть драйвер (.sys), тогда значение поля должно быть DRIVER, если библиотека (.lib), то значение LIBRARY. В нашем случае нужен исполняемый файл (.exe), поэтому мы устанавливаем значение PROGRAM.
  • UMTYPE – возможные значения этого поля: console для консольного приложения, windows для работы в оконном режиме. Но нам необходимо указать nt, чтобы получить нативное приложение.
  • BUFFER_OVERFLOW_CHECKS – проверка стэка на переполнение буфера, к сожалению не наш случай, выключаем.
  • MINWIN_SDK_LIB_PATH – данное значение ссылается на переменную SDK_LIB_PATH, не стоит переживать что у вас не объявлена подобная системная переменная, в момент когда мы запустим checked build из DDK, данная переменная будет объявлена и будет указывать на необходимые библиотеки.
  • SOURCES – список исходников вашей программы.
  • INCLUDES – заголовочные файлы, которые необходимы для сборки. Тут обычно указывают путь к файлам, которые идут в комплекте с DDK, но вы можете указать дополнительно любые другие.
  • TARGETLIBS – список библиотек, которые необходимо линковать.
  • USE_NTDLL – обязательное поле, которое необходимо установить в положение 1. По вполне очевидным причинам.
  • USER_C_FLAGS – любые флаги, которые вы сможете использовать в препроцессорных директивах при подготовке кода приложения.

Итак для сборки нам необходимо запустить x86 (или x64) Checked Build, сменить рабочий каталог на папку с проектом и выполнить команду Build. Результат на скриншоте показывает что у нас собрался один исполняемый файл.

Build

Данный файл не получится так просто запустить, система ругается и отправляет нас думать о своем поведении со следующей ошибкой:

Error

Как запустить нативное приложение?

В момент старта autochk последовательность запуска программ определяется значением ключа реестра:

HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute

Менеджер сессии поочередно исполняет программы из этого списка. Сами же исполняемые файлы менеджер сессии ищет в директории system32. Формат значения ключа реестра следующий:

autocheck autochk *MyNative

Значение должно быть в шестнадцатеричном формате, а не в привычном ASCII, следовательно ключ, представленный выше, будет иметь формат:

61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00

Чтобы конвертировать название, можно использовать онлайн-сервис, например, этот.

Получается, чтобы запустить нативное приложение, нам необходимо:

  1. Скопировать исполняемый файл в папку system32
  2. Добавить в реестр ключ
  3. Перезагрузить машину

Для удобства вот вам готовый скрипт для установки нативного приложения:

install.bat

@echo off
copy MyNative.exe %systemroot%\system32\.
regedit /s add.reg
echo Native Example Installed
pause

add.reg

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]
"BootExecute"=hex(7):61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00

После установки и перезагрузки еще до появления экрана выбора пользователей мы получим следующую картину:

result

Итог

На примере вот такого маленького приложения мы убедились, что запустить приложение на уровне Windows Native вполне возможно. Дальше мы с ребятами из Университета Иннополис продолжим строить сервис, который будет инициировать процесс взаимодействия с драйвером намного раньше, чем в предыдущей версии нашего проекта. А с появлением оболочки win32 логично будет передать управление полноценному сервису, который уже был разработан (об этом подробнее здесь).

В очередной статье мы коснемся еще одного компонента сервиса Active Restore, а именно UEFI драйвера. Подписывайтесь на наш блог, чтобы не пропустить следующий пост.

 

Десять кроссплатформенных вариантов для создания нативных мобильных и веб-приложений

03.05.2025

Портал The New Stack представляет 10 фреймворков и языков для создания кроссплатформенных приложений.

1. Flutter

Открытый инструментарий Google для создания мобильного пользовательского интерфейса (UI) Flutter позволяет писать высокопроизводительные мобильныхе, веб- и настольные приложения с нативными внешним видом и ощущениями на основе единой кодовой базы. Построенный на базе языка программирования Dart, он известен горячей перезагрузкой, настраиваемым UI и богатым набором виджетов. Flutter используется внутри Google, а также применяется такими компаниями, как BMW и Toyota.

2. Iconic

Iconic — это открытый набор инструментов для создания высококачественных кроссплатформенных гибридных и прогрессивных веб-приложений (PWA) с использованием HTML, CSS и JavaScript. Разработчики используют его для написания приложений, которые могут работать на веб-платформах, iOS, Android и настольных компьютерах.

Хотя прошлые версии Ionic были тесно связаны с Angular, в версии 4.x фреймворк был переработан для работы в качестве самостоятельной библиотеки Web Component, поэтому его можно использовать в большинстве фронтенд-фреймворков, включая React и Vue. Некоторые JavaScript-фреймворки для полноценной поддержки Web Component требуют использования shim, то есть кода (часто библиотеки), который выступает в качестве промежуточного слоя.

3. Kotlin

Kotlin — многоплатформенный язык программирования общего назначения, разработанный компанией JetBrains, поставщиком интегрированной среды разработки (IDE). Он может компилироваться в JVM, JavaScript для веб-разработки и в нативный код для создания кроссплатформенных приложений под Android, iOS, macOS, Windows, Linux и WebAssembly. Kotlin используется с фреймворками пользовательского интерфейса, такими как Compose Multiplatform, фреймворк на базе Kotlin для совместного использования декларативного UI на нескольких платформах: для Android, iOS, настольных компьютеров и, в экспериментальном варианте, для Web.

У компании также есть Kotlin Multiplatform Mobile, фреймворк для мобильной разработки, построенный на базе языка Kotlin. Он позволяет разработчикам один раз написать бизнес-логику, не зависящую от платформы, а затем скомпилировать ее в библиотеку Kotlin для Android и нативный Universal Framework для iOS с помощью Kotlin/Native. Netflix использовала этот инструмент для создания Prodicle, мобильного приложения для производства телешоу и фильмов.

4. Lynx

Lynx — это семейство технологий с LynxJS в качестве кроссплатформенного UI-фреймворка, созданное ByteDance, компанией-владельцем TikTok. Lynx позволяет разработчикам создавать нативные UI с использованием единой кодовой базы для кроссплатформенных приложений, включая веб, Android и iOS. Он был запущен 5 марта и уже получил положительные отзывы и сравнения с React Native.

5. NativeScript

NativeScript — это фреймворк с открытым исходным кодом на основе JavaScript для создания нативных мобильных приложений для iOS и Android с помощью JavaScript, TypeScript или Angular. В отличие от гибридных фреймворков, которые отображают UI в WebView, NativeScript компилируется непосредственно в нативные UI-компоненты, что обеспечивает производительность и пользовательский опыт, близкие к приложениям, созданным на таких специфичных для конкретной платформы языках, как Swift или Kotlin. Это позволяет веб-разработчикам использовать имеющиеся навыки для создания высокопроизводительных мобильных приложений, сохраняя при этом доступ к нативным API устройств.

6. .NET MAUI

.NET MAUI, ранее называвшийся Xamarin, расшифровывается как NET Multiplatform App UI. Разработанный Microsoft, он позволяет разработчикам .NET создавать нативные мобильные и настольные приложения на основе единой кодовой базы. Он использует C# и экосистему .NET, предоставляя единый API для доступа к функциям конкретной платформы и создания UI, которые могут работать на iOS, Android, macOS и Windows. Используется компанией Progress Software. При этом Xamarin все еще доступен.

7. One

One — это фреймворк на основе React, который позволяет разработчикам писать один раз и развертывать в вебе или React Native для мобильных устройств. По словам его создателя Нейта Винерта, который также создал библиотеку пользовательского интерфейса Tamagui, в настоящее время он находится в бета-версии. С помощью единого плагина Vite он дает разработчикам возможность создавать приложения как для веб, так и для нативной платформы. One позволяет создавать одностраничные приложения, генерировать статические сайты и рендерить веб-страницы на стороне сервера, что является его ключевым отличием.

8. Qt

Qt — зрелый кроссплатформенный фреймворк, написанный преимущественно на C++. Он используется для разработки для настольных систем — Windows, MacO и Linux — но также поддерживает встраиваемые системы, мобильные устройства с Qt for Mobile и веб с Qt for WebAssembly. Он предоставляет богатый набор виджетов и UI-инструментов.

Qt также предоставляет набор библиотек для таких функций, как поддержка сетей, доступ к базам данных, обработка мультимедиа и XML, что позволяет создавать сложные приложения для разных платформ на основе единой кодовой базы. В отличие от других вариантов в этом списке, у QT есть вариант коммерческой лицензии.

9. React Native

React Native — это фреймворк с открытым исходным кодом, который позволяет разработчикам создавать нативные мобильные приложения для iOS и Android с помощью JavaScript и React. Он позволяет повторно использовать код на разных платформах, ускоряя разработку и обеспечивая при этом доступ к нативным функциям и производительности устройств. Веб-разработчики на JavaScript используют его для создания мобильных приложений. Одним из способов использования React Native является Expo — фреймворк и платформа, построенная поверх React Native.

10. Swift

Разработанный Apple для собственных платформ, Swift превратился в кроссплатформенный язык программирования. Он доступен в Linux и Windows для разработки серверной части, инструментов командной строки и настольных приложений. SwiftUI — это проприетарный фреймворк на основе Swift для создания приложений для всех платформ Apple (iOS, macOS, watchOS, tvOS и visionOS).

В таблице представлено сравнение фреймворков:

Название

Что собой представляет

Кем создан

Основа

Для чего предназначен

Open Source?

Особенности

Flutter

Комплект для разработки UI

Google

Dart

Нативно скомпилированные из единой кодовой базы мобильные, веб- и настольные приложения

Да, лицензия BSD 3-Clause

Известен своей быстрой разработкой благодаря таким функциям, как Hot Reload, выразительным и гибким UI с богатым набором виджетов, а также способностью создавать высокопроизводительные приложения, которые выглядят и ощущаются как нативные на разных платформах

Iconic

UI-инструментарий

Макс Линч, Бен Сперри и Адам Брэдли, которые были частью компании Drifty в 2013 г.

JavaScript — включая Angular, Vue и React — и его разновидности (например, TypeScript), а также HTML и CSS

Гибридные мобильные приложения, прогрессивные веб-приложения (PWA) и настольные приложения, использующие веб-технологии, такие как HTML, CSS и JavaScript (часто с Angular, React или Vue.js)

Да, лицензия MIT

Доступен Iconic CLI; он отображает UI в WebView

Kotlin

Кроссплатформенный язык программирования общего назначения

JetBrains

Java

Разработка под Android и разработка бэкенда на виртуальной машине Java (JVM). Компилируется в JavaScript (Kotlin/JS) для фронтенд-веб-разработки и в нативный код (Kotlin/Native) для iOS, macOS, Windows, Linux и WebAssembly

Да, лицензия Apache 2.0

Совместное использование кода на разных платформах

Lynx

Кросс-платформенный UI-фреймворк

ByteDance, которой принадлежит TikTok

Основной движок написан на Rust, однако для создания приложений на Lynx разработчики в основном используют JavaScript и TypeScript

Используется для создания единой кодовой базы для кроссплатформенных приложений и веба

Да, лицензия Apache 2

Позволяет разработчикам использовать CSS, даже если он является нативным. Некоторые компоненты UI и расширенные встроенные графические возможности еще не выпущены под лицензией Apache 2

NativeScript

Фреймворк для создания нативных мобильных приложений для iOS и Android с помощью JavaScript, TypeScript или Angular

Telerik, которая ныне принадлежит компании Progress Software. Сейчас принадлежит OpenJS Foundation

JavaScript, TypeScript и Angular

Создание нативных приложений для iOS и Android с помощью JavaScript, TypeScript или Angular.

Да, лицензия Apache 2.0

В нем напрямую используются нативные компоненты UI. Разработчики получают доступ ко всем возможностям нативных API устройств. NativeScript не пытается эмулировать нативный UI или работать в контейнере браузера. Вместо этого он выступает в роли моста между JavaScript/TypeScript/Angular и нативными API, позволяя писать код на этих привычных языках, который напрямую манипулирует и использует базовые возможности нативной платформы и компоненты UI

.NET MAUI (ранее Xamarin)

Кросс-платформенный фреймворк

Microsoft

C# и .NET

Развивает и унифицирует Xamarin.Forms, позволяя создавать приложения, которые могут работать на iOS, Android, macOS и Windows из единой кодовой базы

Да, лицензия MIT

Предоставляет набор элементов управления UI и API для доступа к нативным функциям платформы

One

Кросс-платформенный фреймворк

Нейт Вайнерт

JavaScript React

Создает как веб-страницы с помощью React, так и нативные приложения для платформ с помощью React Native

Да, лицензия MIT

Отображает любую страницу как SPA, SSR или SSG, управляя глобальным значением по умолчанию. Предлагает CLI

QT

Кроссплатформенный фреймворк для разработки настольных приложений с поддержкой мобильных устройств с помощью Qt for Mobile и веб-приложений с помощью Qt for WebAssembly

Хаавард Норд и Эйрик Чамбе-Энг из компании Trolltech, которая после ряда приобретений превратилась в Qt Company

C++

Высокопроизводительные настольные, мобильные и веб-приложения

Да, лицензии LGPL и GPL, доступна коммерческая лицензия

Предоставляет набор библиотек для таких функций, как работа в сети, доступ к базам данных, мультимедиа, обработка XML, поэтому с его помощью можно создавать сложные приложения для разных платформ на основе единой кодовой базы

React Native

Фреймворк для создания нативных мобильных приложений

Meta (признана экстремистской и запрещена в РФ)

JavaScript React

iOS и Android из единой кодовой базы

Да, лицензия MIT

Swift

Кроссплатформенный язык, использующий UIKit или SwiftUI в качестве фреймворка

Apple

Swift

Создание приложений для iOS и Android (с помощью Swift for Android). Может компилироваться в WebAssembly и использоваться для создания серверных приложений для Linux, инструментов командной строки и многого другого. Растущая поддержка разработки на Swift под Windows позволяет создавать приложения и для этой платформы

Да

Создает компоненты на стороне сервера, которые обеспечивают работу веб-приложений и генерируют исходный HTML. Такие фреймворки, как Vapor, Kitura и Perfect, позволяют разрабатывать веб-приложения на стороне сервера с помощью Swift

Комментарии

Только зарегистрированные пользователи могут оставлять комментарий.

Регистрация
Авторизация

 

Интересно

Агенты искусственного интеллекта придут в стек SaaS

Сегодня только 1% SaaS-приложений дополнены искусственным интеллектом, но ситуация быстро меняется, пишет …

Snowflake: ранние последователи GenAI удовлетворены отдачей от своих инвестиций

В последние два с половиной года генеративный искусственный интеллект (GenAI) развивался удивительными темпами. Все …

Forrester: агентный ИИ усиливает платформы освоения цифровых технологий

Поставщики платформ освоения цифровых технологий (Digital Adoption Platform, DAP) были в авангарде интеграции автоматизации …

Импортозамещение ИТ в нефтегазовой отрасли: особенности, специфика, поиск поставщика

Цифровая трансформация предприятий поддерживается на уровне нацпроектов: с начала этого года действует программа …

ИИ-инструменты генерации кода: эксперименты и метрики

Компания DevExperts, занимающаяся разработкой ПО, протестировала и сравнила инструменты генерации кода Copilot …

Создавайте красивые нативные настольные приложения для Windows и macOS.

.NET МАУИ

.NET Multi-platform App UI (.NET MAUI) — это платформа для создания современных многоплатформенных настольных приложений для macOS и Windows, а также мобильных приложений для Android и iOS с использованием C# и XAML в единой кодовой базе.

.NET MAUI использует новейшие современные технологии для создания нативных приложений для Android, iOS, macOS и Windows, абстрагируя их в одну общую структуру, построенную на .NET 6 и более поздних версиях.

Узнайте больше о .NET MAUI

Blazor Hybrid

Blazor позволяет создавать интерактивные пользовательские веб-интерфейсы с помощью C# вместо JavaScript. Приложения Blazor состоят из многократно используемых компонентов веб-интерфейса, реализованных с использованием C#, HTML и CSS.

Совместно используйте одни и те же компоненты Blazor на настольных компьютерах, мобильных устройствах и в Интернете, используя при этом полный доступ к собственным возможностям клиента с помощью Blazor Hybrid.

Узнайте больше о Blazor Hybrid

WinUI и WinAppSDK

Библиотека пользовательского интерфейса Windows (WinUI) — это платформа пользовательского интерфейса для настольных приложений Windows, включающая поддержку C# и .NET. WinUI доступен как часть Windows App SDK. Windows App SDK предоставляет унифицированный набор API и инструментов, которые можно использовать согласованным образом в широком наборе целевых версий ОС Windows.

.NET MAUI использует WinUI под капотом при работе с настольными приложениями Windows.

Узнайте больше о вариантах разработки для Windows

Готовы приступить?

Простое обучение .NET с помощью пошаговых руководств.

Начать

React Native — это платформа, позволяющая создавать мобильные приложения на основе JavaScript и React. Разработана Facebook и применяется во многих мировых проектах, среди которых Instagram, Discord, Pinterest, Bloomberg, Wix и другие.

Приложения на React Native имеют согласованный интерфейс: учитесь один раз — пишите где угодно.

Создание приложений для Windows на React Native 1

Благодаря репозиторию React Native for Windows приложения на React можно писать для UWP (Universal Windows Platform), а значит под все устройства, которые поддерживают Windows 10 (ПК, планшеты, Xbox, устройства смешанной реальности).

Узнать подробней и начать изучать этот проект можно по его документации. Так же можно ознакомиться с React Native в целом. Следить за последними событиями можно в блоге.

React Native for Windows — это open source проект. Вы сможете помочь им, предложив какую-нибудь фичу или решив имеющуюся проблему.

Уже успели купить новые Copilot+ PC — Surface Pro 11 или Surface Laptop 7? Пора запускать любимые приложения — в этой статье расскажем, какие из них уже оптимизированы для Windows на ARM.

Веб-браузеры

Браузер — одно из важнейших приложений на любом компьютере. Отличная новость: большинство популярных браузеров уже оптимизированы для Windows на ARM! Google Chrome, Mozilla Firefox, Microsoft Edge и не только — все они работают с максимальной производительностью и эффективностью.

  • Google Chrome — быстрый и безопасный браузер от Google.
  • Microsoft Edge — встроенный браузер с ИИ-помощником.
  • Mozilla Firefox — браузер, защищающий вашу приватность.
  • Opera Browser: — легкий и быстрый, с множеством встроенных функций.
  • Brave Browser — блокирует рекламу и трекеры из коробки, ускоряя серфинг.
  • Vivaldi Browser — Максимальные возможности настройки и встроенные инструменты для продуктивной работы.

Мультимедиа

Для отдыха идеально подходят мультимедийные приложения. К счастью, для Windows на базе ARM есть множество оптимизированных программ, включая Spotify, VLC Media Player и популярные стриминговые сервисы.

  • Windows Media Player — встроенное приложение для просмотра видео и прослушивания музыки.
  • Spotify — популярный стриминговый сервис с клиентом под Windows.
  • VLC Media Player — бесплатный кросс-платформенный медиаплеер и потоковый сервер.
  • Kodi — медиаплеер с открытым исходным кодом.
  • Netflix — смотрите самые обсуждаемые телешоу и фильмы.
  • Handbrake — популярный конвертер форматов.

Продуктивность

Ваш ПК с Windows готов к работе, и на нем должны быть приложения для повышения продуктивности. Microsoft Office оптимизирован для Windows на базе ARM и включает Word, PowerPoint, OneNote и Outlook. Также доступны альтернативы, такие как LibreOffice и Notepad++.

  • Microsoft Office — все ваши любимые приложения и контент в одном месте.
  • Microsoft OneNote — цифровой блокнот для записи и организации заметок.
  • Microsoft Outlook — лучший в своем классе опыт работы с электронной почтой, бесплатный для всех пользователей Windows.
  • Microsoft Journal — приложение для ведения дневника с цифровым пером.
  • Microsoft To-Do — планируйте свой день и управляйте своей жизнью.
  • Microsoft Phone Link — мгновенный доступ к вашему телефону прямо с ПК.
  • LibreOffice — мощный офисный пакет, совместимый с Microsoft Office.
  • Notepad++ — бесплатный редактор исходного кода, поддерживающий множество языков.

Новости о программах, устройствах и технологиях Microsoft

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Показать доступные сети не открывается windows 10
  • Windows 10 не видит проводную мышь
  • Download msi afterburner windows 10
  • Minecraft windows 10 edition пиратка
  • Активация удаленных рабочих столов windows server 2022