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

常见的两种程序集:
可执行文件(.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.mzph.cn/bicheng/20929.shtml

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

相关文章

java —— 匿名内部类与 Lambda 表达式

一、匿名内部类 匿名内部类是一种没有名称的类&#xff0c;多用于只使用一次的情况&#xff0c;本质上就是其所继承的父类或接口的一个子类。 &#xff08;一&#xff09;继承普通类的情况 public class Test{public void method(){System.out.println("通用方法"…

Python与Android连接:深入探索与实现

Python与Android连接&#xff1a;深入探索与实现 在现代移动应用开发领域&#xff0c;Python和Android的结合使用为开发者带来了无限的可能性。这种跨平台的组合不仅拓宽了开发者的视野&#xff0c;也极大地提升了应用的灵活性和可扩展性。本文将从四个方面、五个方面、六个方…

【NLP开发】Python实现聊天机器人(微信机器人)

&#x1f37a;NLP开发系列相关文章编写如下&#x1f37a;&#xff1a;1&#x1f388;【小沐学NLP】Python实现词云图&#x1f388;2&#x1f388;【小沐学NLP】Python实现图片文字识别&#x1f388;3&#x1f388;【小沐学NLP】Python实现中文、英文分词&#x1f388;4&#x1…

转让北京电力施工总承包二级资质变更条件和流程

在电力工程领域&#xff0c;资质等级是企业能否参与竞标、承接工程的重要标志之一。北京电力工程总包二级资质的转让&#xff0c;是指已经取得该资质的企业将其资质转让给需要的企业。这种转让是基于合作与共赢的原则&#xff0c;旨在推动电力工程行业健康、稳定发展&#xff0…

记录使用自定义编辑器做试题识别功能

习惯了将解析写在代码注释&#xff0c;这里就直接上代码啦&#xff0c;里面用到的bxm-ui3组件库是博主基于element-Plus做的&#xff0c;可以通过npm i bxm-ui3自行安装使用 // 识别方法&#xff1a; // dom 当前识别数据所在区域, questionType 当前点击编辑选择的题目类型&a…

力扣刷题--LCR 135. 报数【简单】

题目描述 实现一个十进制数字报数程序&#xff0c;请按照数字从小到大的顺序返回一个整数数列&#xff0c;该数列从数字 1 开始&#xff0c;到最大的正整数 cnt 位数字结束。 示例 1: 输入&#xff1a;cnt 2 输出&#xff1a;[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,1…

codeblock怎么编程:从入门到精通的全面指南

codeblock怎么编程&#xff1a;从入门到精通的全面指南 在数字化时代&#xff0c;编程已成为一项不可或缺的技能。Code::Blocks作为一款流行的开源集成开发环境&#xff08;IDE&#xff09;&#xff0c;为初学者和有经验的开发者提供了强大的编程支持。那么&#xff0c;codebl…

C是结构化编程语言吗:深度剖析与多维度解读

C是结构化编程语言吗&#xff1a;深度剖析与多维度解读 在编程语言的浩瀚海洋中&#xff0c;C语言以其独特的魅力占据着重要的地位。那么&#xff0c;C语言是否可以被归类为结构化编程语言呢&#xff1f;这是一个值得深入探讨的问题。本文将从四个方面、五个方面、六个方面和七…

Qt | Qt 资源简介(rcc、qmake)

1、资源系统是一种独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件(前面所讨论的数据都存储在外部设备中)。若应用程序始终需要一组特定的文件(比如图标),则非常有用。 2、资源系统基于 qmake,rcc(Qt 的资源编译器,用于把资源转换为 C++代码)和 QFile …

java—MyBatis框架

简介 什么是 MyBatis&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&…

软件公司为什么必须要使用低代码系统?

在当今软件行业全国比较内卷的大环境下&#xff0c;软件公司面临着前所未有的挑战。为了在这个竞争激烈的市场中生存并脱颖而出&#xff0c;驰骋低代码设计者认为&#xff0c;软件公司必须要使用低代码系统。以下是几个关键的原因&#xff1a; 时代发展的必然选择 低代码系统是…

领导力中的说服艺术

本文主要介绍了亚里士多德修辞三角理论&#xff0c;即演讲者在说服听众时如何运用品格&#xff08;Ethos&#xff09;、情感&#xff08;Pathos&#xff09;和逻辑&#xff08;Logos&#xff09;三种基本的修辞手法。原文: The Art of Persuasion in Leadership 亚里士多德的说…

Kubernetes面试题分享

目录 前言 1.Kubernetes的控制平面包括哪些核心组件&#xff1f;它们各自的作用是什么&#xff1f; 2.Kubernetes的数据平面涉及哪些组件&#xff1f;它们如何协作&#xff1f; 3.什么是Pod&#xff1f;为什么它是Kubernetes的基本单元&#xff1f; 4.Service如何实现服务…

【自动驾驶技术】自动驾驶汽车AI芯片汇总——地平线篇

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 本篇文章是这个系列的第二篇&#x…

[AIGC] DAG任务调度的概述与实践

DAG(Directed Acyclic Graph&#xff0c;有向无环图)作为任务调度的基础模型&#xff0c;在大规模数据处理和计算过程中有着广泛的应用。本文将对DAG模型的原理进行解释并列出一些常用的任务调度工具。 文章目录 一、什么是DAG&#xff1f;二、DAG任务调度的原理三、常用的DAG任…

50个常用的Docker命令及如何使用

这里整理了50个常用的Docker命令以及每个命令的使用方法。 docker version:显示Docker版本信息。 示例:docker version docker info:显示Docker系统信息。 示例:docker info docker pull <image>:从Docker Hub下载镜像。 示例:docker pull ubuntu docker run <i…

spring xml配置文件中的bean标签属性

概述 在Spring框架中&#xff0c; 标签用于定义和配置 Spring 容器管理的对象&#xff08;即 bean&#xff09;。 标签有许多属性&#xff0c;每个属性都用来配置 bean 的特定方面。下面是一些主要属性及其默认值的详细说明。 属性 1 id 说明: 用于标识 bean 的唯一标识符。…

一文带你了解python

一文带你了解python 简单介绍 python是脚本语言,不需要在使用变量前进行声明,代码不需要编译,由解释器来解释执行。python简洁的语法可以让你写出比静态语言更短的程序。使用交互式解释器时,会自动打印输入的一些包含值的东西;在非交互式的程序中,需要使用print函数打印…

Python获取文件MD5值方法

Python的标准库中提供了一个名为hashlib的模块&#xff0c;可以用来生成MD5值。 下面是两个方法的实现&#xff1a; 1. 通过文件路径获取MD5值&#xff1a; import hashlibdef calculate_md5_file(file_path):md5 hashlib.md5()with open(file_path, "rb") as f:…

启发式算法教程(个人总结版)

1. 引言 1.1 什么是启发式算法 启发式算法是一类用于寻找复杂优化问题近似解的方法&#xff0c;特别适用于在计算资源有限的情况下求解大型问题。与精确算法不同&#xff0c;启发式算法不保证找到全局最优解&#xff0c;但能在可接受的时间内提供一个质量较高的解。 1.2 启发…