Example #1
0
        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());
            }
        }