1 unstable release
Uses new Rust 2024
| new 0.1.0 | Feb 14, 2026 |
|---|
#3 in #clr
225KB
5K
SLoC
clrmeta
ECMA-335 CLI/.NET metadata parsing library for Rust.
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