assemblyload(AssemblyLoad 加载程序集中的代码)

jk 312次浏览

最佳答案Assembly.Load: 加载程序集中的代码 程序集是.NET框架中的基本单元,它是一组拥有共同版本号、名称以及文化特性的类型、资源与其他扮演角色的组件的集合。程序集可以是动态加...

Assembly.Load: 加载程序集中的代码

程序集是.NET框架中的基本单元,它是一组拥有共同版本号、名称以及文化特性的类型、资源与其他扮演角色的组件的集合。程序集可以是动态加载的,也可以是先静态预先加载的。Assembly.Load方法可以让我们在运行时加载程序集或者动态生成一个新程序集。

如何使用Assembly.Load加载程序集?

用于动态加载程序集,我们可以使用反射操作,在程序运行中动态地创建类型,并调用这些类型中定义的方法或属性。在使用Assembly.Load方法时,我们需要考虑到以下三个因素:

1. 路径

当我们要将程序集加载到应用程序域时,我们需要提供程序集文件的正确路径。否则,.NET Framework会在指定的路径下寻找目标程序集。在加载程序集时,我们可以执行一些更复杂的行为,例如从网络下载程序集、从数据库中读取程序集等。

2. 版本号

在加载程序集时,.NET Framework使用程序集的版本号来区分已加载的程序集。当程序集的版本号不同于已加载的程序集时,.NET Framework会加载一个新程序集并将其添加到应用程序域中,而不会替换先前的程序集。这对于对程序集的版本有精确的要求的开发人员来说是非常重要的。

3. 名称与命名空间

.NET Framework使用程序集名称和命名空间来标识程序集,这些信息反映在程序集的名称上。当加载程序集时,我们需要提供程序集的名称信息。如果没有指定程序集的名称,.NET Framework会寻找默认程序集。可以通过在代码中添加以下行来指定程序集:

```csharp Assembly sampleAssembly = Assembly.Load(\"SampleAssembly\"); ```

这将在驻留在程序域中的程序集集合中加载指定的程序集。由于Assembly.Load方法是在IL代码中的P/Invoke机制,因此在运行IL代码时不需要执行额外的P/Invoke呼叫。

如何动态生成一个新程序集?

在某些情况下,我们需要在程序运行时动态地创建程序集。在使用AssemblyBuilder类时,我们需要完成以下两个任务:

1. 创建程序集的AssemblyName

这个任务需要我们为程序集指定名称,版本号、公钥、区域性以及特定标志。以下代码演示了如何创建程序集名称:

```csharp //定义程序集名称: AssemblyName assemblyName = new AssemblyName(); assemblyName.Name = \"HelloWorldAssembly\"; assemblyName.Version = new Version(\"1.0.0.0\"); ```

2. 使用AssemblyBuilder定义程序集

这个任务需要我们通过AssemblyBuilder对象,定义程序集的特定属性,例如透明级别、程序集版本号等等。以下是定义程序集的基本代码:

```csharp //定义程序集: AssemblyBuilder myAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); ```

在定义程序集时,我们可以指定程序集的访问权限。对于使用AssemblyBuilder定义程序集的开发人员来说,值得注意的一点是,在调用DefineDynamicAssembly时,我们可以通过指定透明级别,来控制程序集中类型成员的可见性。另外,我们可以使用以下代码来生成全名:

```csharp //生成全名 string fullName = $\"{assemblyName.Name}, Version={assemblyName.Version}, Culture={assemblyName.CultureInfo}, PublicKeyToken={string.Concat(assemblyName.GetPublicKeyToken().Select(b => b.ToString(\"x2\")))}\"; Console.WriteLine(fullName); ```

结论

Assembly.Load方法让我们可以在运行时动态加载程序集或者动态生成一个新程序集。在使用Assembly.Load方法来加载程序集时,我们需要提供程序集文件的正确路径、版本号以及名称与命名空间等信息。在定义程序集时,我们需要通过AssemblyBuilder对象指定程序集的特定属性,例如透明级别和程序集版本号等等。通过这些操作,我们可以在程序运行时动态地创建类型,调用这些类型中定义的方法或属性,实现动态特性。