ci codecov Package: winmd Publisher: halildurmus.dev Language: Dart License: BSD-3-Clause

Inspect and generate Windows Metadata (.winmd) files based on the ECMA-335 standard.

package:winmd provides both low-level primitives and high-level abstractions for working with .winmd files. It is a core component of Dart-based Windows interop tooling — most notably powering package:win32.

✨ Features

  • Parse .winmd files into rich, strongly-typed Dart object models
  • Query type definitions, methods, fields, and more across multiple metadata sources
  • Resolve symbols quickly without knowing their namespace up front
  • Merge multiple .winmd files into a single, unified file
  • Generate .winmd files programmatically from scratch
  • Cross-platform — works on Windows, Linux, and macOS

🚀 Getting Started

Add the package to your pubspec.yaml:

dependencies:
  winmd: ^7.0.2

Then import it:

import 'package:winmd/winmd.dart';

⚡ Quick Example

The example below loads WinRT metadata from a .winmd file and inspects a class and an enum:

import 'dart:io' as io;

import 'package:winmd/winmd.dart';

void main() {
  // Load WinRT metadata from a local .winmd file.
  const winmdPath = r'C:\WINDOWS\System32\WinMetadata\Windows.Storage.winmd';
  final bytes = io.File(winmdPath).readAsBytesSync();
  final reader = MetadataReader.read(bytes);
  final index = MetadataIndex.fromReader(reader);

  // Optional: Use MetadataLookup for efficient type resolution by name.
  // This is especially helpful when the namespace of the target type is
  // unknown.
  final metadata = MetadataLookup(index);

  // Lookup a WinRT class (e.g., StorageFile) and list its public methods.
  final storageFile = metadata.findSingleTypeByName('StorageFile');
  print('WinRT class "${storageFile.name}" has the following methods:');
  for (final method in storageFile.methods) {
    print('  ${method.name}');
  }
  print('');

  // Lookup a WinRT enum (e.g., FileAttributes) and display its members.
  final enumType = metadata.findSingleTypeByName('FileAttributes');
  print('WinRT enum "${enumType.name}" has the following fields:');

  // The first field represents the underlying integral type (e.g., Int32).
  final underlyingType = enumType.fields.first;
  print('  ${underlyingType.name} = ${underlyingType.signature.type}');

  // Subsequent fields are named values within the enum.
  for (final field in enumType.fields.skip(1)) {
    print('  ${field.name} = ${field.constant?.value}');
  }
}

📝 Documentation

Full API reference is available here:

👉 API Reference.

Additional usage examples are located in the example directory.

🐞 Features and Bugs

If you encounter bugs or need additional functionality, please file an issue.

Libraries

mdmerge
Provides the mdmerge function, which reads and consolidates type definitions, methods, fields, attributes, and related metadata from multiple Windows Metadata (.winmd) files or directories containing .winmd files, producing a single, unified metadata file.
windows_metadata
Provides high-level APIs for discovering, downloading, caching, and loading Windows Metadata (.winmd) files for use in Dart-based tooling.
winmd
A WinMD parser based on the ECMA-335 standard.
writer
A basic WinMD writer based on the ECMA-335 standard.