public static MethodDeclarationSyntax BuildVoidMainWaitForDebugger() { //add this var debuggerWait = CSharpSyntaxTree.ParseText(@" public static void Main() { var waitMax = 10*1000; var waited = 0; var waitInterval = 100; while (System.Diagnostics.Debugger.IsAttached == false && waited < waitMax) { System.Threading.Thread.Sleep(waitInterval); waited += waitInterval; } if (waitMax < waitInterval) { throw new Exception(""Failed to get debugger attached in time""); } new ScriptyDebugCls().ScriptyDebugMeth(); }"); var dwMcu = GetRootMainCompilationUnit(debuggerWait); var memberDecl = (MethodDeclarationSyntax)dwMcu.Members.First(); var statements = memberDecl.Body; var method = SyntaxBuilder.Method("Main", statements).AsPublic().AsStatic().AsReturnVoid(); return(method); }
public static CompilationUnitSyntax WrapScriptInStandardClass(CompilationUnitSyntax strippedScript, string namespaceName, string className, string methodName, string scriptFilePath, List <string> usings) { var scriptStatements = SyntaxFactory.ParseStatement(strippedScript.GetText().ToString()); var voidMain = BuildVoidMainWaitForDebugger(); var scriptMethod = SyntaxBuilder.Method(methodName, scriptStatements).AsPublic(); var injectedContextField = SyntaxBuilder.BuildField(scriptFilePath, typeof(object), "_context"); var wrappingClass = SyntaxBuilder.BuildClassWrapper(className, new MemberDeclarationSyntax[] { injectedContextField }, new MemberDeclarationSyntax[] { voidMain, scriptMethod }) .AsSerializable(); var wrappingNamespace = SyntaxBuilder.NamespaceWrapper(namespaceName, usings, new MemberDeclarationSyntax[] { wrappingClass }); return(wrappingNamespace); }