winmd 0.2.0-dev.4 winmd: ^0.2.0-dev.4 copied to clipboard
A Dart library for working with Windows Metadata (winmd) formats.
This package provides a Dart abstraction over Windows metadata files, making it possible to load them and build Dart FFI interop libraries from the results.
Architecture #
Usage (Windows Runtime) #
A simple example: loading the IAsyncInfo interface and emitting the Dart equivalent file.
import 'package:winmd/winmd.dart';
final type = 'Windows.Foundation.IAsyncInfo';
final mdTypeDef = WinmdStore.getMetadataForType(type);
final projection = TypeBuilder.projectWinMdType(mdTypeDef);
final dartClass = TypePrinter.printType(projection);
final outputFilename = type.split('.').last;
final outputFile =
File('${outputDirectory.uri.toFilePath()}$outputFilename.dart');
print('Writing: ${outputFile.path}');
outputFile.writeAsStringSync(dartClass);
Usage (Win32) #
Load all the methods from the GDI namespace and print out some metadata.
import 'package:winmd/winmd.dart';
void main() {
// Load WinMD metadata for Win32, as produced by the following utility:
// https://github.com/microsoft/win32metadata
final scope = WinmdStore.getScopeForFile('Windows.Win32.winmd');
// Find the GDI API namesapce
final gdiApi =
scope.typeDefs.firstWhere((type) => type.typeName.endsWith('Gdi.Apis'));
// Sort the functions alphabetically
final sortedMethods = gdiApi.methods
..sort((a, b) => a.methodName.compareTo(b.methodName));
// Find a specific function
const funcName = 'AddFontResourceW';
final winmdMethod = sortedMethods.firstWhere((m) => m.methodName == funcName);
// Print out some information about it
print('This method is token #${winmdMethod.token}');
final params = winmdMethod.parameters
.map((param) => '${param.typeIdentifier.nativeType} ${param.name!}')
.join(', ');
print('The parameters are:\n$params');
}
Features and bugs #
Please file feature requests and bugs at the issue tracker.