in ILRepack/Steps/ReferencesFixStep.cs [40:81]
public void Perform()
{
_logger.Info("Fixing references");
var fixator = new ReferenceFixator(_logger, _repackContext);
if (_repackContext.PrimaryAssemblyMainModule.EntryPoint != null)
{
_repackContext.TargetAssemblyMainModule.EntryPoint = fixator.Fix(
_repackImporter.Import(_repackContext.PrimaryAssemblyDefinition.EntryPoint)).Resolve();
}
var targetAssemblyMainModule = _repackContext.TargetAssemblyMainModule;
// this step travels through all TypeRefs & replaces them by matching TypeDefs
foreach (var r in targetAssemblyMainModule.Types)
{
_logger.Verbose($"- Fixing references for type {r}");
fixator.FixReferences(r);
}
foreach (var r in targetAssemblyMainModule.Types)
{
fixator.FixMethodVisibility(r);
}
fixator.FixReferences(_repackContext.TargetAssemblyDefinition.MainModule.ExportedTypes);
fixator.FixReferences(_repackContext.TargetAssemblyDefinition.CustomAttributes);
fixator.FixReferences(_repackContext.TargetAssemblyDefinition.SecurityDeclarations);
fixator.FixReferences(targetAssemblyMainModule.CustomAttributes);
// final reference cleanup (Cecil Import automatically added them)
foreach (AssemblyDefinition asm in _repackContext.MergedAssemblies)
{
foreach (var refer in targetAssemblyMainModule.AssemblyReferences.ToArray())
{
// remove all referenced assemblies with same name, as we didn't bother on the version when merging
// in case we reference same assemblies with different versions, there might be prior errors if we don't merge the 'largest one'
if (_options.KeepOtherVersionReferences ? refer.FullName == asm.FullName : refer.Name == asm.Name.Name)
{
targetAssemblyMainModule.AssemblyReferences.Remove(refer);
}
}
}
}