#ecma-335 #dotnet #clr #metadata #msil

clrmeta

ECMA-335 CLI/.NET metadata parsing library with read/write support

1 unstable release

Uses new Rust 2024

new 0.1.0 Feb 14, 2026

#3 in #clr

MIT license

225KB
5K SLoC

clrmeta

ECMA-335 CLI/.NET metadata parsing library for Rust.

Crates.io Documentation License: MIT

Installation

Add to your Cargo.toml:

[dependencies]
clrmeta = "0.1"

Features

  • Parse BSJB metadata root and stream headers
  • Access heaps: #Strings, #US, #GUID, #Blob
  • Parse metadata tables: Module, TypeDef, TypeRef, MethodDef, Assembly, AssemblyRef, etc.
  • High-level API for common queries (assembly info, types, methods)
  • No PE dependency - works with raw metadata bytes

Usage

use clrmeta::Metadata;

// Parse metadata from raw bytes (e.g., from PE's CLR data directory)
let metadata = Metadata::parse(&metadata_bytes)?;

println!("Runtime version: {}", metadata.version());

if let Some(assembly) = metadata.assembly() {
    println!("Assembly: {} v{}.{}.{}.{}",
        assembly.name,
        assembly.version.0, assembly.version.1,
        assembly.version.2, assembly.version.3);
}

for type_def in metadata.types() {
    println!("Type: {}", type_def.full_name());
}

Integration with portex

This crate is designed to work with portex for parsing .NET assemblies from PE files:

use portex::PE;
use clrmeta::Metadata;

let pe = PE::from_file("example.exe")?;

if let Some(cli_header) = pe.cli_header()? {
    let metadata_bytes = pe.read_at_rva(
        cli_header.metadata_rva,
        cli_header.metadata_size as usize
    ).unwrap();
    
    let metadata = Metadata::parse(metadata_bytes)?;
    // ...
}

References

License

MIT

Dependencies

~150–540KB
~13K SLoC