Swift/WinRT

CI Status

连接到 WinRT (Windows 运行时) 以便在 Swift 中使用。

示例

调用 Windows 运行时的基本同步调用

import WinRT

do {
  RoInitialize()

  // https://docs.microsoft.com/en-us/uwp/api/Windows.System.Profile.SystemIdentification?view=winrt-17763
  let buffer =
      Windows.System.Profile.SystemIdentification.GetSystemIdForPublisher()

  // https://docs.microsoft.com/en-us/uwp/api/Windows.Security.Cryptography.CryptographicBuffer?view=winrt-17763
  print(Windows.Security.Cryptography.CryptographicBuffer.EncodeToHexString(buffer.Id))
} catch let error {
  print(error)
}

调用 Windows 运行时的基本异步调用

import WinRT

@main
struct Asynchronous {
  public static func main() async throws {
    try RoInitialize()
    let controller =
        try Windows.System.DispatcherQueueController.CreateOnDedicatedThread()
    try await controller.ShutdownQueue()
  }
}

构建要求

1 目前不支持稳定版本,因为它们是从发布分支构建的,而此项目需要 main 分支的最新开发快照。

构建

此项目需要最新的 Swift 快照版本(2021 年 3 月 21 日或更新的版本)。 您可以使用 swift.org 中的快照二进制文件,或者从 Azure 下载每日构建版本。

调试

由于代码与系统代码高度交织,并且调用堆栈在 C++、C 和 Swift 部分之间过度调用,因此 Swift/WinRT 的调试非常复杂。 大多数问题往往发生在系统的 Swift 和 C/C++ 方面之间。 使用 WinDBG 可以最有效地调试它。 以下内容将为 Swift 代码启用 CodeView 调试信息生成,从而在使用 WinDBG 时提供更好的体验

swift build -Xswiftc -g -Xswiftc -debug-info-format=codeview -Xlinker -debug

对于使用 lldb 进行调试,您可以使用以下命令行来确保正确发出 DWARF 数据

swift build -Xlinker -debug:dwarf

关于 Swift/WinRT

这个项目是高度实验性的。 它旨在成为一个试验 COM 接口如何暴露以及 Win/RT 接口的试验场。 它是从 Swift/COM 中获得的经验教训建模而来。

这些文件被分成它们连接的类型的名称,但仅提供最少量的语法糖:通过 WinRT.Error 类型将 HRESULT 返回值映射到 Swift.Error。 此外,对于有意义的情况,会在单独的文件中添加额外的语法糖,该文件附加了 +Swift 后缀。

长期目标是生成不带后缀的文件,可以通过代码生成或通过改进 Swift 编译器的“ClangImporter”来实现。 成熟的 C++ 支持还应该提供一种更简单的方式,可以通过它来桥接这些类型,而无需通过 C ABI 层。