C# 反射类Assembly 程序集(Assembly)用法

news2024/11/15 15:52:59

常见的两种程序集:
可执行文件(.exe文件)和 类库文件(.dll文件)。
在VS开发环境中,一个解决方案可以包含多个项目,而每个项目就是一个程序集。

他们之间是一种从属关系,也就是说,一个AppDomain能够包括N个Assembly,一个Assembly能够包括N个Module,一个Module能够包括N个Type,一个Type能够包括N个成员。他们都在System.Reflection命名空间下。【公共语言运行库CLR】加载器 管理 应用程序域,这种管理包括 将每个程序集加载到相应的应用程序域 以及 控制每个程序集中类型层次结构的内存布局。

模块是可移植的可执行文件,例如 type.dll 或 application.exe,由一个或多个类和接口组成。 单个模块可包含多个命名空间,而一个命名空间可跨越多个模块。

Assembly介绍
Assembly类即程序集类,用来加载其他程序集,加载后可以用Type来使用其他程序集中的信息,如果想要使用其它程序集中的内容,需要先加载程序集。

加载程序集的三种方法:

①、一般用来加载同一文件下的其他程序集

Assembly assembly = Assembly.Load(“AssemblyName”);

②、一般用来加载不再同一文件下的其他程序集

Assembly assembly = Assembly.LoadFrom(“包含程序集清单的文件的名称或路径”);

Assembly assembly = Assembly.LoadFile(“要加载的文件的完全限定路径”);

使用方法:

Assembly asm = Assembly.LoadFrom("Demo.dll");//需要加后缀,可以指定路径,如:Assembly.LoadFrom(@"C:\Users\majm\source\repos\ConsoleApp29\bin\Debug\TestDll.dll");

Assembly asm = Assembly.Load("Demo");//无需加后缀,不可以指定路径,

使用Load可以加载当前程序bin目录行下的程序集或者系统程序集

定义数据模型:创建类库并生成dll

 
namespace TestDll
{
    public class Person
    {
        public Person()
        {
            Name = "zls";
            Age = 18;
            id = 20;
        }
 
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
            id = 21;
        }
 
        public string Name { get; set; }
        public int Age { get; set; }
 
        public int id;
 
        public int Score(int a, int b)
        {
            return a + b;
        }
    }
}

Assembly assembly = Assembly.LoadFrom(@"F:\2025\study\CsAssembly\TestDll\bin\Debug\TestDll.dll");
Type[] types = assembly.GetTypes();
for (int i = 0; i < types.Length; i++)
{
    Console.WriteLine(types[i]);
}

运行结果:

第二步:加载程序集中类对象:并调用方法传入参数

 Type c1 = types[1];
 object obj = Activator.CreateInstance(c1);
 //调用Class1类中的Speak方法
 MethodInfo speak = c1.GetMethod("Score");
 object[] o = new Object[2] { 12, 13 };
 var result = speak.Invoke(obj, o);
 Console.WriteLine(result);

运行结果:25

这里还可以这样如下去创建实例:(未验证)

 
  Type c1 = types[0];
            Assembly asm = Assembly.GetAssembly(c1);
            Person person = (Person)asm.CreateInstance("TestDll.Person", true);//true:不区分大小写
 
            //调用Person1类中的Score方法
            MethodInfo speak = c1.GetMethod("Score");
            object[] o = new Object[2] {12,13 };
            var result = speak.Invoke(person, o);
            Console.WriteLine(result);

一样的效果,如果是当前程序集,可以GetExecutingAssembly获取程序集

 Assembly asm = Assembly.GetExecutingAssembly();

二、Assembly程序集对象

1.获得当前对象所属的类所在的程序集

 this.GetType().Assembly;

2.根据路径加载程序集

 Assembly.LoadFrom(assPath);

3.获得当前【应用程序域】中的所有程序集

 Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();

 foreach(Assembly assembly2 in ass)
 {
     MessageBox.Show($"assembly={assembly2}");
 }

三、Type类型对象

1.获得程序集中定义的所有的public类

2.获得程序集中定义的所有的类

