tristanlabelle / swift-winrt

A Swift Projection for WinRT APIs
MIT License
20 stars 2 forks source link
swift uwp winrt

Swift/WinRT

Build & test workflow status

A Swift projection for WinRT APIs, written in pure Swift, for consuming modern Windows Runtime APIs, the Windows App SDK, WinUI and arbitrary WinRT components.

Swift/WinRT includes:

For examples of using projections, refer to interop tests.

This project was inspired by its C++ namesake at thebrowsercompany/swift-winrt.

Using in your project

Note: Swift/WinRT requires Swift 5.10 or above due to uses of non-copyable types which crash the Swift 5.9 compiler.

With CMake

Setup your project's build to:

  1. Download the latest NuGet package from this repo's Releases. Eventually those will be pushed to nuget.org.
  2. Invoke the SwiftWinRT.exe located in the NuGet package, specifying:
    • The Windows SDK and WinMD files to be projected.
    • A Projection.json file to describe the modules to generate, which assemblies should contribute to each of them, and which types to include. Refer to this example or the schema.
    • An output directory path.
  3. Reference and build the support module under the swift subdirectory of the NuGet package.
  4. Reference and build the generated code modules. For each module specified in Projection.json, there should be an assembly module (with projected types), an ABI module (with C code) and any number of namespace modules (with type aliases for convenience).

With the Swift Package Manager (SPM)

SPM cannot integrate arbitrary build steps needed for fully integrating Swift/WinRT code generation in your build. Alternatives:

When invoking SwiftWinRT.exe, specify to generate a Package.swift file that references the swift subdirectory of the NuGet package as the support module location, or reference it from this repository.

Feature set

Swift/WinRT should support the majority of WinRT interop scenarios thanks to the following features:

Design philosophy