writeAssemblyRef method

AssemblyRefIndex writeAssemblyRef({
  1. required String namespace,
})

Adds an AssemblyRef row representing the given namespace to the file, returning its row index.

This method generates a synthetic AssemblyRef for every two-level namespace (e.g., Windows.Foundation) to avoid requiring full assembly resolution. Namespaces starting with System are mapped to mscorlib.

Note that when toBytes is called, the redundant AssemblyRef rows will be removed and the TypeRef resolution scopes will be updated to point to the Module instead of the AssemblyRef.

Implementation

AssemblyRefIndex writeAssemblyRef({required String namespace}) {
  final rootNamespace = namespace.split('.').take(2).join('.');

  // Use a shared reference for System.*
  if (_assemblyRefs.isNotEmpty && rootNamespace.startsWith('System')) {
    return _assemblyRefs['System']!;
  }

  // Return existing reference if present
  if (_assemblyRefs[rootNamespace] case final existing?) return existing;

  final table = _tableStream[MetadataTableId.assemblyRef];
  final index = AssemblyRefIndex(table.length);

  final assemblyRef = rootNamespace.startsWith('System')
      ? AssemblyRef(
          name: _stringHeap.insert('mscorlib'),
          majorVersion: 4,
          publicKeyOrToken: _blobHeap.insert(
            Uint8List.fromList([
              0xB7, 0x7A, 0x5C, 0x56, 0x19, 0x34, 0xE0, 0x89, //
            ]),
          ),
        )
      : AssemblyRef(
          name: _stringHeap.insert(rootNamespace),
          majorVersion: 0xFF,
          minorVersion: 0xFF,
          buildNumber: 0xFF,
          revisionNumber: 0xFF,
          flags: AssemblyFlags.windowsRuntime,
        );
  table.add(assemblyRef);

  _assemblyRefs[rootNamespace.startsWith('System')
          ? 'System'
          : rootNamespace] =
      index;

  return index;
}