Esempio n. 1
0
        public MosaModule Load(ModuleDef moduleDef)
        {
            MosaModule mosaModule = metadata.Controller.CreateModule();

            using (var module = metadata.Controller.MutateModule(mosaModule))
            {
                module.UnderlyingObject = new UnitDesc <ModuleDef, object>(moduleDef, moduleDef, null);
                module.Name             = moduleDef.Name;
                module.Assembly         = moduleDef.Assembly.Name;

                foreach (var typeDef in moduleDef.GetTypes())
                {
                    Load(mosaModule, typeDef);
                }
            }
            metadata.Controller.AddModule(mosaModule);
            metadata.Cache.AddModule(mosaModule);
            LoadedUnits.Add(mosaModule);

            if (moduleDef.Assembly.IsCorLib())
            {
                CorLib = mosaModule;
            }

            return(mosaModule);
        }
Esempio n. 2
0
        private void Load(MosaModule module, TypeDef typeDef)
        {
            TypeSig typeSig = typeDef.ToTypeSig();

            // Check to see if its one of our classes we need for SZ Arrays
            if (typeDef.Name.Contains("SZArrayHelper`1"))
            {
                szHelperSig = typeSig as ClassOrValueTypeSig;
            }
            else if (typeDef.Name.Contains("IList`1"))
            {
                iListSig = typeSig as ClassOrValueTypeSig;
            }

            MosaType mosaType = metadata.Controller.CreateType();

            using (var type = metadata.Controller.MutateType(mosaType))
            {
                type.Module           = module;
                type.UnderlyingObject = new UnitDesc <TypeDef, TypeSig>(typeDef.Module, typeDef, typeSig);

                type.Namespace = typeDef.Namespace;
                type.Name      = typeDef.Name;

                type.IsInterface = typeDef.IsInterface;
                type.IsEnum      = typeDef.IsEnum;
                type.IsDelegate  =
                    typeDef.BaseType != null && typeDef.BaseType.DefinitionAssembly.IsCorLib() &&
                    (typeDef.BaseType.FullName == "System.Delegate" || typeDef.BaseType.FullName == "System.MulticastDelegate");
                type.IsModule = typeDef.IsGlobalModuleType;

                type.IsExplicitLayout = typeDef.IsExplicitLayout;
                if (typeDef.IsExplicitLayout)
                {
                    type.ClassSize   = (int)typeDef.ClassSize;
                    type.PackingSize = typeDef.PackingSize;
                }
                type.TypeAttributes = (MosaTypeAttributes)typeDef.Attributes;
                type.TypeCode       = (MosaTypeCode)typeSig.ElementType;

                // Load members

                foreach (var fieldDef in typeDef.Fields)
                {
                    MosaField mosaField = metadata.Controller.CreateField();

                    using (var field = metadata.Controller.MutateField(mosaField))
                        LoadField(mosaType, field, fieldDef);

                    type.Fields.Add(mosaField);
                    metadata.Cache.AddField(mosaField);
                    LoadedUnits.Add(mosaField);
                }

                foreach (var methodDef in typeDef.Methods)
                {
                    MosaMethod mosaMethod = metadata.Controller.CreateMethod();

                    using (var method = metadata.Controller.MutateMethod(mosaMethod))
                        LoadMethod(mosaType, method, methodDef);

                    type.Methods.Add(mosaMethod);
                    metadata.Cache.AddMethod(mosaMethod);
                    LoadedUnits.Add(mosaMethod);
                }

                foreach (var propertyDef in typeDef.Properties)
                {
                    MosaProperty mosaProperty = metadata.Controller.CreateProperty();

                    using (var property = metadata.Controller.MutateProperty(mosaProperty))
                        LoadProperty(mosaType, property, propertyDef);

                    type.Properties.Add(mosaProperty);
                    metadata.Cache.AddProperty(mosaProperty);
                    LoadedUnits.Add(mosaProperty);
                }
            }
            typeCache[typeSig] = mosaType;
            metadata.Controller.AddType(mosaType);
            metadata.Cache.AddType(mosaType);
            LoadedUnits.Add(mosaType);
        }