Module prelude

Expand description

Convenient re-exports of the most commonly used types and traits.

This module provides a curated selection of the most frequently used types from across the dotscope library, allowing for convenient glob imports.

§Architecture

The prelude follows Rust’s standard library pattern, re-exporting the most commonly used types and traits from various modules for convenient access.

§Key Components

§Usage Examples

use dotscope::prelude::*;

// Now you have access to the most common types
let assembly = CilObject::from_file("tests/samples/WindowsBase.dll".as_ref())?;
let methods = assembly.methods();

§Thread Safety

All re-exported types maintain their original thread safety guarantees. dotscope prelude for convenient .NET assembly analysis.

The dotscope prelude provides convenient access to the most commonly used types, traits, and functions for .NET assembly analysis. This module serves as a one-stop import for typical dotscope usage patterns, reducing the need for multiple individual imports and providing immediate access to essential functionality.

§Architecture

The prelude is organized into logical groups covering all major aspects of .NET metadata analysis, from high-level assembly loading to low-level metadata table access. This organization follows the typical workflow of .NET assembly analysis applications.

§Core Components

§Key Components

§Organized Import Groups

  • Core Types: Error handling, results, and main entry points
  • Type System: Complete type representation and resolution
  • Metadata Tables: High-level and raw table access
  • Signatures: Type and method signature parsing
  • Method Analysis: IL disassembly and method body analysis
  • Import/Export: Assembly dependency analysis
  • Streams and Headers: Low-level metadata structure access
  • Constants: Element types, attributes, and metadata identifiers

§Usage Examples

§Basic Assembly Analysis

use dotscope::prelude::*;

// Core functionality immediately available
let assembly = CilObject::from_file("example.dll".as_ref())?;
let types = assembly.types();

// Type system components
for entry in types.iter() {
    let cil_type = entry.value();
    match cil_type.flavor() {
        CilFlavor::Class => println!("Class: {}.{}", cil_type.namespace, cil_type.name),
        CilFlavor::Interface => println!("Interface: {}.{}", cil_type.namespace, cil_type.name),
        _ => {}
    }
}

§Method Analysis and Disassembly

use dotscope::prelude::*;

let assembly = CilObject::from_file("example.dll".as_ref())?;
let methods = assembly.methods();

for entry in methods.iter() {
    let method = entry.value();
    if let Some(body) = method.body.get() {
        if body.size_code > 0 {
            println!("Method {} has {} bytes of IL", method.name, body.size_code);
            println!("  Max stack: {}", body.max_stack);
             
            // Access disassembled instructions through blocks
            for (block_id, block) in method.blocks() {
                println!("  Block {}: {} instructions", block_id, block.instructions.len());
            }
        }
    }
}

§Metadata Table Access

use dotscope::prelude::*;

let assembly = CilObject::from_file("example.dll".as_ref())?;

// High-level table access
if let Some(assembly_info) = assembly.assembly() {
    println!("Assembly: {}", assembly_info.name);
    println!("Version: {}.{}.{}.{}",
             assembly_info.major_version, assembly_info.minor_version,
             assembly_info.build_number, assembly_info.revision_number);
}

// Token-based navigation
let typedef_token = Token::new(0x02000001);
if let Some(tables) = assembly.tables() {
    if let Some(typedef_table) = tables.table::<TypeDefRaw>(TableId::TypeDef) {
        let row_index = typedef_token.row();
        if let Some(typedef) = typedef_table.get(row_index) {
            println!("Type name index: {}", typedef.type_name);
        }
    }
}

§Integration

The prelude integrates components from across the dotscope ecosystem:

§Import Organization

The prelude is organized into logical sections for easy navigation:

  1. Core Types: Essential error handling and configuration
  2. Entry Points: Main interfaces for assembly loading and parsing
  3. Type System: Complete .NET type representation and resolution
  4. Metadata Tables: Both high-level and raw table access
  5. Signatures: Type and method signature parsing
  6. Method Analysis: IL analysis and method body parsing
  7. Disassembler: CIL instruction decoding and control flow
  8. Import/Export: Assembly dependency analysis
  9. Streams and Headers: Metadata storage structure access
  10. Constants: Type system and marshalling constants

