private void MutateMetadata()
        {
            foreach (KeyValuePair <IMemberRef, uint> mdRef in this.rt.Descriptor.Data.refMap)
            {
                mdRef.Key.Rid = this.rtMD.GetToken(mdRef.Key).Rid;
            }

            foreach (VM.DataDescriptor.FuncSigDesc sig in this.rt.Descriptor.Data.sigs)
            {
                VM.FuncSig funcSig = sig.FuncSig;

                foreach (ITypeDefOrRef paramType in funcSig.ParamSigs)
                {
                    paramType.Rid = this.rtMD.GetToken(paramType).Rid;
                }

                funcSig.RetType.Rid = this.rtMD.GetToken(funcSig.RetType).Rid;
            }
        }
        private void ImportReferences(ModuleDef module)
        {
            var refCopy = this.rt.Descriptor.Data.refMap.ToList();

            this.rt.Descriptor.Data.refMap.Clear();
            foreach (KeyValuePair <IMemberRef, uint> mdRef in refCopy)
            {
                object item;
                if (mdRef.Key is ITypeDefOrRef)
                {
                    item = module.Import((ITypeDefOrRef)mdRef.Key);
                }
                else if (mdRef.Key is MemberRef)
                {
                    item = module.Import((MemberRef)mdRef.Key);
                }
                else if (mdRef.Key is MethodDef)
                {
                    item = module.Import((MethodDef)mdRef.Key);
                }
                else if (mdRef.Key is MethodSpec)
                {
                    item = module.Import((MethodSpec)mdRef.Key);
                }
                else if (mdRef.Key is FieldDef)
                {
                    item = module.Import((FieldDef)mdRef.Key);
                }
                else
                {
                    item = mdRef.Key;
                }
                this.rt.Descriptor.Data.refMap.Add((IMemberRef)item, mdRef.Value);
            }
            foreach (VM.DataDescriptor.FuncSigDesc sig in this.rt.Descriptor.Data.sigs)
            {
                MethodSig  methodSig = sig.Signature;
                VM.FuncSig funcSig   = sig.FuncSig;

                if (methodSig.HasThis)
                {
                    funcSig.Flags |= this.rt.Descriptor.Runtime.RTFlags.INSTANCE;
                }

                var paramTypes = new List <ITypeDefOrRef>();
                if (methodSig.HasThis && !methodSig.ExplicitThis)
                {
                    IType thisType;
                    if (sig.DeclaringType.IsValueType)
                    {
                        thisType = module.Import(new ByRefSig(sig.DeclaringType.ToTypeSig()).ToTypeDefOrRef());
                    }
                    else
                    {
                        thisType = module.Import(sig.DeclaringType);
                    }
                    paramTypes.Add((ITypeDefOrRef)thisType);
                }
                foreach (TypeSig param in methodSig.Params)
                {
                    var paramType = (ITypeDefOrRef)module.Import(param.ToTypeDefOrRef());
                    paramTypes.Add(paramType);
                }
                funcSig.ParamSigs = paramTypes.ToArray();

                var retType = (ITypeDefOrRef)module.Import(methodSig.RetType.ToTypeDefOrRef());
                funcSig.RetType = retType;
            }
        }