首页 > 学院 > 开发设计 > 正文

.NET 程序集高级技术与动态产生和编译源代码

2019-11-14 11:50:57
字体:
来源:转载
供稿:网友

.NET 程序集高级技术与动态产生和编译源代码

一、反射

1、反射的作用  a、使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块  b、使用 Module 了解模块的程序集以及模块中的类的信息  c、使用 ConstructorInfo 了解类的构造函数的名称、参数、访问修饰符和实现的详细信息  d、使用 MethodInfo 了解方法的名称、返回类型、参数、访问修饰符和实现详细详细(abstract或virtual)  e、使用 FieldInfo 了解方法的名称、访问修饰符和实现详细信息  f、使用 EventInfo 来了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型  g、使用 PRopertyInfo 来了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态  h、使用 ParameterInfo 来了解参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置

二、动态创建程序集

1、通过 AppDomain 对象的DefineDynamicAssembly 方法创建一个程序集框架

AppDomain domain = AppDomain.CurrentDomain;AssemblyName assemblyName = new AssemblyName();assemblyName.Name = "DynamicAssembly";AssemblyBuilder newAssembly = domain.DefineDynamicAssembly(assemblyName,AssemblyBuilderaccess.Run);ModuleBuilder newModule = newAssembly.DefineDynamicModule("SayHello");TypeBuilder classType = newModule.DefineType("MySayHello",TypeAttributes.Public);classType.IsClass = true;classType.AddInterfaceImplementation(typeof(ISayHello));Type[] paramTypes = new Type[0];Type returnType = typeof(int);MethodBuilder simpleMethod = classType.DefineMethod("SayHello",MethodAttributes.Public | MethodAttributes.Virtual,returnType,paramTypes);ILGenerator generator = simpleMethod.GetILGenerator();

2、为方法添加代码

generator.Emit(OpCodes.Ldc_I4,1);//利用 Emit 方法直接写伪代码,将 1 压入堆栈generator.Emit(OpCodes.Ret);//返回栈顶元素generator.EmitWriteLine("Hello");//IL 写入方法 DeclareLocal、DefineLabel、EmitWriteLine

3、将类型写入程序集

classType.CreateType();

三、代码文档对象模型 CodeDOM

源代码元素的类型 代表性 CodeDOM 元素
源代码文档或代码段 CodeCompileUnit
命名空间声明 CodeNamespace
命名空间声明集合 CodeNamespaceCollection
命名空间导入 CodeNamespaceImport
命名空间导入集合 CodeNamespaceImportCollection
类、结构或枚举的类型声明 CodeTypeDeclaration
类型声明集合 CodeTypeDeclarationCollection
类型成员的抽象基类 CodeTypeMember
类型成员集合 CodeMemberMethod
类字段声明 CodeMemberField
类属性声明 CodeMemberProperty
类型的构造函数 CodeConstructor
类型的静态构造函数 CodeTypeConstructor
程序入口点 CodeEntryPoint
CodeTypeMember 使用的标识符属性 MemberAttributes
对类型的引用 CodeTypeReference
对类型的引用集合 CodeTypeReferenceCollection
自定义属性声明 CodeAttributeDeclaration
自定义属性声明集合 CodeAttributeDeclarationCollection
参数声明 CodeParameterDeclarationExpression
参数声明集合 CodeParameterDeclarationExpressionCollection
自定义属性的参数 CodeAttributeArgument
自定义属性的参数集合 CodeAttributeArgumentCollection
方向表达式 CodeDirectionExpression
参数的方向 FieldDirection
语句的抽象基类 CodeStatement
代码语句集合 CodeStatementCollection
代码语句的代码表达式 CodeExpressionStatement
变量声明语句 CodeVariableDeclarationStatement
赋值语句 CodeAssignStatement
二元运算符表达式 CodeBinaryOperatorExpression
二元运算符的类型 CodeBinaryOperatorType
注释 CodeStatement
注释语句 CodeCommentStatement
注释语句集合 CodeCommentStatementCollection
类事件声明 CodeMemberEvent
委托声明 CodeTypeDelegate
创建委托的表达式 CodeDelegateCreateExpression
调用委托的表达式 CodeDelegateInvokeExpression
为事件附加委托的语句 CodeAttachEventStatement
throw 异常语句 CodeThrowExceptionStatement
try…catch…finally 代码块 CodeTryCatchFinallyStatement
catch 语句 CodeCatchClause
catch 语句块 CodeCatchClauseCollection
if 语句 CodeConditionStatement
for 循环语句 CodeIterationStatement
goto 语句 CodeGotoStatement
返回值语句 CodeMethodReturnStatement
标记语句 CodeLabeledStatement
表达式的抽象基类 CodeExpression
代码表达式集合 CodeExpressionCollection
将对象或表达式强制转换为数据类型的表达式 CodeCastExpression
基元值表达式 CodePrimitiveExpression
typeof 表达式 CodeTypeOfExpression
数组索引器 CodeArrayIndexerExpression
对参数的引用 CodeArgumentReferenceExpression
对变量的引用 CodeVariableReferenceExpression
引用类型的表达式 CodeTypeReferenceExpression
属性集的值参数表达式 CodePropertySetValueReferenceExpression
创建对象的表达式 CodeObjectCreateExpression
创建数组的表达式 CodeArrayCreateExpression
调用方法的表达式 CodeMethodInvokeExpression
类型索引器 CodeIndexerExpression
对基类的引用 CodeBaseReferenceExpression
对字段的引用 CodeFieldReferenceExpression
对方法的引用 CodeMethodReferenceExpression
对属性的引用 CodePropertyReferenceExpression
对事件的引用 CodeEventReferenceExpression
对当前对象的引用 CodeThisReferenceExpression
可编译的文件代码单元 CodeSnippetCompileUnit
类成员的文本元素 CodeSnippetTypeMember
表达式的文本代码元素 CodeSnippetExpression
CodeDOM 对象的抽象基类 CodeObject
表示包含文件名和行号的位置 CodeLinePragma

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表