public static void Main(string[] args) { ArgumentParser argumentParser = new ArgumentParser(new ConsoleArgument()); ConsoleArgument dirArg = new ConsoleArgument("d", ArgumentValueType.STRING); ConsoleArgument diagnoseArg = new ConsoleArgument("diagnose"); argumentParser.AddArgument(dirArg); argumentParser.AddArgument(diagnoseArg); argumentParser.Parse(args); string moduleName = argumentParser.DefaultRule.StringValue; if (dirArg.IsSet) { DirName = dirArg.StringValue; } // 1 模块加载 VMModule mainModule = ModuleLoader.AddModule(LoadModule(moduleName), false); // 2 执行静态构造 StaticInitWatch.Start(); foreach (var vmClass in ModuleLoader.Classes.Values) { vmClass.Methods.TryGetValue(MethodArea.Singleton.StaticConstructorNameAddress, out List <VMMethod> sinit); VMExecutor executor = ThreadManager.CreateThread(); executor.Execute(sinit[0]); // TODO 静态构造是可以多线程的,但是如何回收堆栈呢? ThreadManager.CollectThreadSpace(executor); } StaticInitWatch.Stop(); // 3 执行Main函数 if (!mainModule.Classes.TryGetValue(MethodArea.Singleton.StringProgramAddress, out VMClass entryClass)) { throw new XiVMError("Program.Main() not found"); } if (!entryClass.Methods.TryGetValue(MethodArea.Singleton.StringMainAddress, out List <VMMethod> entryMethodGroup)) { throw new XiVMError("Program.Main() not found"); } VMMethod entryMethod = entryMethodGroup.Find(m => m.DescriptorAddress == MethodArea.Singleton.StringMainDescriptorAddress); if (entryMethod == null) { throw new XiVMError("Program.Main(System.String) not found"); } VMExecutor mainThread = ThreadManager.CreateThread(); mainThread.Execute(entryMethod, null); // 4 诊断信息 if (diagnoseArg.IsSet) { DisplaDiagnoseIndo(mainThread.GetDiagnoseInfo()); } }