public void ReadModule(ModuleDefinition module, bool resolve)
        {
            this.resolve = resolve;
            if (module.HasAssemblyReferences)
            {
                ImmediateModuleReader.Read(module.AssemblyReferences);
            }
            if (module.HasResources)
            {
                ImmediateModuleReader.Read(module.Resources);
            }
            if (module.HasModuleReferences)
            {
                ImmediateModuleReader.Read(module.ModuleReferences);
            }
            if (module.HasTypes)
            {
                this.ReadTypes(module.Types);
            }
            if (module.HasExportedTypes)
            {
                ImmediateModuleReader.Read(module.ExportedTypes);
            }
            this.ReadCustomAttributes(module);
            AssemblyDefinition assembly = module.Assembly;

            if (assembly == null)
            {
                return;
            }
            this.ReadCustomAttributes(assembly);
            this.ReadSecurityDeclarations(assembly);
        }
 private void ReadType(TypeDefinition type)
 {
     this.ReadGenericParameters(type);
     if (type.HasInterfaces)
     {
         ImmediateModuleReader.Read(type.Interfaces);
     }
     if (type.HasNestedTypes)
     {
         this.ReadTypes(type.NestedTypes);
     }
     if (type.HasLayoutInfo)
     {
         ImmediateModuleReader.Read(type.ClassSize);
     }
     if (type.HasFields)
     {
         this.ReadFields(type);
     }
     if (type.HasMethods)
     {
         this.ReadMethods(type);
     }
     if (type.HasProperties)
     {
         this.ReadProperties(type);
     }
     if (type.HasEvents)
     {
         this.ReadEvents(type);
     }
     this.ReadSecurityDeclarations(type);
     this.ReadCustomAttributes(type);
 }
        private void ReadMethods(TypeDefinition type)
        {
            Collection <MethodDefinition> methods = type.Methods;

            for (int i = 0; i < methods.Count; i++)
            {
                MethodDefinition methodDefinition = methods[i];
                this.ReadGenericParameters(methodDefinition);
                if (methodDefinition.HasParameters)
                {
                    this.ReadParameters(methodDefinition);
                }
                if (methodDefinition.HasOverrides)
                {
                    ImmediateModuleReader.Read(methodDefinition.Overrides);
                }
                if (methodDefinition.IsPInvokeImpl)
                {
                    ImmediateModuleReader.Read(methodDefinition.PInvokeInfo);
                }
                this.ReadSecurityDeclarations(methodDefinition);
                this.ReadCustomAttributes(methodDefinition);
                MethodReturnType methodReturnType = methodDefinition.MethodReturnType;
                if (methodReturnType.HasConstant)
                {
                    ImmediateModuleReader.Read(methodReturnType.Constant);
                }
                if (methodReturnType.HasMarshalInfo)
                {
                    ImmediateModuleReader.Read(methodReturnType.MarshalInfo);
                }
                this.ReadCustomAttributes(methodReturnType);
            }
        }
        private void ReadFields(TypeDefinition type)
        {
            Collection <FieldDefinition> fields = type.Fields;

            for (int i = 0; i < fields.Count; i++)
            {
                FieldDefinition fieldDefinition = fields[i];
                if (fieldDefinition.HasConstant)
                {
                    ImmediateModuleReader.Read(fieldDefinition.Constant);
                }
                if (fieldDefinition.HasLayoutInfo)
                {
                    ImmediateModuleReader.Read(fieldDefinition.Offset);
                }
                if (fieldDefinition.RVA > 0)
                {
                    ImmediateModuleReader.Read(fieldDefinition.InitialValue);
                }
                if (fieldDefinition.HasMarshalInfo)
                {
                    ImmediateModuleReader.Read(fieldDefinition.MarshalInfo);
                }
                this.ReadCustomAttributes(fieldDefinition);
            }
        }
        private void ReadEvents(TypeDefinition type)
        {
            Collection <EventDefinition> events = type.Events;

            for (int i = 0; i < events.Count; i++)
            {
                EventDefinition eventDefinition = events[i];
                ImmediateModuleReader.Read(eventDefinition.AddMethod);
                this.ReadCustomAttributes(eventDefinition);
            }
        }
        private void ReadProperties(TypeDefinition type)
        {
            Collection <PropertyDefinition> properties = type.Properties;

            for (int i = 0; i < properties.Count; i++)
            {
                PropertyDefinition propertyDefinition = properties[i];
                ImmediateModuleReader.Read(propertyDefinition.GetMethod);
                if (propertyDefinition.HasConstant)
                {
                    ImmediateModuleReader.Read(propertyDefinition.Constant);
                }
                this.ReadCustomAttributes(propertyDefinition);
            }
        }
