protected override IStepContext Execute()
        {
            TypeDefinition    corLibType        = base.OperationContext.GetCorLibType("System.Single");
            MetadataContainer metadataContainer = base.OperationContext.MetadataContainer;

            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.Boolean"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.Byte"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.Char"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.Collections.IEnumerator"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.Double"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.Enum"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.IDisposable"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.Int16"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.Int32"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.Int64"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.IntPtr"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.MulticastDelegate"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.Object"));
            metadataContainer.AddType(corLibType);
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.String"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.UInt16"));
            metadataContainer.AddType(base.OperationContext.GetCorLibType("System.UInt32"));
            metadataContainer.AddType(new ArrayType(corLibType, 1));
            return(null);
        }
        public static MethodWrapper CreateMethodWrapper(MetadataContainer metadata, TypeWrapper typeWrapper, MethodDefinition method)
        {
            MethodReference invokeTargetMethod = typeWrapper.Type.IsGenericInstance ? method.MakeGenericMethod(((GenericInstanceType)typeWrapper.Type)) : method;
            TypeWrapper     returnType         = metadata.AddType(method.ReturnType);

            TypeWrapper[] parameters = null;
            if (method.HasParameters)
            {
                parameters = new TypeWrapper[method.Parameters.Count];
                for (int i = 0; i < parameters.Length; i++)
                {
                    parameters[i] = metadata.AddType(method.Parameters[i].ParameterType);
                }
            }
            return(new MethodWrapper(method, invokeTargetMethod, typeWrapper, returnType, parameters));
        }
        public TypeWrapper AddType(TypeReference type)
        {
            TypeWrapper wrapper;

            if (!this.types.TryGetType(type.FullName, out wrapper))
            {
                Mono.Cecil.TokenType tokenType = type.MetadataToken.TokenType;
                if (tokenType != Mono.Cecil.TokenType.TypeRef)
                {
                    if (tokenType != Mono.Cecil.TokenType.TypeDef)
                    {
                        if (tokenType != Mono.Cecil.TokenType.TypeSpec)
                        {
                            throw new NotSupportedException(string.Format("Metadata token type {0} is not supported.", type.MetadataToken.TokenType));
                        }
                        MetadataType metadataType = type.MetadataType;
                        if (metadataType != MetadataType.Array)
                        {
                            if (metadataType != MetadataType.GenericInstance)
                            {
                                throw new NotSupportedException(string.Format("Metadata type {0} is not supported.", type.MetadataType));
                            }
                        }
                        else
                        {
                            ArrayType type4 = (ArrayType)type;
                            wrapper = new TypeWrapper(this, type4);
                            this.types.Add(type.FullName, wrapper);
                            wrapper.BaseType = this.metadataContainer.AddType(this.metadataContainer.OperationContext.ArrayType);
                            return(wrapper);
                        }
                        GenericInstanceType type5 = (GenericInstanceType)type;
                        wrapper = new TypeWrapper(this, type5);
                        this.types.Add(type.FullName, wrapper);
                        TypeDefinition definition2 = type5.ElementType.Resolve();
                        TypeReference  baseType    = definition2.BaseType;
                        if (baseType != null)
                        {
                            if (baseType.IsGenericInstance)
                            {
                                GenericInstanceType type6 = (GenericInstanceType)baseType;
                                baseType = MetadataContainer.MakeGenericType(type5, type6);
                            }
                            wrapper.BaseType = this.metadataContainer.AddType(baseType);
                        }
                        if (definition2.HasInterfaces)
                        {
                            TypeWrapper[] wrapperArray2 = new TypeWrapper[definition2.Interfaces.Count];
                            for (int i = 0; i < wrapperArray2.Length; i++)
                            {
                                TypeReference reference2 = definition2.Interfaces[i];
                                if (reference2.IsGenericInstance)
                                {
                                    GenericInstanceType type7 = (GenericInstanceType)reference2;
                                    reference2 = MetadataContainer.MakeGenericType(type5, type7);
                                }
                                wrapperArray2[i] = this.metadataContainer.AddType(reference2);
                            }
                            wrapper.Interfaces = wrapperArray2;
                        }
                        wrapper.Methods = this.GetCallableMethods(wrapper, definition2, this.system);
                        return(wrapper);
                    }
                }
                else
                {
                    return(this.metadataContainer.GetAssembly(type.Resolve().Scope).AddType(type.Resolve()));
                }
                TypeDefinition definition = (TypeDefinition)type;
                wrapper = new TypeWrapper(this, definition);
                this.types.Add(type.FullName, wrapper);
                if (definition.BaseType != null)
                {
                    wrapper.BaseType = this.metadataContainer.AddType(definition.BaseType);
                }
                if (definition.DeclaringType != null)
                {
                    wrapper.DeclaringType = this.metadataContainer.AddType(definition.DeclaringType);
                }
                if (definition.HasInterfaces)
                {
                    TypeWrapper[] wrapperArray = new TypeWrapper[definition.Interfaces.Count];
                    for (int j = 0; j < wrapperArray.Length; j++)
                    {
                        wrapperArray[j] = this.metadataContainer.AddType(definition.Interfaces[j]);
                    }
                    wrapper.Interfaces = wrapperArray;
                }
                wrapper.Methods = this.GetCallableMethods(wrapper, definition, this.system);
                if (!this.system)
                {
                    wrapper.Fields = this.GetFields(definition);
                }
            }
            return(wrapper);
        }
 public AssemblyWrapper(MetadataContainer metadataContainer, string name, bool system)
 {
     this.metadataContainer = metadataContainer;
     this.name   = name;
     this.system = system;
 }