/// <summary> /// Create type descriptor from given type. /// </summary> /// <param name="type">Type from which descriptor will be created.</param> /// <param name="resolver">The generic parameter resolver.</param> /// <returns>Created type descriptor.</returns> public static TypeDescriptor Create(Type type, ParameterResolver resolver = null) { var builder = new TypeDescriptorBuilder(); if (resolver == null) { //create default routine for parameters resolver var parameters = new Dictionary <Type, int>(); resolver = (t) => { int number; if (!parameters.TryGetValue(t, out number)) { number = parameters.Count; parameters.Add(t, number); } return(TypeDescriptor.GetParameter(number)); }; } var adapter = new TypeAdapter(type); var result = TypeHierarchyDirector.BuildDescriptor(adapter, (a) => resolver((a as TypeAdapterBase <Type>).AdaptedType)); return(result); }
public void Main() { var configurationJson = File.ReadAllText("vm.json", Encoding.UTF8); var configuration = JsonConvert.DeserializeObject <VirtualMachineConfiguration>(configurationJson); var builder = new TypeDescriptorBuilder(); var instructionSet = builder.Build <IInstructionSet>(configuration.InstructionSet); var debugger = builder.Build <ISupervisor>(configuration.Supervisor); var cpu = builder.Build <ICpu>(configuration.Cpu, instructionSet, debugger); var memory = builder.Build <IMemory>(configuration.Memory); var devices = configuration.Devices.Select(d => builder.Build <IDevice>(d)).ToArray(); if (memoryFileName != null) { Console.WriteLine($"Loading memory from {memoryFileName}"); FillMemoryFromFile(memory, memoryFileName); } Console.WriteLine("Starting devices"); foreach (var device in devices) { RunDevice(device, memory); } Console.WriteLine("Starting cpu\n"); try { cpu.Run(memory); } catch (CpuException e) { Report(e); } catch (Exception e) { Report(e); } }