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; } }
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), }); }