예제 #1
0
        /// <summary>
        /// Creates an Assembly from DynamicAssembly definition
        /// </summary>
        /// <param name="assemblyDefinition">assembly description</param>
        /// <returns>result with assembly or error info</returns>
        public static CompileResult CompileDynamicAssembly(DynamicAssembly assemblyDefinition)
        {
            CodeDomProvider    codeDomProvider    = CodeDomProvider.CreateProvider("CSharp");
            CompilerParameters compilerParameters = new CompilerParameters();

            compilerParameters.CompilerOptions = "/t:library /platform:anycpu /lib:" + "\"" +
                                                 (String.IsNullOrWhiteSpace(assemblyDefinition.ReferencesPath) ? GetCurrentPath() : assemblyDefinition.ReferencesPath) + "\"";
            compilerParameters.IncludeDebugInformation = false;
            //compilerParameters.OutputAssembly = assemblyDefinition.Name;
            compilerParameters.GenerateInMemory   = true;
            compilerParameters.GenerateExecutable = false;

            foreach (var item in assemblyDefinition.References)
            {
                compilerParameters.ReferencedAssemblies.Add(item);
            }

            List <string> codeModules = new List <string>();

            foreach (DynamicClass item in assemblyDefinition.Classes)
            {
                string code = DynamicClass.Template;
                code = DynamicClass.AddUsingsToTemplate(item, code);
                code = DynamicClass.AddInterfacesToTemplate(item, code);
                code = DynamicClass.AddNamespaceToTemplate(String.IsNullOrWhiteSpace(item.Namespace) ? assemblyDefinition.Name : item.Namespace, code);
                code = DynamicClass.AddNameToTemplate(item, code);
                code = DynamicClass.AddPropertiesToTemplate(item, code);
                code = DynamicClass.AddMethodsToTemplate(item, code);
                codeModules.Add(code);
            }

            foreach (DynamicCustomClass item in assemblyDefinition.CustomClasses)
            {
                codeModules.Add(item.Code);
            }

            // we dont allow empty class definitions(fun fact: its okay for the c# compiler)
            foreach (DynamicCustomClass item in assemblyDefinition.CustomClasses)
            {
                if (String.IsNullOrWhiteSpace(item.Code))
                {
                    CompilerErrorCollection collection  = new CompilerErrorCollection();
                    CompilerError           customError = new CompilerError("CustomClass", 0, 0, "Custom", "Unable to compile an empty code module.");
                    collection.Add(customError);
                    return(new CompileResult(codeModules.ToArray(), collection, null));
                }
            }

            CompilerResults compilerResults = codeDomProvider.CompileAssemblyFromSource(compilerParameters, codeModules.ToArray());

            codeDomProvider.Dispose();

            return(new CompileResult(codeModules.ToArray(), compilerResults.Errors, compilerResults.Errors.Count > 0 ? null : compilerResults.CompiledAssembly));
        }
예제 #2
0
        /// <summary>
        /// Returns a string that represents the instance
        /// </summary>
        /// <returns>System.String</returns>
        public override string ToString()
        {
            string code = DynamicClass.Template;

            code = DynamicClass.AddUsingsToTemplate(this, code);
            code = DynamicClass.AddInterfacesToTemplate(this, code);
            code = DynamicClass.AddNamespaceToTemplate(String.IsNullOrWhiteSpace(Namespace) ? Parent.Name : Namespace, code);
            code = DynamicClass.AddNameToTemplate(this, code);
            code = DynamicClass.AddPropertiesToTemplate(this, code);
            code = DynamicClass.AddMethodsToTemplate(this, code);
            return(code);
        }
예제 #3
0
        /// <summary>
        /// Generate all methods from DynamicClass instance in a code template
        /// </summary>
        /// <param name="dynamicClass">DynamicClass definition</param>
        /// <param name="template">Source code template</param>
        /// <returns>Updated code template</returns>
        internal static string AddMethodsToTemplate(DynamicClass dynamicClass, string template)
        {
            StringBuilder stringBuilderMethods = new StringBuilder();

            foreach (var item in dynamicClass.Methods)
            {
                string methodTemplate = CreateMethodTemplate(item);
                methodTemplate = methodTemplate.Replace("%Code%", item.MethodCode);
                stringBuilderMethods.Append(methodTemplate);
            }

            return(template.Replace("%Methods%", stringBuilderMethods.ToString()));
        }
예제 #4
0
        /// <summary>
        /// Generate all interface implementations from DynamicClass instance in a code template
        /// </summary>
        /// <param name="dynamicClass">DynamicClass definition</param>
        /// <param name="template">Source code template</param>
        /// <returns>Updated code template</returns>
        internal static string AddInterfacesToTemplate(DynamicClass dynamicClass, string template)
        {
            if (dynamicClass.Interfaces.Count == 0)
            {
                return(template.Replace("%Interfaces%", ""));
            }

            string interfaceString = ":";

            foreach (var item in dynamicClass.Interfaces)
            {
                interfaceString += item.Name + ",";
            }

            interfaceString = interfaceString.Substring(0, interfaceString.Length - 1);

            return(template.Replace("%Interfaces%", interfaceString));
        }
