Компания Microsoft рассказала о проекте по упрощению взаимодействия с API Win32 для языков программирования Rust и С#. Проект получил название win32metadata и доступен для предварительного просмотра на Github.

Цель проекта win32metadata — полное описание Win32 API в метаданных, чтобы облегчить взаимодействие с API, повысить корректность и минимизировать затраты на обслуживание. Microsoft разработала файл метаданных Windows c полным описанием Win32 API, который совместим с ECMA-335 (winmd) и опубликовала на nuget.org.

Компания объяснила, что из-за объёма материалов API Win32 точное описание всех элементов займёт некоторое время.

Для использования API Win32 в других языках программирования Microsoft добавила языковые проекции, надстроенные над ними.

C# / Win32

Эта проекция была создана в партнёрстве с Эндрю Арноттом, владельцем P/Invoke для .NET. Она анализирует метаданные и создаёт обёртки P/Invoke, которые требуются для вызова API. Для установки проекции необходимо:

  • Добавить ссылку на Microsoft.Windows.SDK.Win32Metadata от nuget.org;

  • Поместить файл NativeMethods.txt в корневую директорию проекта вместе со списком функций Win32, которые запланированы для проекта.

Файл NativeMethods.txt поддерживает размещение функции в строке и подстановочные знаки, например, BCrypt.* для включения целых модулей.

После этого проекция C# / Win32 начнёт генерировать обёртки P/Invoke для запрашиваемых функций и всех их зависимостей.

Microsoft разъяснило, что это ранний прототип взаимодействия с динамически создаваемыми проекциями API Win32, который планируют развивать и для других языков.

Rust

Языковая проекция для Rust унаследовала методы взаимодействия от C++/WinRT. Она даёт возможность вызывать любой Windows API через созданный на лету из метаданных код. По заверению разработчиков Microsoft, это создаёт иллюзию работы с обычными модулями Rust. Проекция не разделяет API по технологиям, а предоставляет общий способ вызова любого модуля, независимо от базовой технологии.

Другие языки

Представители компании Microsoft работают над обновлением проекции C++ с открытым доступом на GitHub. Они рассказали, что проект находится на ранней стадии разработки и сейчас программисты собирают обратную связь от пользователей.


API Win32 используется для прямого взаимодействия приложений с операционной системой, и он был создан для языка C. У Windows API соглашение о вызове отличается от cdecl, вместо этого он использует stdcall, что даёт возможность языкам программирования, которые способны вызывать эти функции и оперировать типами данных в исполняемых программах Windows, взаимодействовать с API.

Ранее разработчики вручную создавали обёртки и привязки для Rust и C#, что приводило к  ошибкам и проблемам с масштабируемостью систем. Такие неудобства существенно увеличивали расходы на разработку и нагрузку на программистов.

В дорожной карте Microsoft запланировала до конца 2021 года опубликовать полный пакет метаданных Win32 на портале nuget.org с управлением версиями для всех релизов Windows SDK, выпустить языковые проекции для C#, C++ и Rust, а также интегрировать .NET 5 в проекцию C#.