winmd 7.0.1
winmd: ^7.0.1 copied to clipboard
Inspect and generate Windows Metadata (.winmd) files based on the ECMA-335 standard.
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
⚡ 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.