예제 #5
0
 /// <summary>
 /// Generate the name from DynamicClass instance in a code template
 /// </summary>
 /// <param name="dynamicClass">DynamicClass definition</param>
 /// <param name="template">Source code template</param>
 /// <returns>Updated code template</returns>
 internal static string AddNameToTemplate(DynamicClass dynamicClass, string template)
 {
     return(template.Replace("%Name%", dynamicClass.Name));
 }
예제 #6
0
 /// <summary>
 /// Generate all usings from DynamicClass instance in a code template
 /// </summary>
 /// <param name="dynamicClass">DynamicClass definition</param>
 /// <param name="template">Source code template</param>
 /// <returns>Updated code template</returns>
 internal static string AddUsingsToTemplate(DynamicClass dynamicClass, string template)
 {
     StringBuilder stringBuilder = new StringBuilder();
     foreach (var item in dynamicClass.Usings)
         stringBuilder.Append(String.Format("using {0};{1}", item, Environment.NewLine));
     return template.Replace("%Usings%", stringBuilder.ToString());
 }
예제 #7
0
        /// <summary>
        /// Generate all methods from DynamicClass instance in a code template
        /// </summary>
        /// <param name="dynamicClass">DynamicClass definition</param>
        /// <param name="template">Source code template</param>
        /// <returns>Updated code template</returns>
        internal static string AddMethodsToTemplate(DynamicClass dynamicClass, string template)
        {
            StringBuilder stringBuilderMethods = new StringBuilder();

            foreach (var item in dynamicClass.Methods)
            {
                string methodTemplate = CreateMethodTemplate(item);
                methodTemplate = methodTemplate.Replace("%Code%", item.MethodCode);
                stringBuilderMethods.Append(methodTemplate);
            }

            return template.Replace("%Methods%", stringBuilderMethods.ToString());
        }
예제 #8
0
        /// <summary>
        /// Generate all properties from DynamicClass instance in a code template
        /// </summary>
        /// <param name="dynamicClass">DynamicClass definition</param>
        /// <param name="template">Source code template</param>
        /// <returns>Updated code template</returns>
        internal static string AddPropertiesToTemplate(DynamicClass dynamicClass, string template)
        {
            StringBuilder stringBuilderProperties = new StringBuilder();
            StringBuilder stringBuilderParams = new StringBuilder();
            StringBuilder stringBuilderSet = new StringBuilder();
            StringBuilder stringBuilderSet2 = new StringBuilder();

            int i = 0;
            foreach (var item in dynamicClass.Properties)
            {
                if (i > 0)
                {
                    stringBuilderParams.Append(",");
                    stringBuilderSet2.Append(",");
                }

                string[] splitArray = item.ToString().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                stringBuilderProperties.Append(String.Format("\t\tinternal {0} {1}{{get; set;}}{2}", splitArray[0], splitArray[1], Environment.NewLine));
                stringBuilderParams.Append(String.Format("{0} param{1}", splitArray[0], i));
                stringBuilderSet.Append(String.Format("\t\t\t{0}=param{1};{2}", splitArray[1], i, Environment.NewLine));
                stringBuilderSet2.Append(String.Format("param{0}", i));
                i++;
            }

            template = template.Replace("%Properties%", stringBuilderProperties.ToString());
            template = template.Replace("%InitializeParams%", stringBuilderParams.ToString());
            template = template.Replace("%ParamsToProperties%", stringBuilderSet.ToString());
            template = template.Replace("%InitializeParams2%", stringBuilderSet2.ToString());
            return template;
        }
예제 #9
0
        /// <summary>
        /// Generate all interface implementations from DynamicClass instance in a code template
        /// </summary>
        /// <param name="dynamicClass">DynamicClass definition</param>
        /// <param name="template">Source code template</param>
        /// <returns>Updated code template</returns>
        internal static string AddInterfacesToTemplate(DynamicClass dynamicClass, string template)
        {
            if (dynamicClass.Interfaces.Count == 0)
                return template.Replace("%Interfaces%", "");

            string interfaceString = ":";
            foreach (var item in dynamicClass.Interfaces)
                interfaceString += item.Name + ",";

            interfaceString = interfaceString.Substring(0, interfaceString.Length - 1);

            return template.Replace("%Interfaces%", interfaceString);
        }
예제 #10
0
 /// <summary>
 /// Generate the name from DynamicClass instance in a code template
 /// </summary>
 /// <param name="dynamicClass">DynamicClass definition</param>
 /// <param name="template">Source code template</param>
 /// <returns>Updated code template</returns>
 internal static string AddNameToTemplate(DynamicClass dynamicClass, string template)
 {
     return template.Replace("%Name%", dynamicClass.Name);
 }