CodeDom 笔记整理

学习博客园 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");

 

 

posted @ 2013-04-11 16:48  zscflying  阅读(264)  评论(0编辑  收藏  举报