Компания 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, который планируют развивать и для других языков.
![](https://habrastorage.org/webt/lx/bh/sx/lxbhsx8w9oug6vwhnpmvr4m3dxo.gif)
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#.