Exemplo n.º 1
0
        public void Generate(
            string inputPath,
            string resolverName,
            string[] libraryPaths,
            string[] definitionPaths,
            bool useMapMode,
            double loadFactor)
        {
            if (disposed)
            {
                throw new InvalidOperationException("Generate method can be called once.");
            }

            var sw = new Stopwatch();
            ModuleDefinition inputModule;
            TypeDefinition   resolverTypeDefinition;
            TypeProvider     provider;

            moduleDefinitions = new ModuleDefinition[1 + libraryPaths.Length];
            using (new Watcher(sw, logger, "Module Reading"))
            {
                moduleDefinitions[0] = inputModule = ModuleDefinition.ReadModule(inputPath, readerParam);

                logger("log inputModule\nassembly : " + inputModule.Assembly.FullName + "\nfile : " + inputModule.FileName);

                var resolverFinder = new FormatterResolverFinder();
                resolverTypeDefinition = resolverFinder.Find(inputModule, resolverName);

                logger("log resolver\nname : " + resolverTypeDefinition.FullName);

                var messagePackAssemblyNameReference = inputModule.AssemblyReferences.First(x => x.Name == "MessagePack");
                ReadModules(libraryPaths, moduleDefinitions);
                definitionModuleDefinitions = new ModuleDefinition[definitionPaths.Length];
                for (var index = 0; index < definitionPaths.Length; index++)
                {
                    var path = definitionPaths[index];
                    definitionModuleDefinitions[index] = ModuleDefinition.ReadModule(path, doNotWriteReaderParam);
                }

                var verifier = new ModuleRelationshipVerifier();
                verifier.Verify(inputModule, moduleDefinitions);

                provider = new TypeProvider(inputModule, messagePackAssemblyNameReference, reportHook);
            }

            CollectedInfo[]         collectedInfos;
            EnumSerializationInfo[] enumSerializationInfos;
            using (new Watcher(sw, logger, "Method Collect"))
            {
                collectedInfos = CollectInfo(useMapMode, moduleDefinitions);
                logger("collected serialization info length : " + collectedInfos.Length);
                var enumTypeCollector = new EnumTypeCollector();
                enumSerializationInfos = enumTypeCollector.Collect(collectedInfos);
                logger("collected enum serialization info length : " + enumSerializationInfos.Length);
            }

            using (new Watcher(sw, logger, "Ensure Internal Access"))
            {
                EnsureInternalAccessibility(inputModule, collectedInfos, provider.SystemObjectHelper);
            }

            FormatterTableItemInfo[] formatterInfos;
            using (new Watcher(sw, logger, "Formatter Generation"))
            {
                var dataHelper     = new DataHelper(resolverTypeDefinition.Module, provider.SystemValueTypeHelper.ValueType);
                var automataHelper = new AutomataEmbeddingHelper(resolverTypeDefinition, provider.SystemReadOnlySpanHelper, dataHelper);
                formatterInfos = CalculateFormatterInfos(loadFactor, resolverTypeDefinition, provider, collectedInfos, enumSerializationInfos, automataHelper, dataHelper);
            }

            using (new Watcher(sw, logger, "Formatter Table Generation"))
            {
                var pairGenerator  = new TypeKeyInterfaceMessagePackFormatterValuePairGenerator(provider);
                var tableGenerator = new FixedTypeKeyInterfaceMessagePackFormatterValueHashtableGenerator(inputModule, pairGenerator, provider.SystemObjectHelper, provider.SystemTypeHelper, provider.Importer, provider.SystemArrayHelper, loadFactor);
                var(tableType, getFormatterMethodInfo) = tableGenerator.Generate(formatterInfos);
                resolverTypeDefinition.NestedTypes.Add(tableType);

                var resolverInjector = new ResolverInjector(inputModule, resolverTypeDefinition, provider);
                resolverInjector.Implement(getFormatterMethodInfo);

                PrivateAccessEnabler.EnablePrivateAccess(inputModule, provider.SystemRuntimeExtensionsScope);
            }

            try
            {
                using (new Watcher(sw, logger, "Input DLL Writing"))
                {
                    inputModule.Write();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
Exemplo n.º 2
0
 public FixedTypeKeyInterfaceMessagePackFormatterValueHashtableGenerator(ModuleDefinition module, TypeKeyInterfaceMessagePackFormatterValuePairGenerator pairGenerator, SystemObjectHelper systemObjectHelper, SystemTypeHelper typeHelper, ModuleImporter importer, SystemArrayHelper arrayHelper, double loadFactor)
 {
     this.importer   = importer;
     this.typeHelper = typeHelper;
     customFormatterConstructorImporter = new CustomFormatterConstructorImporter(module.TypeSystem.Void, importer);
     generator = new FixedTypeKeyGenerator <FormatterTableItemInfo, TypeKeyInterfaceMessagePackFormatterValuePairGenerator>(
         TypeName,
         module,
         pairGenerator,
         systemObjectHelper,
         typeHelper,
         importer,
         arrayHelper,
         loadFactor,
         LoadAppropriateValueFromFormatterInfo,
         info => info.SerializeTypeReference,
         new[] { Instruction.Create(OpCodes.Ldnull), });
 }