8.CodeConstructor类
用来表示一个类的构造函数,BaseConstructorArgs是用来表示基类的构造函数的参数集合,通过Add方法添加,如果基类的构造函数没有参数可以添加一个CodeVariableReferenceExpression对象,不用任何便两名初始化他,如:
wfPropertyConstructor1.BaseConstructorArgs.Add(new CodeVariableReferenceExpression());9.CodeTypeOfExpression类
用来表示typeof表达式
10.CodeThisReferenceExpression类
用来表示this的表达式
11.CodeBaseReferenceExpression类
用来表示base的表达式
CodeThisReferenceExpression和CodeBaseReferenceExpression可以和其他表达式组合在一起形成一个表达式如:
CodeMethodInvokeExpression InitByEntityIDInvoke = new CodeMethodInvokeExpression(new CodeBaseReferenceExpression(), "ConstructByID", new CodeVariableReferenceExpression(m_Model.EntitiesTable + "ID"), new CodeVariableReferenceExpression("objTrans"));上面这段代码就是初始化一个方法调用的表达式,使用CodeBaseReferenceExpression和ConstructByID方法,加上两个局部变量的作为一个调用方法的参数组合成一个函数调用的表达式
12.CodeSnippetStatement类
表明一条语句,由于CodeDom为了兼容VB的语法,有些语法不支持,没有类可以调用,实在没有办法了可以通过CodeSnippetStatement来写一条语句,但这个语句不能保证在VB.Net里被通过
CodeSnippetStatement ExceptionStatement = new CodeSnippetStatement("throw new Exception("Property not Implementation")");上面这条抛出异常的语句是直接写的代码,当然CodeDom存在异常语句的对象,我这里偷了一下懒
13.IndentedTextWriter类
表明生成出来代码语句的缩进
IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(sourceCodePaht + "\" + m_Model.EntitiesAssembly + ".cs", false), " ");
false后面的双引号之间的四个空格表明代码的缩进值为四个空格
那么我们剩下的就是生成代码了
IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(sourceCodePaht + "\" + m_Model.EntitiesAssembly + ".cs", false), " ");CodeDomProvider provide = new CSharpCodeProvider();
provide.GenerateCodeFromCompileUnit(unit, tw, new CodeGeneratorOptions());tw.Close();provider提供几种生成,GenerateCodeFromCompileUnit可以生成的直接生成一个代码容器里的所有代码,如果我们只写了一个类,可以通过GenerateCodeFromType方法生成,也可以生成一个命名空间里的代码,甚至可以只生成一条语句或一个表达式GenerateCodeFromNamespace、GenerateCodeFromStatement
剩下的就是要编译源代码了
CompilerParameters compilerParams = new CompilerParameters();//指定编译选项,是类库compilerParams.CompilerOptions = "/target:library /optimize";//不生成执行文件compilerParams.GenerateExecutable = false;//在内存中生成输出compilerParams.GenerateInMemory = true;//不包含调试信息compilerParams.IncludeDebugInformation = false;//添加编译时使用的dll,如果不是系统自带的dll,必须指定完整的路径compilerParams.ReferencedAssemblies.Add("mscorlib.dll");compilerParams.ReferencedAssemblies.Add("System.dll");compilerParams.ReferencedAssemblies.Add("System.Data.dll");compilerParams.ReferencedAssemblies.Add(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "DawnPro.WebArchitechture.DAL.dll");compilerParams.ReferencedAssemblies.Add(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "DawnPro.WorkflowInterface.dll");//指定编译后的文件的输出路径compilerParams.OutputAssembly = outputAsseblyPath + "\bin\" + m_Model.EntitiesAssembly + ".dll";最后使用Provider提供的CompileAssemblyFromDom方法