Exemple #7
0
        public static void WriteModuleTo(ModuleDefinition module, Stream stream, WriterParameters parameters)
        {
            if ((module.Attributes & ModuleAttributes.ILOnly) == (ModuleAttributes)0)
            {
                throw new NotSupportedException("Writing mixed-mode assemblies is not supported");
            }
            if (module.HasImage && module.ReadingMode == ReadingMode.Deferred)
            {
                ImmediateModuleReader immediateModuleReader = new ImmediateModuleReader(module.Image);
                immediateModuleReader.ReadModule(module, false);
            }
            module.MetadataSystem.Clear();
            AssemblyNameDefinition assemblyNameDefinition = (module.assembly != null) ? module.assembly.Name : null;
            string fullyQualifiedName = stream.GetFullyQualifiedName();
            ISymbolWriterProvider symbolWriterProvider = parameters.SymbolWriterProvider;

            if (symbolWriterProvider == null && parameters.WriteSymbols)
            {
                symbolWriterProvider = SymbolProvider.GetPlatformWriterProvider();
            }
            ISymbolWriter symbolWriter = ModuleWriter.GetSymbolWriter(module, fullyQualifiedName, symbolWriterProvider);

            if (parameters.StrongNameKeyPair != null && assemblyNameDefinition != null)
            {
                assemblyNameDefinition.PublicKey = parameters.StrongNameKeyPair.PublicKey;
                module.Attributes |= ModuleAttributes.StrongNameSigned;
            }
            MetadataBuilder metadata = new MetadataBuilder(module, fullyQualifiedName, symbolWriterProvider, symbolWriter);

            ModuleWriter.BuildMetadata(module, metadata);
            if (module.symbol_reader != null)
            {
                module.symbol_reader.Dispose();
            }
            ImageWriter imageWriter = ImageWriter.CreateWriter(module, metadata, stream);

            imageWriter.WriteImage();
            if (parameters.StrongNameKeyPair != null)
            {
                CryptoService.StrongName(stream, imageWriter, parameters.StrongNameKeyPair);
            }
            if (symbolWriter != null)
            {
                symbolWriter.Dispose();
            }
        }
        private void ReadGenericParameters(IGenericParameterProvider provider)
        {
            if (!provider.HasGenericParameters)
            {
                return;
            }
            Collection <GenericParameter> genericParameters = provider.GenericParameters;

            for (int i = 0; i < genericParameters.Count; i++)
            {
                GenericParameter genericParameter = genericParameters[i];
                if (genericParameter.HasConstraints)
                {
                    ImmediateModuleReader.Read(genericParameter.Constraints);
                }
                this.ReadCustomAttributes(genericParameter);
            }
        }
        private void ReadParameters(MethodDefinition method)
        {
            Collection <ParameterDefinition> parameters = method.Parameters;

            for (int i = 0; i < parameters.Count; i++)
            {
                ParameterDefinition parameterDefinition = parameters[i];
                if (parameterDefinition.HasConstant)
                {
                    ImmediateModuleReader.Read(parameterDefinition.Constant);
                }
                if (parameterDefinition.HasMarshalInfo)
                {
                    ImmediateModuleReader.Read(parameterDefinition.MarshalInfo);
                }
                this.ReadCustomAttributes(parameterDefinition);
            }
        }
        private void ReadCustomAttributes(ICustomAttributeProvider provider)
        {
            if (!provider.HasCustomAttributes)
            {
                return;
            }
            Collection <CustomAttribute> customAttributes = provider.CustomAttributes;

            if (!this.resolve)
            {
                return;
            }
            for (int i = 0; i < customAttributes.Count; i++)
            {
                CustomAttribute customAttribute = customAttributes[i];
                ImmediateModuleReader.Read(customAttribute.ConstructorArguments);
            }
        }
        private void ReadSecurityDeclarations(ISecurityDeclarationProvider provider)
        {
            if (!provider.HasSecurityDeclarations)
            {
                return;
            }
            Collection <SecurityDeclaration> securityDeclarations = provider.SecurityDeclarations;

            if (!this.resolve)
            {
                return;
            }
            for (int i = 0; i < securityDeclarations.Count; i++)
            {
                SecurityDeclaration securityDeclaration = securityDeclarations[i];
                ImmediateModuleReader.Read(securityDeclaration.SecurityAttributes);
            }
        }