Microsoftは、Rust for Windowsのプレビュー版を発表した。これは、任意のWindows APIを使ってWindows用のRustアプリを作成できるようにすることを目的としている。
Rust for Windowsは、win32metadataプロジェクトを活用して古いAPIと最近のAPIの両方を利用できるようにすることを目指している。そしてC#とF#以外の言語向けのWindows APIの慣用的な投影を作成することを目的としている。
Rust for Windowsは、windows
クレートから入手できる。
windowsクレートを使うと、APIを説明するメタデータから直接生成されたコードを使って、過去、現在、未来のWindows APIを呼び出すことができます。そして、Rustパッケージを直接呼び出すことができ、まるで別のRustモジュールであるかのように呼び出すことができます。
windows
クレートは、必要なすべてのWindows APIへのバインディングをその場で生成できる。 build.rs
ファイル内で必要なタイプを指定する。
fn main() {
windows::build!(
Windows::Data::Xml::Dom::*,
Windows::Win32::WindowsProgramming::CloseHandle,
Windows::Win32::WindowsAndMessaging::MessageBoxA,
Windows::Win32::SystemServices::{
CreateEventW, SetEvent, WaitForSingleObject
},
);
}
生成されたバインディングは、インポートしてRustソースファイルで使用できる。
mod bindings {
::windows::include_bindings!();
}
use bindings::{
Windows::Data::Xml::Dom::*,
Windows::Win32::SystemServices::{CreateEventW, SetEvent, WaitForSingleObject, PWSTR},
Windows::Win32::WindowsAndMessaging::{MessageBoxA, HWND, MESSAGEBOX_STYLE},
Windows::Win32::WindowsProgramming::CloseHandle,
};
Microsoftは、Direct2D、Microsoft.Web.WebView2.Core、Win2Dなど、さまざまなWindows APIを実行する多数のサンプルプログラムを提供している。さらに、Robert Mikhayelyan氏は、MinesweeperをWindows for Rustに移植した。
Rustは、win32metadata
から派生した最新の言語プロジェクションである。win32metadata
は、Windows APIプロジェクションの自動化を実現しただけでなく、uint
などの固有でない型を固有の列挙型に変換したり、HANDLE
やGDIオブジェクトなどの不透明な (opaque) 型を厳密に型指定された構造体に変換したりすることで、簡単に使えるよう取り組んでいる。
投影されたすべてのAPIに関するRustドキュメントを入手可能であり、Windows APIと型がどのように慣用的なRustに投影されているかを説明している。
前述のように、Rust for Windowsはまだプレビュー段階にある。プロジェクトはソースコードのバグを特定して修正するコントリビューションを歓迎する。