学习博客园 lichdr的动态生成与编译系列文章http://www.cnblogs.com/lichdr/category/12610.html
CodeCompileUnit compunit=new CodeCompileUnit() 生成可编译的单元。
compunit.Namespaces.Add(sample) 添加名称空间
命名空间
CodeNamespace sample=new CodeNamespace("Sample") 定义一个名为Sample的命名空间
sample.Imports.Add(导入名称空间)
sample.Types.Add(添加类型)
方法
CodeMemberMethod method=new CodeMemberMethod()
method.Comments.Add(new CodeCommentStatement("注释"))
method.Name=""
method.Attributes=MemberAttributes.Private|MemberAttributes.Static
method.Parameters.Add(new CodePatameterDeclarationExpression(typeof(int),"n"))
参数\变量应用
CodeVariableReferenceExpression("i") 变量引用
CodeArgumentReferenceExpression("n") 参数引用
赋值语句
CodeAssignStatement assignstatement=new CodeAssignStatement(new CodeVariableReferenceExpression("i"),new CodeBinaryOperatorExpression(...))
变量声明
CodeVariableDeclarationStatement VarF2=new CodeVariableDeclarationStatement(typeof(int),"F2",new CodePrimitiveExpression(1));
二元操作表达式
CodeBinaryOperatorExpression test =new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),CodeBinaryOperatorType.LessThanOrEqual,new CodeArgumentReferenceExpression("n")); i<=1
类
CodeTypeDeclaration MyClass=new CodeTypeDeclaration("DemoClass") 定义一个名为DemoClass的类
CodeEntryPointMethod Start = new CodeEntryPointMethod() 定义程序入口点,Main
MyClass.Members.Add(Start)
Start.Statements.Add(statement) 方法添加语句
构造函数
属性
CodeMemberProperty MyProperty=new CodeMemberProperty()
MyProperty.Name=""
MyProperty.Type=new CodeTypeReference("System.Int32");
MyProperty.Attributes=MemberAttributes.Public|MemberAttributes.Final;
MyProperty.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),"myField")));
MyProperty.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),"myField"),new CodePropertySetValueReferenceExpression()));
索引器
字段
CodeMemberField myField=new CodeMemberField("System.Int32","myField"); 产生private int myField
CodeMemberField myArray=new CodeMemberField("System.Int32[]","myArray")
myArray.Attributes=MemberAttributes.Private
myArray.InitExpression=new CodeArrayCreateExpression("System.Int32",10);
产生private int[] myArray=new int[10]
调用方法
CodeMethodInvokeExpression cs = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"),"WriteLine",new CodePrimitiveExpression("Hello World!")); 调用方法的语句 System.Console.WriteLine("Hello World")
CodeMethodInvokeExpression (CodeMethodReferenceExpression method,params CodeExpression[] parameters)
for循环
CodeIterationStatement forloop=new CodeIterationStatement(初始表达式一个变量声明,循环测试一个二元操作表达式,循环递增语句CodeAssignStatement,循环体内的语句CodeStatement[])
TryCatch语句
if 条件语句
CodeConditionStatement(CodeExpression condition//条件判断一般为二元操作表达式,CodeStatement[] trueStatements,CodeStatements[] falseStatements)
生成cs文件、dll、exe
StreamWriter sw = new StreamWriter("mytwo.cs",false);
new CSharpCodeProvider().GenerateCodeFromCompileUnit(compunit, sw, new CodeGeneratorOptions());
sw.Close();
CompilerParameters cp = new CompilerParameters();
cp.GenerateExecutable = true;
cp.ReferencedAssemblies.Add("System.dll");
cp.OutputAssembly = "mytwo.exe";
CompilerResults cr = new CSharpCodeProvider().CompileAssemblyFromFile(cp, "mytwo.cs");