§Thread Safety

Most types in the prelude are either Send + Sync or use interior mutability for thread-safe access. Reference-counted types (crate::metadata::typesystem::CilTypeRc, crate::metadata::method::MethodRc, etc.) enable safe sharing across threads without performance penalties.

§Standards Compliance

  • ECMA-335: Full compliance with .NET metadata specification
  • Type Safety: Strong typing throughout the API surface
  • Memory Safety: No unsafe code in public interfaces
  • Performance: Zero-cost abstractions and efficient data structures

Re-exports§

pub use crate::Error;
pub use crate::Result;
pub use crate::ValidationConfig;
pub use crate::CilObject;
pub use crate::File;
pub use crate::Parser;
pub use crate::metadata::token::Token;
pub use crate::metadata::root::CIL_HEADER_MAGIC;
pub use crate::metadata::imports::ImportType;
pub use crate::metadata::typesystem::CilFlavor;
pub use crate::metadata::typesystem::CilModifier;
pub use crate::metadata::typesystem::CilPrimitive;
pub use crate::metadata::typesystem::CilPrimitiveData;
pub use crate::metadata::typesystem::CilPrimitiveKind;
pub use crate::metadata::typesystem::CilType;
pub use crate::metadata::typesystem::CilTypeList;
pub use crate::metadata::typesystem::CilTypeRc;
pub use crate::metadata::typesystem::CilTypeRef;
pub use crate::metadata::typesystem::CilTypeRefList;
pub use crate::metadata::typesystem::CilTypeReference;
pub use crate::metadata::typesystem::TypeRegistry;
pub use crate::metadata::typesystem::TypeResolver;
pub use crate::metadata::typesystem::TypeSource;
pub use crate::metadata::tables::Assembly;
pub use crate::metadata::tables::AssemblyRc;
pub use crate::metadata::tables::AssemblyRef;
pub use crate::metadata::tables::AssemblyRefRc;
pub use crate::metadata::tables::Module;
pub use crate::metadata::tables::ModuleRc;
pub use crate::metadata::tables::ModuleRef;
pub use crate::metadata::tables::ModuleRefRc;
pub use crate::metadata::tables::ExportedType;
pub use crate::metadata::tables::ExportedTypeRc;
pub use crate::metadata::tables::Field;
pub use crate::metadata::tables::FieldLayout;
pub use crate::metadata::tables::FieldList;
pub use crate::metadata::tables::FieldMap;
pub use crate::metadata::tables::FieldPtr;
pub use crate::metadata::tables::FieldPtrList;
pub use crate::metadata::tables::FieldPtrMap;
pub use crate::metadata::tables::FieldPtrRc;
pub use crate::metadata::tables::FieldRc;
pub use crate::metadata::tables::MethodPtr;
pub use crate::metadata::tables::MethodPtrList;
pub use crate::metadata::tables::MethodPtrMap;
pub use crate::metadata::tables::MethodPtrRc;
pub use crate::metadata::tables::Param;
pub use crate::metadata::tables::ParamList;
pub use crate::metadata::tables::ParamPtr;
pub use crate::metadata::tables::ParamPtrList;
pub use crate::metadata::tables::ParamPtrMap;
pub use crate::metadata::tables::ParamPtrRc;
pub use crate::metadata::tables::ParamRc;
pub use crate::metadata::tables::Event;
pub use crate::metadata::tables::EventList;
pub use crate::metadata::tables::EventPtr;
pub use crate::metadata::tables::EventPtrList;
pub use crate::metadata::tables::EventPtrMap;
pub use crate::metadata::tables::EventPtrRc;
pub use crate::metadata::tables::EventRc;
pub use crate::metadata::tables::Property;
pub use crate::metadata::tables::PropertyList;
pub use crate::metadata::tables::PropertyPtr;
pub use crate::metadata::tables::PropertyPtrList;
pub use crate::metadata::tables::PropertyPtrMap;
pub use crate::metadata::tables::PropertyPtrRc;
pub use crate::metadata::tables::PropertyRc;
pub use crate::metadata::tables::InterfaceImpl;
pub use crate::metadata::tables::InterfaceImplRc;
pub use crate::metadata::tables::MemberRef;
pub use crate::metadata::tables::MemberRefRc;
pub use crate::metadata::tables::GenericParam;
pub use crate::metadata::tables::GenericParamConstraint;
pub use crate::metadata::tables::GenericParamConstraintRc;
pub use crate::metadata::tables::GenericParamList;
pub use crate::metadata::tables::GenericParamRc;
pub use crate::metadata::tables::MethodSpec;
pub use crate::metadata::tables::MethodSpecRc;
pub use crate::metadata::tables::CustomAttribute;
pub use crate::metadata::tables::CustomAttributeList;
pub use crate::metadata::tables::CustomAttributeRc;
pub use crate::metadata::tables::DeclSecurity;
pub use crate::metadata::tables::DeclSecurityRc;
pub use crate::metadata::tables::File as MetadataFile;
pub use crate::metadata::tables::FileRc;
pub use crate::metadata::tables::ManifestResource;
pub use crate::metadata::tables::ManifestResourceRc;
pub use crate::metadata::tables::StandAloneSig;
pub use crate::metadata::tables::StandAloneSigRc;
pub use crate::metadata::tables::AssemblyOsRaw;
pub use crate::metadata::tables::AssemblyProcessorRaw;
pub use crate::metadata::tables::AssemblyRaw;
pub use crate::metadata::tables::AssemblyRefOsRaw;
pub use crate::metadata::tables::AssemblyRefProcessorRaw;
pub use crate::metadata::tables::AssemblyRefRaw;
pub use crate::metadata::tables::ModuleRaw;
pub use crate::metadata::tables::ModuleRefRaw;
pub use crate::metadata::tables::ExportedTypeRaw;
pub use crate::metadata::tables::TypeDefRaw;
pub use crate::metadata::tables::TypeRefRaw;
pub use crate::metadata::tables::TypeSpecRaw;
pub use crate::metadata::tables::FieldLayoutRaw;
pub use crate::metadata::tables::FieldPtrRaw;
pub use crate::metadata::tables::FieldRaw;
pub use crate::metadata::tables::FieldRvaRaw;
pub use crate::metadata::tables::MethodDefRaw;
pub use crate::metadata::tables::MethodPtrRaw;
pub use crate::metadata::tables::ParamPtrRaw;
pub use crate::metadata::tables::ParamRaw;
pub use crate::metadata::tables::ClassLayoutRaw;
pub use crate::metadata::tables::ConstantRaw;
pub use crate::metadata::tables::CustomAttributeRaw;
pub use crate::metadata::tables::DeclSecurityRaw;
pub use crate::metadata::tables::EventMapRaw;
pub use crate::metadata::tables::EventPtrRaw;
pub use crate::metadata::tables::EventRaw;
pub use crate::metadata::tables::FieldMarshalRaw;
pub use crate::metadata::tables::GenericParamConstraintRaw;
pub use crate::metadata::tables::GenericParamRaw;
pub use crate::metadata::tables::ImplMapRaw;
pub use crate::metadata::tables::InterfaceImplRaw;
pub use crate::metadata::tables::ManifestResourceRaw;
pub use crate::metadata::tables::MemberRefRaw;
pub use crate::metadata::tables::MethodImplRaw;
pub use crate::metadata::tables::MethodSemanticsRaw;
pub use crate::metadata::tables::MethodSpecRaw;
pub use crate::metadata::tables::NestedClassRaw;
pub use crate::metadata::tables::PropertyMapRaw;
pub use crate::metadata::tables::PropertyPtrRaw;
pub use crate::metadata::tables::PropertyRaw;
pub use crate::metadata::tables::StandAloneSigRaw;
pub use crate::metadata::tables::FileRaw;
pub use crate::metadata::signatures::SignatureArray;
pub use crate::metadata::signatures::SignatureField;
pub use crate::metadata::signatures::SignatureLocalVariable;
pub use crate::metadata::signatures::SignatureLocalVariables;
pub use crate::metadata::signatures::SignatureMethod;
pub use crate::metadata::signatures::SignatureMethodSpec;
pub use crate::metadata::signatures::SignatureParameter;
pub use crate::metadata::signatures::SignaturePointer;
pub use crate::metadata::signatures::SignatureProperty;
pub use crate::metadata::signatures::SignatureSzArray;
pub use crate::metadata::signatures::SignatureTypeSpec;
pub use crate::metadata::signatures::TypeSignature;
pub use crate::metadata::signatures::parse_field_signature;
pub use crate::metadata::signatures::parse_local_var_signature;
pub use crate::metadata::signatures::parse_method_signature;
pub use crate::metadata::signatures::parse_method_spec_signature;
pub use crate::metadata::signatures::parse_property_signature;
pub use crate::metadata::signatures::parse_type_spec_signature;
pub use crate::metadata::tables::MemberRefSignature;
pub use crate::metadata::method::ExceptionHandler;
pub use crate::metadata::method::ExceptionHandlerFlags;
pub use crate::metadata::method::InstructionIterator;
pub use crate::metadata::method::Method;
pub use crate::metadata::method::MethodBody;
pub use crate::metadata::method::MethodImplCodeType;
pub use crate::metadata::method::MethodImplManagement;
pub use crate::metadata::method::MethodImplOptions;
pub use crate::metadata::method::MethodList;
pub use crate::metadata::method::MethodMap;
pub use crate::metadata::method::MethodModifiers;
pub use crate::metadata::method::MethodRc;
pub use crate::metadata::method::MethodRef;
pub use crate::metadata::method::MethodRefList;
pub use crate::disassembler::decode_blocks;
pub use crate::disassembler::decode_instruction;
pub use crate::disassembler::decode_stream;
pub use crate::disassembler::BasicBlock;
pub use crate::disassembler::FlowType;
pub use crate::disassembler::Immediate;
pub use crate::disassembler::Instruction;
pub use crate::disassembler::InstructionCategory;
pub use crate::disassembler::Operand;
pub use crate::disassembler::OperandType;
pub use crate::disassembler::StackBehavior;
pub use crate::metadata::exports::Exports;
pub use crate::metadata::imports::Import;
pub use crate::metadata::imports::ImportContainer;
pub use crate::metadata::imports::ImportRc;
pub use crate::metadata::imports::Imports;
pub use crate::metadata::streams::Blob;
pub use crate::metadata::streams::Guid;
pub use crate::metadata::streams::Strings;
pub use crate::metadata::streams::UserStrings;
pub use crate::metadata::streams::BlobIterator;
pub use crate::metadata::streams::GuidIterator;
pub use crate::metadata::streams::StringsIterator;
pub use crate::metadata::streams::UserStringsIterator;
pub use crate::metadata::streams::StreamHeader;
pub use crate::metadata::streams::TablesHeader;
pub use crate::metadata::cor20header::Cor20Header;
pub use crate::metadata::root::Root;
pub use crate::metadata::tables::EventAttributes;
pub use crate::metadata::tables::FieldAttributes;
pub use crate::metadata::tables::FileAttributes;
pub use crate::metadata::tables::ParamAttributes;
pub use crate::metadata::tables::PropertyAttributes;
pub use crate::metadata::tables::TypeAttributes;
pub use crate::metadata::typesystem::ELEMENT_TYPE;
pub use crate::metadata::marshalling::NATIVE_TYPE;
pub use crate::metadata::marshalling::VARIANT_TYPE;
pub use crate::metadata::tables::TableId;
pub use crate::metadata::tables::CodedIndex;
pub use crate::metadata::tables::CodedIndexType;
pub use crate::metadata::tables::MetadataTable;
pub use crate::metadata::tables::TableInfo;
pub use crate::metadata::tables::TableInfoRef;