public async Task Execute(string code, NScriptOptions scriptOptions) { if (code.Contains("static void Main(") || code.Contains("static async Task Main(")) { // Program } else { // Statement if (code.Contains("await ")) { //async code = $@"public static async Task MainAsync() {{ {code} }}"; } else { // sync code = $@"public static void Main(string[] args) {{ {code} }}"; } } if (!code.Contains("static void Main(") && code.Contains("static async Task Main(")) { if (code.Contains("static async Task Main()")) { code = $@"{code} public static void Main() => MainAsync().Wait(); "; } else { code = $@"{code} public static void Main() => MainAsync(null).Wait(); "; } } if (!code.Contains("class Program")) { code = $@"public class Program {{ {code} }}"; } if (scriptOptions.UsingList.Count > 0) { code = $"{scriptOptions.UsingList.Select(ns => $"using {ns};").StringJoin(Environment.NewLine)}{Environment.NewLine}{code}"; } DomainManagement.RegisterDefault <AssemblyDomain>(); var assBuilder = new AssemblyCSharpBuilder(GuidIdGenerator.Instance.NewId()); assBuilder.Add(code, scriptOptions.UsingList); // TODO: add references assBuilder.CompilerOption(compiler => { compiler.AssemblyOutputKind = AssemblyBuildKind.File; }); var assembly = assBuilder.GetAssembly(); var targetFramework = assembly.GetCustomAttribute <TargetFrameworkAttribute>(); var entryPoint = assembly.GetType("Program")?.GetMethod("Main", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (null != entryPoint) { entryPoint.Invoke(null, entryPoint.GetParameters().Select(p => p.ParameterType.GetDefaultValue()).ToArray()); } else { throw new ArgumentException("can not find entry point"); } //using (var executor = new DotNetExecutor(assembly.Location, _outputHelper)) //{ // await executor.ExecuteAsync(); //} }