Struct MemberRefBuilder
pub struct MemberRefBuilder { /* private fields */ }Expand description
Builder for creating MemberRef metadata entries.
MemberRefBuilder provides a fluent API for creating MemberRef table entries
with validation and automatic heap management. Member references define external
member access patterns enabling cross-assembly interoperability, late binding,
dynamic member access, and generic type instantiation scenarios.
§Member Reference Model
.NET member references follow a standard pattern:
- Declaring Context: The type, module, or method that declares the member
- Member Identity: The name and signature that uniquely identifies the member
- Signature Information: Type information for proper invocation and access
- External Resolution: Runtime resolution to actual implementation
§Coded Index Types
Member references use the MemberRefParent coded index to specify the declaring context:
- TypeDef: Members declared in current assembly types
- TypeRef: Members declared in external assembly types
- ModuleRef: Global members declared in external modules
- MethodDef: Vararg method signatures referencing specific methods
- TypeSpec: Members of generic type instantiations
§Member Types
Member references support two fundamental member types:
- Method References: Constructor calls, method invocations, function pointers
- Field References: Field access, property backing fields, static data
§Examples
let assembly = CilAssembly::new(view);
let mut context = BuilderContext::new(assembly);
// Create a method reference to external assembly
let external_type = CodedIndex::new(TableId::TypeRef, 1, CodedIndexType::MemberRefParent); // System.String from mscorlib
let method_signature = &[0x20, 0x01, 0x01, 0x0E]; // Default instance method, 1 param, void return, string param
let string_concat_ref = MemberRefBuilder::new()
.class(external_type.clone())
.name("Concat")
.signature(method_signature)
.build(&mut context)?;
// Create a field reference to external type
let field_signature = &[0x06, 0x08]; // Field signature, int32 type
let field_ref = MemberRefBuilder::new()
.class(external_type.clone())
.name("Length")
.signature(field_signature)
.build(&mut context)?;
// Create a constructor reference
let ctor_signature = &[0x20, 0x01, 0x01, 0x1C]; // Default instance method, 1 param, void return, object param
let ctor_ref = MemberRefBuilder::new()
.class(external_type)
.name(".ctor")
.signature(ctor_signature)
.build(&mut context)?;Implementations§
§impl MemberRefBuilder
impl MemberRefBuilder
pub fn new() -> Self
pub fn new() -> Self
Creates a new MemberRefBuilder.
§Returns
A new crate::metadata::tables::memberref::MemberRefBuilder instance ready for configuration.
pub fn class(self, class: CodedIndex) -> Self
pub fn class(self, class: CodedIndex) -> Self
Sets the declaring class, module, or method for this member reference.
The class must be a valid MemberRefParent coded index that references
the context where this member is declared. This establishes the scope
for member resolution and access validation.
Valid class types include:
TypeDef- Members declared in current assembly typesTypeRef- Members declared in external assembly typesModuleRef- Global members declared in external modulesMethodDef- Vararg method signatures referencing specific methodsTypeSpec- Members of generic type instantiations
§Arguments
class- AMemberRefParentcoded index pointing to the declaring context
§Returns
Self for method chaining.
pub fn name(self, name: impl Into<String>) -> Self
pub fn name(self, name: impl Into<String>) -> Self
Sets the member name for identification and access.
Member names are used for resolution, binding, and reflection operations. Common naming patterns include:
- Standard method names: “ToString”, “GetHashCode”, “Equals”
- Constructor names: “.ctor” (instance), “.cctor” (static)
- Field names: “value__” (enum backing), descriptive identifiers
- Property accessor names: “get_PropertyName”, “set_PropertyName”
§Arguments
name- The member name (must be a valid identifier)
§Returns
Self for method chaining.
pub fn signature(self, signature: &[u8]) -> Self
pub fn signature(self, signature: &[u8]) -> Self
Sets the member signature for type information and calling conventions.
The signature defines the member’s type structure using ECMA-335 signature encoding. The signature format depends on the member type being referenced.
Method signature patterns:
[0x20, 0x00, 0x01]- Default instance method, no params, void return[0x00, 0x01, 0x08, 0x08]- Static method, 1 param, int32 return, int32 param[0x20, 0x02, 0x0E, 0x08, 0x1C]- Instance method, 2 params, string return, int32+object params
Field signature patterns:
[0x06, 0x08]- Field signature, int32 type[0x06, 0x0E]- Field signature, string type[0x06, 0x1C]- Field signature, object type
§Arguments
signature- The member signature bytes
§Returns
Self for method chaining.
pub fn build(self, context: &mut BuilderContext) -> Result<Token>
pub fn build(self, context: &mut BuilderContext) -> Result<Token>
Builds the member reference and adds it to the assembly.
This method validates all required fields are set, adds the name and signature to the appropriate heaps, creates the raw member reference structure, and adds it to the MemberRef table.
§Arguments
context- The builder context for managing the assembly
§Returns
A crate::metadata::token::Token representing the newly created member reference, or an error if
validation fails or required fields are missing.
§Errors
- Returns error if class is not set
- Returns error if name is not set
- Returns error if signature is not set
- Returns error if class is not a valid MemberRefParent coded index
- Returns error if heap operations fail
- Returns error if table operations fail
Trait Implementations§
Auto Trait Implementations§
impl Freeze for MemberRefBuilder
impl RefUnwindSafe for MemberRefBuilder
impl Send for MemberRefBuilder
impl Sync for MemberRefBuilder
impl Unpin for MemberRefBuilder
impl UnwindSafe for MemberRefBuilder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more