//获得程序集中定义的所有的public类
 Type[] allPublicTypes = ass1.GetExportedTypes();
//获得程序集中定义的所有的类
 Type[] allTypes = ass1.GetTypes();

 3.用assembly对象,通过类的full name类获得type对象

Assembly ass1 = Assembly.LoadFrom(@"F:\2025\study\CsAssembly\TestDll\bin\Debug\TestDll.dll");
//GetType的参数一定要是full name的string
Type tStu = ass1.GetType("TestDll.Student"); 
//Activator通过类型创建实体
object stu1 = Activator.CreateInstance(tStu);

 //强制转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1793258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【YOLOv10改进[CONV]】2024年的DynamicConv助力YOLOv10目标检测效果 + 含全部代码和详细修改方式 + 手撕结构图 + 全网首发

本文将使用2024的DynamicConv助力YOLOv10目标检测效果的实践,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法。 改进前和改进后参数量对比: 目录 一 DynamicConv

PyTorch 相关知识介绍

一、PyTorch和TensorFlow 1、PyTorch PyTorch是由Facebook开发的开源深度学习框架&#xff0c;它在动态图和易用性方面表现出色。它以Python为基础&#xff0c;并提供了丰富的工具和接口&#xff0c;使得构建和训练神经网络变得简单快捷。 发展历史和背景 PyTorch 是由 Fac…

EDA数据跨网交换解决方案,一文了解

EDA数据通常与电子设计自动化相关&#xff0c;这是一种利用计算机辅助设计&#xff08;CAD&#xff09;软件来完成超大规模集成电路&#xff08;VLSI&#xff09;芯片的功能设计、综合、验证、物理设计等流程的技术。以下是一些会涉及到EDA数据的行业&#xff1a; 集成电路设计…

生命在于学习——Python人工智能原理(3.2)

三、深度学习 &#xff08;二&#xff09;人工神经网络 人工神经网络是模仿人类大脑神经系统工作原理所创建的数学模型&#xff0c;有并行的分布处理能力、高容错性和自我学习等特征。 1、感知器 感知器由Frank Roseblatt于1957年提出&#xff0c;是一种广泛使用的线性分类…

桌面型激光雕刻机的发展前景及TMC应用优势

一、行业现状 近两年来&#xff0c;激光雕刻行业正处于快速发展阶段。随着人们生活水平的提高&#xff0c;对个性化、定制化产品的需求日益增加&#xff0c;激光雕刻以其独特的创意和精美的效果&#xff0c;满足了消费者对个性化产品的追求。同时&#xff0c;随着科技的不断进…

svg完成鼠标样式并使用

本次分享的是通过svg标签实现的鼠标样式&#xff0c;并在页面中进行使用的整个过程&#xff0c;最后还会分享快速制作svg的简单方式。 如有改进的方法或者发现错误也可以在评论区留言啊。 一、鼠标的svg样式 1.小飞机型 <svg width"32" height"32" xml…

[行业原型] 汽车供应链多地分销一站式云端解决方案

互联网改变了企业经营模式、竞争环境&#xff0c;同时还在改变企业的交易方式&#xff0c;影响着企业间的协作。 全球化电子商务环境下&#xff0c;传统的供应链管理模式不能适应新环境下供应链管理要求&#xff0c;新的供应链管理模式—eSCM。 eSCM是将分销管理、客户资源管理…

Xilinx RFSOC 47DR 8收8发 信号处理板卡

系统资源如图所示&#xff1a;  FPGA采用XCZU47DR 1156芯片&#xff0c;PS端搭载一组64Bit DDR4,容量为4GB,最高支持速率&#xff1a;2400MT/s;  PS端挂载两片QSPI X4 FLASH&#xff1b;  PS支持一路NVME存储&#xff1b;  PS端挂载SD接口&#xff0c;用于存储程序&…

Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

Mac 苹果电脑下载安装《植物大战僵尸杂交版2.0.88》详细指南教程(含已损坏打不开等问题解决)

