前言:
在本部分中,我们将深入探讨如何使用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 来定义模块,以之后构建类、成员、方法等,来实现构建完整的程序集。
当然,对于构建动态程序集,本文章到此会显的有点简单,为了避免被大伙说文章太水。
于是,打算追加一下对于构建静态程序集(即持久化程序集)的相关知识。