首页 > 编程语言 >如何使用反射动态加载程序集

如何使用反射动态加载程序集

时间:2023-08-13 12:55:28浏览次数:29  
标签:反射 Assembly Type 程序 使用 动态 方法 加载

在C#中,我们可以使用反射Reflection来动态加载程序集。动态加载程序集是一种在运行时根据需要加载程序集的技术,而不是在编译时将其硬编码到应用程序中。
应用场景具体:为应用程序开发自定义插件。在应用程序中,我们可以使用反射来动态加载插件程序集,然后使用插件中的类型。

比如有如下的程序集:

namespace DynamicLoadAndExecute.Library
{
    public class Dog
    {
        public void Speak(string? name)
        {
            System.Console.WriteLine($"Woof... {name}");
        }
    }
}

要动态加载程序集,我们需要使用Assembly类和Type类。

  1. 使用Assembly.Load方法加载程序集。这个方法接受程序集的名称作为参数,并返回一个Assembly对象,表示已加载的程序集。
Assembly assembly = Assembly.Load("DynamicLoadAndExecute.Library");
  1. 使用Assembly.GetType方法获取程序集中的类型。这个方法接受类型的名称作为参数,并返回一个Type对象,表示已加载的类型。
Type type = assembly.GetType("DynamicLoadAndExecute.Library.Dog");
  1. 使用Type.GetMethod方法获取类型中的方法。这个方法接受方法的名称作为参数,并返回一个MethodInfo对象,表示已加载的方法。
MethodInfo methodInfo = type.GetMethod("Speak");
  1. 使用Activator.CreateInstance方法创建对象实例。这个方法接受类型的名称作为参数,并返回一个object对象,表示已创建的对象实例。使用MethodInfo.Invoke调用方法。这个方法接受对象实例和方法参数作为参数,并返回一个object对象,表示方法的返回值。
object? dogInstance = Activator.CreateInstance(type);
methodInfo.Invoke(dogInstance, new object?[] { "Buddy" });

标签:反射,Assembly,Type,程序,使用,动态,方法,加载
From: https://www.cnblogs.com/mryanxiu/p/17626406.html

相关文章

  • 学习IDA权威指南-加载器-处理器模块
    有时候,分析一个二进制文件,会发现IDA自带的加载器全部失效了可执行文件选择二进制文件未知文件分析需要了解文档IDA加载器模块IDA处理器模块1-python字节码跟java类似,可以将源代码编译为字节码,然后交于虚拟机执行2-python解释器3-使用SDK编写处理器模块有以下几个步骤1-processor-t......
  • JVM——类加载机制
    任何一个类型在使用之前都必须经历过完整的加载、连接和初始化3个类加载步骤。一旦一个类型成功经历过这3个步骤之后,它就可以随时随地被使用了,开发人员可以在程序中访问和调用它的静态类成员信息(比如:静态方法、静态字段),或者使用new关键字为其创建对象实例。当然从一个类型被加载进......
  • 记录--Loading 用户体验 - 加载时避免闪烁
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助在切换详情页中有这么一个场景,点击上一条,会显示上一条的详情页,同理,点击下一条,会显示下一条的详情页。伪代码如下所示:我们定义了一个 switcher 模版,用户点击上一条、下一条时调用 goToPreOrNext 方法。该页面......
  • 注解和反射
    注解和反射1、注解什么是注解?类似@Override注解,注解可以被其他程序所读取,进行信息处理1.1内置注解就是jdk自带的注解如@Override:定义在java.lang.Override中,只适用于修辞方法,表示当前被修辞的方法用于从写父类中的另一个方法​ @Deprecaed:该注解的作用是修辞方法,属性,类,告诉......
  • JDK中动态库加载路径问题,一文讲清
    前言本周协助测试同事对一套测试环境进行扩容,我们扩容很原始,就是新申请一台机器,直接把jdk、resin容器(一款servlet容器)、容器中web应用所在的目录,全拷贝到新机器上,servlet容器和其中的应用启动没问题。以为ok了,等到测试时,web应用报错,初始化某个类出错。报错的类长下面这样:com.thi......
  • Flutter中的加载指示器
    Flutter提供了多种加载指示器样式供选择。你可以使用CircularProgressIndicator以外的其他加载指示器样式来替换原有的加载指示器。以下是一些常见的加载指示器样式,你可以根据自己的需要选择其中之一:一、LinearProgressIndicator:线性进度指示器,呈现为水平进度条。LinearProgressInd......
  • Devexpress xtraTabControl1实现多标签页选项卡,关闭选项卡,刷新重新加载
    //选项卡Dictionary<string,XtraTabPage>dictXtraTabPage=newDictionary<string,XtraTabPage>();Dictionary<string,Form>dictXtraForm=newDictionary<string,Form>();publicvoidShowMDIForm(string......
  • Vue 路由懒加载
    1路由懒加载的原理路由懒加载是一种优化技术,用于延迟加载应用程序中的路由组件。它可以提高初始加载速度并减少资源消耗,特别适用于大型单页应用。1.1为什么要使用路由懒加载当应用程序包含多个页面和路由时,如果在初始加载时将所有路由组件都打包到一个文件中,会导致初始加载时......
  • R语言中贝叶斯网络(BN)、动态贝叶斯网络、线性模型分析错颌畸形数据|附代码数据
    最近我们被客户要求撰写关于贝叶斯网络的研究报告,包括一些图形和统计输出。贝叶斯网络(BN)是一种基于有向无环图的概率模型,它描述了一组变量及其相互之间的条件依赖性。它是一个图形模型,我们可以很容易地检查变量的条件依赖性和它们在图中的方向在这篇文章中,我将简要地学习如何用R来......
  • Java反射机制
    Java代理代理模式:提高真实对象的封装性、拓展性,采用代理对象来代替对真实对象的访问,在不修改原目标对象的基础上,进行额外的功能操作。Java代理分为静态代理和动态代理静态代理直接上代码比较好说明首先我有一个Person的接口类,定义苏醒和睡眠两种函数声明//接口提供函数声......