最近植物大战僵尸杂交版可是非常的火爆&#xff0c;各大主播都在玩&#xff0c;可是该游戏作者只发布了win版本&#xff0c;我只有一台 Macbook 一直都很想玩&#xff0c;经过一番折腾终于在Mac上成功安装运行了该游戏&#xff0c;并整理好了&#xff0c;大家想要在 Mac 上安装…

win11通过网线分享网络到Ubuntu工控机

1.条件&#xff1a;一个能无线联网的win11&#xff0c;一根网线&#xff0c;一台Ubuntu工控机&#xff0c;并且使用网线连接两者 2.在win11电脑上 2.1 打开控制面板的网络和Internet 2.2 进入网络和共享中心&#xff0c;在左侧进入 更改适配器设置 2.3 在WLAN上右键&#xff0…

客户案例 | 思腾合力助力国内某自动化研究所算力平台建设

国内某自动化研究所&#xff0c;其主要研究方向是机器人、智能制造与光电信息技术。其所着眼于国民经济和国家安全重大战略需求&#xff0c;凝练研究方向&#xff0c;在机器人与智能制造领域着重开展创新研究&#xff0c;在机器人学、工业机器人、水下机器人、空间机器人及自动…

“新高考”下分班怎么分?

来自安徽的张女士告诉我&#xff1a;上一年孩子升入了高中&#xff0c;但没想到才高一&#xff0c;孩子就面临了一个困难的挑选&#xff1a;312”分班&#xff01; 什么是312”分班呢&#xff1f;许多人或许不明白&#xff0c;便是要求学生在高一入学时&#xff0c;针对于3门必…

1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java密室逃脱管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

Linux服务器扩容及磁盘分区(LVM和非LVM)

Linux扩容及磁盘分区&#xff08;LVM和非LVM&#xff09; 本文主要介绍了阿里云服务器centos的扩容方法&#xff1a;非LVM分区扩容方法&#xff08;系统盘&#xff09;&#xff0c;以及磁盘改LVM并分区&#xff08;数据盘&#xff09;。主要是ext4文件系统及xfs磁盘scsi MBR分…

GD32/STM32系列GPIO工作模式

知不足而奋进 望远山而前行 目录 文章目录 前言 浮空输入 上拉输入 下拉输入 模拟输入 推挽输出 开漏输出 复用推挽输出 复用开漏输出 附录(了解) 总结 前言 在嵌入式系统开发中&#xff0c;对于GPIO&#xff08;通用输入输出端口&#xff09;的配置和使用是至关重…

各大AI模型训练成本大比拼

像OpenAI的ChatGPT、谷歌的Gemini Ultra这样的高级AI模型&#xff0c;训练它们通常需要数百万美元的费用&#xff0c;且该成本还在迅速上升。随着计算需求的增加&#xff0c;训练它们所需的计算能力的费用也在飙升。为此&#xff0c;AI公司正在重新考虑如何训练这些生成式AI系统…

定制高温隧道炉,如何判断质量好坏

在现代工业生产中&#xff0c;高温隧道炉扮演着不可或缺的角色。对于特定工艺要求&#xff0c;如陶瓷烧制、金属热处理等&#xff0c;定制化的高温隧道炉更是不可或缺。然而&#xff0c;面对市场上琳琅满目的产品&#xff0c;如何判断高温隧道炉的质量好坏成为了企业决策者面临…

灵动岛动效:打造沉浸式用户体验

灵动岛是专属于 iPhone 14 Pro 系列交互UI&#xff0c;通过通知消息的展示和状态的查看与硬件相结合&#xff0c;让 iPhone 14 Pro 系列的前置摄像头和传感器的“感叹号”&#xff0c;发生不同形状的变化。这样做的好处是让虚拟软件和硬件的交互变得更为流畅&#xff0c;以便让…

Git 版本控制系统详解

目录 Git 版本控制系统详解一、Git 的作用1. 版本控制2. 分支管理3. 分布式开发4. 协作开发 二、Git 的安装和基本使用1. 安装 Git1.1 Windows1.2 macOS1.3 Linux 2. 配置 Git3. 创建和克隆仓库3.1 创建本地仓库3.2 克隆远程仓库 4. 基本操作4.1 添加文件到暂存区4.2 提交更改4…