30天C#基础巩固----程序集,反射

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 30天C#基础巩固----程序集,反射

一:认识程序集


     只要是使用VS就会和程序集打交道,我们通过编辑和生产可执行程序就会自动生成程序集。那么什么事程序集呢,.net中的dll与exe文件的都是程序集(Assembly)。


     可以看做是一堆相关类打包的包,相当于java中的jar包(*);


     程序集包含:类型元数据,程序集元数据,IL代码,资源文件


     类型元数据:描述在代码中定义的每一类型和成员的二进制形式。


     程序集元数据:程序集清单,版本号,名称等;


     IL代码:被微软封装到了exe和IL中。


     资源文件:每个程序集都有自己的名称,版本等信息,都可以通过AssemblyInfo.cs文件来自己定义。


 好处:程序中只引用必须的程序集,减小程序的尺寸。可以封装一个代码,只提供必要的访问接口。



二:反射学习


    反射看似很高深,听起来不太的容易理解,但是我们要是经常的使用它,那就会变得很简单。


vs的智能提示就是通过反射来获取到类的属性,方法等,还有反编译工具也是。


    定义:反射就是动态的获取程序集中的元数据来操作类型的。反射就是直接通过调用.dll来创建对象,调用成员的。通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法等,这个就是反射。


   Type类是实现反射的重要类,通过它可以获取到类中的所有信息包括方法,属性等,可以动态的调用类,方法,Type是对类的描述,反射让创建对象的方式发生了变化。


  • Assembly里面存储的是我们调用程序集的一些东西,我们通过这个类来进行调用程序集。


  • 通过 Activator.CreateInstance()来使用反射创建实例化对象。返回的是object类型。


  • 通过 minfo.Invoke(object,null)来调用类库中的方法。第一个是对象类型,第二个是我们调用方法的参数列表。


eg1:


    读取Clb.dll文件,读取里面所有的类(Type)。


Clb.dll文件


namespace Clb
{
    public class Class1
    {
        //属性
        private int Age { get; set; }
        //方法
        public void SayHi()
        {
            Console.WriteLine("你好世界 ?");
        }
        //接口
        public interface IFlyable
        {
            void Fly();
        }
        //委托
        public delegate void MyDelegate();
    }
}


main()方法


static void Main(string[] args)
{
    //通过Assembly来取到本地的程序集。
    Assembly asm = Assembly.LoadFile("C:/Clb.dll");     //注意它的返回值
    Type[] type=asm.GetTypes();                            //得到所有的类型,注意返回值。
    foreach (Type item in type)
    {
        Console.WriteLine(item.Name);
    }
    Console.Read();
}

679140-20160605233034727-488707976.png


获取只有public类型的


//只获取public类型
Type[] type = asm.GetExportedTypes();


出现错误如下,解决办法是我们的设置有问题,在调试--选项和设置---常规(下图),这样就可以读取到本地的dll文件了。


679140-20160605233036914-630120259.png


679140-20160605233038899-968980948.png



eg:加载Class1中的所有方法。


//加载程序集
 Assembly asm = Assembly.LoadFile("C:/Clb.dll");
 //获取Class1下这个类型,typeclass描述Class1类的type,里面存储的是class1的一些相关信息,。
 Type typeclass= asm.GetType("Clb.Class1");
 //获取class1中的所有方法 ,注意返回值。
MethodInfo[] minfo= typeclass.GetMethods(); 
 foreach (MethodInfo item in minfo)
 {
     Console.WriteLine(item.Name);
 }
 Console.Read();


下面图片里面的方法我们的类中没有,那是我们object基类的一些公共方法。


679140-20160605233040821-21340056.png


eg:

  通过反射来创建对象,调用类库中的方法。


//1:加载程序集
Assembly asm = Assembly.LoadFile("C:/Clb.dll");
//2:获取Class1下这个类型,typeclass描述Class1类的type,里面存储的是class1的一些相关信息,。
Type typeclass= asm.GetType("Clb.Class1");
//3:获取class1中的所有方法 ,注意返回值。
MethodInfo minfo = typeclass.GetMethod("SayHi");
Console.WriteLine(minfo.Name);
//创建一个Class1类型对象
object obj = Activator.CreateInstance(typeclass);
//通过反射来调用方法
minfo.Invoke(obj, null);            
Console.Read();



679140-20160605233042602-337145399.png


三:Type类的使用


     通过类获取Type;通过对象获取类的Type,通过Assembly类获取Type。


679140-20160605233045649-858752317.png


Person p=new Person();
//通过基类的GetType类获取Type
Type t= p.GetType();
//通过typeof来获取。
Type ts = typeof (Person);
//通过程序集来获取;
Assembly asm = Assembly.LoadFile("C:/Clb.dll");
Type tss = asm.GetType("Clb.dll.Person");



目录
相关文章
|
3月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
177 2
|
6天前
|
程序员 C# 数据库
C# 比较对象新思路,利用反射技术打造更灵活的比较工具
中途接手的项目,碰到需要在更新对象信息时比较并记录差异的需求,最变态的还有附加要求,怎么办?有没有既能满足需求又能对项目影响最小的方法呢?分享这个我封装的方法,一个利用反射技术打造的更灵活的比较工具
|
27天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
85 13
|
7月前
|
存储 安全 Java
程序与技术分享:C#值类型和引用类型的区别
程序与技术分享:C#值类型和引用类型的区别
51 0
|
3月前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
258 0
|
3月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
134 0
|
4月前
|
C# 容器
C#中的命名空间与程序集管理
在C#编程中,`命名空间`和`程序集`是组织代码的关键概念,有助于提高代码的可维护性和复用性。本文从基础入手,详细解释了命名空间的逻辑组织方式及其基本语法,展示了如何使用`using`指令访问其他命名空间中的类型,并提供了常见问题的解决方案。接着介绍了程序集这一.NET框架的基本单位,包括其创建、引用及高级特性如强名称和延迟加载等。通过具体示例,展示了如何创建和使用自定义程序集,并提出了针对版本不匹配和性能问题的有效策略。理解并善用这些概念,能显著提升开发效率和代码质量。
149 4
|
3月前
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
82 0
|
3月前
|
API C#
C#实现Winform程序右下角弹窗消息提示
C#实现Winform程序右下角弹窗消息提示
149 0
|
4月前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
124 2