.NET Emit 入门教程:第二部分:构建动态程序集

前言:

在本部分中,我们将深入探讨如何使用C# Emit 来创建动态程序集。

动态程序集是在运行时生成的,为我们提供了一种灵活、动态地构建和加载程序集的能力。

1. 程序集的概念

程序集是.NET中的基本部署单位,它包含了可执行代码、资源、元数据等信息,是.NET应用程序的基本组成单元之一。

与静态程序集(即程序集持久化)不同,动态程序集是在运行时生成的,使得我们可以根据需要动态地构建和加载程序集。

动态程序集的重要性体现在多个方面,包括但不限于模块化、版本控制、代码复用等。

通过动态程序集,我们可以更好地管理和组织代码,实现更灵活的程序设计和开发。

2、Emit 构建程序集支持情况:

.Net 系列:动态程序集:支持;程序集持久化:支持。

.Net Core 系列:动态程序集:支持;程序集持久化:不支持

3、Emit 创建动态程序集:

在C#中,操作程序集的核心类是:AssemblyBuilder。

在这过程,我们可以使用  AssemblyName 来定义程序集的名称和版本等信息。

AssemblyName assemblyName = new AssemblyName("MyDllName") { Version = new Version("1.0.0.0") };

创建程序集对象,在 .Net 和 .Net Core 中有所不同:

.NET 代码:通过 AppDomain.DefineDynamicAssembly 来创建动态程序集对象:

AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);

AssemblyBuilderAccess 在 .Net 系列中的属性:

AssemblyBuilderAccess.Run; 表示程序集可被执行,但不能被保存。  
AssemblyBuilderAccess.Save; 表示程序集可被保存,但不能被执行。  
AssemblyBuilderAccess.RunAndSave; 表示程序集可被保存并能被执行。
AssemblyBuilderAccess.ReflectionOnly; 表示程序集只能用于反射上下文环境中,不能被执行。 
AssemblyBuilderAccess.RunAndCollect; 表示程序集可以被卸载并且内存会被回收

.NET Core 代码:通过 AssemblyBuilder.DefineDynamicAssembly 来创建动态程序集对象:

AssemblyBuilder ab = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);

AssemblyBuilderAccess 在 .Net Core 系列中的属性:

AssemblyBuilderAccess.Run; 表示程序集可被执行,但不能被保存。  
AssemblyBuilderAccess.Collect; 表示程序集可以被卸载并且内存会被回收

可以看到,目前版本是不支持持久化功能。

4:总结:

在本章节中,我们讨论了如何使用 C# Emit 来构建动态程序集,以获得 AssemblyBuilder 这个程序集构建器,开启构建程序集的第一步。

在之后的文章,我们会讲解如何用它的 DefineDynamicModule 来定义模块,以之后构建类、成员、方法等,来实现构建完整的程序集。

当然,对于构建动态程序集,本文章到此会显的有点简单,为了避免被大伙说文章太水。

于是,打算追加一下对于构建静态程序集(即持久化程序集)的相关知识。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值