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
.winmdfiles 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
.winmdfiles into a single, unified file - Generate
.winmdfiles 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:
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.winmdfiles, 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-335standard.