微软CodeDom模型学习笔记(一)

来源:互联网 发布:中国建筑网招聘网络 编辑:程序博客网 时间:2024/05/14 10:42

要点1

CodeDomProvider

MSDN描述

CodeDomProvider 可用于创建和检索代码生成器和代码编译器的实例。代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集。

       注意: .NET Framework 2.0 中,在代码生成器和代码编译器中可用的方法可直接从代码提供程序获得。您不需要调用 CreateGenerator CreateCompiler 来访问这些方法,这些方法被标记为已过时。这适用于预先存在的以及新的代码提供程序实现。

CodeDomProvider 类提供静态方法以发现和枚举计算机上的 CodeDomProvider 实现。GetAllCompilerInfo 方法返回计算机上所有 CodeDomProvider 实现的设置。GetCompilerInfo 方法会基于编程语言名称返回特定 CodeDomProvider 实现的设置。CreateProvider 方法返回特定语言的 CodeDomProvider 实现的实例。

CodeDomProvider 可用于创建和检索代码生成器和代码编译器的实例。代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集。

.NET Framework 1.0 版和 1.1 版中,代码提供程序包含 CodeDomProviderICodeGeneratorICodeParser ICodeCompiler 的实现。

.NET Framework 2.0 中,CreateGeneratorCreateParser CreateCompiler 方法已过时ICodeGenerator ICodeCompiler 的方法在 CodeDomProvider 类中直接可用

1,GetAllCompilerInfo方法,返回类型:CompilerInfo[]

根据返回的CompilerCodeDomProviderType(本身为Type类型)可以得到如下信息

编译类型名称:CSharpCodeProvider,全名Microsoft.CSharp.CSharpCodeProvider

编译类型名称:VBCodeProvider,全名Microsoft.VisualBasic.VBCodeProvider

编译类型名称:JScriptCodeProvider,全名Microsoft.JScript.JScriptCodeProvider

编译类型名称:VJSharpCodeProvider,全名Microsoft.VJSharp.VJSharpCodeProvider

编译类型名称:CppCodeProvider,全名Microsoft.VisualC.CppCodeProvider

CompilerInfIsCodeDomProviderTypeValid为另一重要属性,用处描述为

返回一个值,该值指示是否在计算机上配置了语言提供程序实现。

备注:生成CodeDomProvider实例方式1CompilerinfCreateProvider

CompilerInfGetLanguages方法返回一个string[],其中的每个string可以用来调用CodeDomProvider.CreateProvider(string name)来生成一个CodeDomProvider实例,这是另一种生成CodeDomProvider实例的方式

下面是在本机支持的所有语言,可以用作CodeDomProvider.CreateProvider(string name)参数。

c# , cs , csharp

vb , vbs , visualbasic

vbscript,js , jscript , javascript

vj# , vjs , vjsharp

c++ , mc , cpp

CompilerInfGetExtensions返回受语言提供程序支持的文件扩展名。

本段学习的代码段

1, GenerateCodeFromExpression方法

 MSDN描述:为指定的代码文档对象模型 (CodeDOM) 表达式生成代码,并使用指定的选项将代码发送到指定的文本编写器。

通俗理解:CodeEcpression输出为代码字符串

 代码准备工作:

            1CodeGeneratorOptions options=new CodeGeneratorOptions ();

            2options .BlankLinesBetweenMembers =true;

            3options .BracingStyle ="C";

            4options .ElseOnClosing =false ;

            5options .IndentString=" ";

            6options["CustomGeneratorOptionStringExampleID"] = "BuildFlags: /A /B /C /D /E";

            7StringBuilder sb = new StringBuilder(200);            

            8using (TextWriter tw = new StringWriter(sb))

1:为GenerateCodeFromExpression生成的代码提供一些选项

2获取或设置一个值,该值指示是否在成员之间插入空行。

3获取或设置用于大括号的样式。

4获取或设置一个值,该值指示是否在前面每个 if try 块的结束行处追加 elsecatch finally 块(包括括号)。

5:获取或设置用于缩进的字符串。

