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

.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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值