예제 #1
0
    private string Complie(string path, string textString, string codes)
    {
        string rtResult = String.Empty;
        CodeBlockFile source = null;
        if (path != null)
        {
            source = CodeBlock.GenerateSourceFile(path);
        }
        else if (textString != null)
        {
            source = CodeBlock.GenerateSourceFileFromString(textString);
        }
        else
        {
            source = new CodeBlockFile();
            source.SourceCode = codes;
        }
        string finalCode = GetDefaultTemplate(source, "CCCScript", "RuntimeProgram");

        CompilerResults result = CscCompile(finalCode,
                                            source.Reference.Split(new[] { Environment.NewLine },
                                                                   StringSplitOptions.RemoveEmptyEntries));

        if (result.Errors.Count == 0)
        {
            dynamic t = result.CompiledAssembly.CreateInstance("CCCScript.RuntimeProgram");
            if (t != null)
            {
                rtResult = t.Start(this);
            }
            else
            {
                rtResult = "RuntimeProgram is null";
                throw new Exception(rtResult);
            }
        }
        else
        {
            foreach (CompilerError err in result.Errors)
            {
                rtResult += err.ErrorText + " " + err.Line.ToString() + Environment.NewLine;
            }
            throw new Exception(rtResult);
        }

        return rtResult;
    }
예제 #2
0
        private static CodeBlockFile GenerateSourceFile(string rootFile, string textString)
        {
            IEnumerable<CodeBlock> list = rootFile != null
                                              ? SplitCodeAndText(rootFile)
                                              : SplitCodeAndTextFromString(textString);
            string code = SplitCodeAndContent(list, "obj");
            code = OpenDefintionLinkInCode(code);

            string usingBlock = ExtractDefintionBlock(code);
            string dllBlock = ExtractAssemblyBlock(code);
            string methodBlock = ExtractMethodBlock(code);
            string classBlock = ExtractClassBlock(code);
            string fieldBlock = ExtractFieldBlock(code);
            string strings = ExtractStringBlock(code);
            code = RemoveAllPatternBlocks(code);
            code = ProcessAllInlinePatterns(code, "obj");

            var codeFile = new CodeBlockFile();
            codeFile.Definition = usingBlock;
            codeFile.SourceCode = strings + code;
            codeFile.Reference = dllBlock;
            codeFile.Class = classBlock;
            codeFile.Method =methodBlock ;
            codeFile.Field = fieldBlock;

            return codeFile;
        }
예제 #3
0
 public string GetDefaultTemplate(CodeBlockFile source, string nameSpaceId, string classId)
 {
     return DefaultTemplate.Replace("/*NAMESPACEID*/", nameSpaceId)
                            .Replace("/*CLASSID*/", classId)
                            .Replace("/*USING*/", DefalultUsingBlock + source.Definition)
                            .Replace("/*FIELD*/", source.Field)
                            .Replace("/*CLASS*/", DefaultClass + source.Class)
                            .Replace("/*METHOD*/", DefaultMethod + source.Method)
                            .Replace("/*MainMethod*/", DefaultMainMethod)
                            .Replace("/*ENTRY*/", source.SourceCode);
 }