6获取或设置指定索引处的对象。(不理解,msdn上有备注如下

此字典为开发人员提供了一个扩展性机制,可为代码生成器的自定义功能提供数据。代码生成器必须实现这样的功能并支持检查字典,这种机制才会有用。

78:准备好GenerateCodeFromExpression的输出流.

说明:本文里出现的“输出的代码字符串为:”就是指sb.ToString()的值

测试各种CodeExpression(表达式)

  可以用这些表达式一一地对应生成的对应语言的代码

a, CodeBinaryOperatorExpression, 表示一个表达式,该表达式包含在两个表达式间进行的二进制运算。

通俗理解为基本的加减乘除之类的表达式。

CodeExpression left =new CodePrimitiveExpression(1);

CodeExpression right=new CodePrimitiveExpression(2);

CodeBinaryOperatorExpression addMethod = new CodeBinaryOperatorExpression(left,CodeBinaryOperatorType.Add,right);

codeProvider.GenerateCodeFromExpression(addMethod, tw, options);

输出的代码字符串为:(1 + 2)

 

CodeBinaryOperatorExpression left = new CodeBinaryOperatorExpression();

left.Left = new CodePrimitiveExpression(3);

left.Operator = CodeBinaryOperatorType.Multiply;

left.Right = new CodePrimitiveExpression(4); 

CodeExpression right=new CodePrimitiveExpression(2);

CodeBinaryOperatorExpression addMethod = new CodeBinaryOperatorExpression(left,CodeBinaryOperatorType.Add,right);

codeProvider.GenerateCodeFromExpression(addMethod, tw, options);

输出的代码字符串为:((3 * 4) + 2)

备注:CodePrimitiveExpression 可用于表示一个表达式,该表达式指示基元数据类型的值.

如果类型不对,在生成代码的时候会提示

 

b, CodeArgumentReferenceExpression, 表示对传递到方法的参数值的引用。

这个表达式相对简单,一笔带过

CodeArgumentReferenceExpression arg = new CodeArgumentReferenceExpression("param1");

codeProvider.GenerateCodeFromExpression(arg, tw, options);

输出的代码字符串为:param1

c, CodeArrayCreateExpression 表示创建数组的表达式。

简单地解释:如要int[] arr=new int[10]CodeArrayCreateExpression可以代表等号后面的红色部分。

CodeArrayCreateExpression arr = new CodeArrayCreateExpression("System.Int32", 10);

codeProvider.GenerateCodeFromExpression(arr, tw, options);

输出的代码字符串为:new int[10]

d, CodeArrayIndexerExpression表示对数组的索引的引用下面的代码表示应用数组X的第二个元素,X[2]

CodeVariableReferenceExpression arrName = new CodeVariableReferenceExpression("x");

CodeArrayIndexerExpression idx = new CodeArrayIndexerExpression(arrName, new CodePrimitiveExpression(2));

StringBuilder sb = new StringBuilder(200);  

codeProvider.GenerateCodeFromExpression(idx , tw, options);

输出的代码字符串为:x[2]

e, CodeBaseReferenceExpression表示对基类的引用。

base.Dispose()为例,生成前面的base

CodeBaseReferenceExpression ret = new CodeBaseReferenceExpression();

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:base

f, CodeCastExpression表示到一种数据类型或接口的表达式转换。

比如将100转换为双精度类型:

CodeCastExpression ret = new CodeCastExpression();

ret.TargetType = new CodeTypeReference("System.Double");

ret.Expression = new CodePrimitiveExpression(100); 

codeProvider.GenerateCodeFromExpression(ret , tw, options);

输出的代码字符串为:((double)(100))

g, CodeDefaultValueExpression表示对默认值的引用。

比如int的默认值表示为:default(int)

CodeDefaultValueExpression ret = new CodeDefaultValueExpression();

ret.Type = new CodeTypeReference("String");

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:default(String)

h, CodeDelegateCreateExpression表示创建委托的表达式。

CodeDelegateCreateExpression ret = new CodeDelegateCreateExpression();

ret.DelegateType = new CodeTypeReference(typeof(System.EventHandler));

ret.MethodName = "TestMethod";

ret.TargetObject = new CodeThisReferenceExpression();

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:new System.EventHandler(this.TestMethod)

i, CodeDelegateInvokeExpression表示引发事件的表达式。

CodeDelegateInvokeExpression ret = new CodeDelegateInvokeExpression();

ret.TargetObject = new CodeEventReferenceExpression(new CodeThisReferenceExpression(), "TestEvent");//对应this.TestEvent

ret.Parameters.Add(new CodeThisReferenceExpression());//对应this参数

ret.Parameters .Add (new CodeObjectCreateExpression(typeof(EventArgs )));//对应new System.EventArgs()参数

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:this.TestEvent(this, new System.EventArgs())

j,CodeDirectionExpression表示用作方法调用参数及引用方向指示器的表达式。In,out,ref3种类型

CodeDirectionExpression ret = new CodeDirectionExpression();

ret.Direction = FieldDirection.Ref;

ret.Expression = new CodeFieldReferenceExpression(null, "TestParameter");

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:ref TestParameter

K, CodeEventReferenceExpression表示对事件的引用。

CodeEventReferenceExpression ret = new CodeEventReferenceExpression();

ret.TargetObject = new CodeThisReferenceExpression();

ret.EventName = "Click";

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:this.Click

l, CodeFieldReferenceExpression表示对某字段的引用.

CodeFieldReferenceExpression ret = new CodeFieldReferenceExpression();

ret.TargetObject = new CodeThisReferenceExpression();

ret.FieldName = "m_field1";

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:this.m_field1

m, CodeIndexerExpression表示对对象的索引器属性的引用。

CodeIndexerExpression ret = new CodeIndexerExpression();

ret.TargetObject = new CodeThisReferenceExpression();

ret.Indices.Add(new CodePrimitiveExpression(1));

ret.Indices.Add(new CodePrimitiveExpression(1));

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:this[1, 1]

n, CodeMethodInvokeExpression表示调用方法的表达式。

CodeMethodInvokeExpression ret = new CodeMethodInvokeExpression();

ret.Method = new CodeMethodReferenceExpression();

ret.Method.TargetObject = new CodeThisReferenceExpression();

ret.Method.MethodName = "Dispose";

ret.Parameters.Add(new CodePrimitiveExpression(true)); 

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:this.Dispose(true)

o, CodeMethodReferenceExpression表示方法的引用。

CodeMethodReferenceExpression ret = new CodeMethodReferenceExpression();

ret.TargetObject = new CodeThisReferenceExpression();

ret.MethodName = "Dispose";

ret.TypeArguments.Add(new CodeTypeReference(typeof(Boolean)));

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:this.Dispose<bool>

如果注释掉绿色的行,则

输出的代码字符串为:this.Dispose

pCodeObjectCreateExpression表示创建某种类型的新实例的表达式。

CodeObjectCreateExpression ret = new CodeObjectCreateExpression();

ret.CreateType = new CodeTypeReference(typeof(Int32));

ret.Parameters.Add(new CodePrimitiveExpression(11));

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:new int(11)

q, CodeParameterDeclarationExpression表示方法、属性或构造函数的参数声明。

CodeParameterDeclarationExpression ret = new CodeParameterDeclarationExpression();

ret.Direction = FieldDirection.Ref;

ret.Name = "arg1";

ret.Type = new CodeTypeReference(typeof(String));

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:ref string arg1

r, CodePrimitiveExpression前面已经介绍。

sCodePropertyReferenceExpression表示属性值的引用。

CodePropertyReferenceExpression ret = new CodePropertyReferenceExpression();

ret.TargetObject = new CodeThisReferenceExpression();

ret.PropertyName = "Property1";

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:this.Property1

t, CodePropertySetValueReferenceExpression表示属性集方法内的属性集方法调用的值参数。

C#来说,就是指value

CodePropertySetValueReferenceExpression ret = new CodePropertySetValueReferenceExpression();

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:value

u, CodeSnippetExpression表示文本表达式。

文本表达式将表达式的代码存储为原义代码片段。CodeDOM 不翻译原义代码片段。原义代码片段是完全按照原样存储和输出的。提供包含原义代码的 CodeDOM 对象,以便开发人员可以封装已经成为目标语言的代码。

CodeSnippetExpression ret = new CodeSnippetExpression();

ret.Value = "任意代码段";

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:任意代码段

v, CodeThisReferenceExpression表示对当前本地类实例的引用。

它可以表示“this”“me”所引用的类对象。

CodeThisReferenceExpression ret = new CodeThisReferenceExpression();

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:this

w, CodeTypeOfExpression表示 typeof 表达式,该表达式返回指定类型名称的 Type

CodeTypeOfExpression  ret = new CodeTypeOfExpression();

ret.Type = new CodeTypeReference(typeof(int));

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:typeof(int)

x, CodeTypeReferenceExpression表示对某数据类型的引用。

CodeTypeReferenceExpression ret = new CodeTypeReferenceExpression();

ret.Type = new CodeTypeReference(typeof(DateTime));

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:System.DateTime

z, CodeVariableReferenceExpression表示局部变量的引用。

CodeVariableReferenceExpression ret = new CodeVariableReferenceExpression();

ret.VariableName = "_localVar";

codeProvider.GenerateCodeFromExpression(ret, tw, options);

输出的代码字符串为:_localVar

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

要点2

CodeCompileUnit

MSDN描述

CodeCompileUnit CodeDOM 程序图形提供容器。

CodeCompileUnit 包含以下几个集合:可以存储包含 CodeDOM 源代码图形的 CodeNamespace 对象的集合、项目引用的程序集的集合,以及项目程序集的属性集合。

CodeCompileUnit 可与其他参数一起传递给 ICodeGenerator 实现的 GenerateCodeFromCompileUnit 方法,以基于编译单元包含的程序图形生成代码。

注意:一些语言在一个编译单元中可能仅支持包含单个类的单个命名空间。