@microsoft/dynwinrt
v0.1.0-preview.6
Published
Dynamic WinRT bindings for Node.js — call any Windows Runtime API without native code generation
Downloads
1,001
Readme
@microsoft/dynwinrt
Call any Windows Runtime (WinRT) API from JavaScript — without writing a native addon.
dynwinrt is a runtime library that lets your Node.js or Electron code call modern Windows APIs (WinAppSDK, Windows AI, notifications, file pickers, sensors, storage, networking, …) directly from JavaScript / TypeScript, with full IntelliSense, no MSBuild step, no C++ or C# project, and no per-Windows-version recompile.
Why use this?
If you've ever tried to call a Windows API from an Electron or Node app, you've probably run into one of these:
- Writing a C++
node-addon-apiaddon. Needsnode-gyp, MSVC, Python, the right Windows SDK, and a CI matrix per Electron version. - Writing a C# addon via
node-api-dotnet. Needs the .NET SDK, a separatecsprojbuild step, and a manually-maintained C# wrapper for every API surface you want to expose. - Waiting for a typed projection. Some Windows APIs ship
.winmdmetadata months before any JavaScript-friendly projection appears in a published package.
dynwinrt removes all of that. It reads the .winmd metadata that ships with the Windows SDK (and WinAppSDK NuGet packages) at runtime, resolves the COM vtables, and invokes WinRT methods dynamically. There is no native build step in your Electron project. There is no version pinning — the same generated bindings work across Windows SDK / WinAppSDK revisions as long as the metadata is forward-compatible. You just install @microsoft/dynwinrt from npm and call the API.
The trade-off: dynwinrt is designed for data-style WinRT APIs (AI, storage, notifications, networking, globalization, …). It is not intended for XAML / WinUI hosting — those scenarios need composable-class aggregation and a UI thread the library doesn't model. For everything else, this is the easiest path from JavaScript to native Windows.
Quick start
@microsoft/dynwinrt is the runtime. You generate the typed bindings ahead of time with @microsoft/dynwinrt-codegen, then import them at runtime:
npm install @microsoft/dynwinrt
npm install -D @microsoft/dynwinrt-codegen
# Generate a binding for Windows.Foundation.Uri
npx dynwinrt-codegen generate \
--namespace Windows.Foundation \
--class-name Uri \
--output ./generatedconst { roInitialize } = require('@microsoft/dynwinrt');
const { Uri } = require('./generated');
roInitialize(1); // MTA
const uri = Uri.createUri('https://example.com/path?q=1');
console.log(uri.host); // "example.com"
console.log(uri.port); // 443Platform support
- Windows 10 / 11 — x64 and arm64 native binaries shipped via
napi-rsprebuilds - Node.js ≥ 16 (Electron, plain Node, vscode extensions, …)
Links
- 📦
@microsoft/dynwinrt-codegen— the typed-binding generator - 🐛 Source on GitHub — issues, contributions, internal design docs
