in ILRepack/RepackImporter.cs [374:439]
private void CloneTo(MethodDefinition meth, TypeDefinition type, bool typeJustCreated)
{
// ignore duplicate method for merged duplicated types
if (!typeJustCreated &&
type.Methods.Count > 0 &&
type.Methods.Any(x =>
(x.Name == meth.Name) &&
(x.Parameters.Count == meth.Parameters.Count) &&
(x.ToString() == meth.ToString()))) // TODO: better/faster comparation of parameter types?
{
_logger.DuplicateIgnored("method", meth);
return;
}
// use void placeholder as we'll do the return type import later on (after generic parameters)
MethodDefinition nm = new MethodDefinition(meth.Name, meth.Attributes, _repackContext.TargetAssemblyMainModule.TypeSystem.Void);
nm.ImplAttributes = meth.ImplAttributes;
if (meth.DebugInformation.HasCustomDebugInformations)
nm.DebugInformation.CustomDebugInformations.AddRange(meth.DebugInformation.CustomDebugInformations);
if (meth.DebugInformation.HasSequencePoints)
nm.DebugInformation.SequencePoints.AddRange(meth.DebugInformation.SequencePoints);
type.Methods.Add(nm);
CopyGenericParameters(meth.GenericParameters, nm.GenericParameters, nm);
if (meth.HasPInvokeInfo)
{
if (meth.PInvokeInfo == null)
{
// Even if this was allowed, I'm not sure it'd work out
//nm.RVA = meth.RVA;
}
else
{
nm.PInvokeInfo = new PInvokeInfo(meth.PInvokeInfo.Attributes, meth.PInvokeInfo.EntryPoint, meth.PInvokeInfo.Module);
}
}
foreach (ParameterDefinition param in meth.Parameters)
CloneTo(param, nm, nm.Parameters);
foreach (MethodReference ov in meth.Overrides)
nm.Overrides.Add(Import(ov, nm));
CopySecurityDeclarations(meth.SecurityDeclarations, nm.SecurityDeclarations, nm);
CopyCustomAttributes(meth.CustomAttributes, nm.CustomAttributes, nm);
nm.ReturnType = Import(meth.ReturnType, nm);
nm.MethodReturnType.Attributes = meth.MethodReturnType.Attributes;
if (meth.MethodReturnType.HasConstant)
nm.MethodReturnType.Constant = meth.MethodReturnType.Constant;
if (meth.MethodReturnType.HasMarshalInfo)
nm.MethodReturnType.MarshalInfo = meth.MethodReturnType.MarshalInfo;
if (meth.MethodReturnType.HasCustomAttributes)
CopyCustomAttributes(meth.MethodReturnType.CustomAttributes, nm.MethodReturnType.CustomAttributes, nm);
if (meth.HasBody)
CloneTo(meth.Body, nm);
meth.Body = null; // frees memory
nm.IsAddOn = meth.IsAddOn;
nm.IsRemoveOn = meth.IsRemoveOn;
nm.IsGetter = meth.IsGetter;
nm.IsSetter = meth.IsSetter;
nm.CallingConvention = meth.CallingConvention;
}