winmd 7.0.0 copy "winmd: ^7.0.0" to clipboard
winmd: ^7.0.0 copied to clipboard

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

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

A Dart package for parsing, analyzing, and producing Windows Metadata (.winmd) files, based on the ECMA-335 standard.

This package offers both low-level primitives and high-level abstractions for inspecting and generating Windows Metadata (.winmd) files. It is a vital component of Dart-based Windows interop tooling — powering packages like win32.

Key Features #

  • Parse .winmd files into rich, strongly-typed Dart object models
  • Query type definitions, methods, fields, and more across multiple metadata sources
  • Perform fast, namespace-agnostic symbol resolution
  • Merge multiple .winmd files into a single, unified file
  • Generate your own .winmd files programmatically
  • Works on Windows, Linux, and macOS

Usage #

A basic example demonstrating how to load and inspect WinRT metadata from a .winmd file:

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}');
  }
}

More examples can be found in the example subdirectory.

Feature requests and bugs #

Please file feature requests and bugs at the issue tracker.

10
likes
160
points
735
downloads

Publisher

verified publisherhalildurmus.dev

Weekly Downloads

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

Repository (GitHub)
View/report issues
Contributing

Topics

#winmd #windows #metadata

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

archive, ffi, logging, meta, nuget, path

More

Packages that depend on winmd