反射程序集

通过Type,我们可以对任何类型进行反射读取,同样,也可以把读取的对象的范围扩大。

一,关于程序集

在.net中,程序集是进行部署,版本控制的基本单元;

System.reflection命名空间下的Assembly类型,代表了一个程序集,并包含了关于程序集的信息。

获取assembly对象的方法:

loadForm 参数:程序集的文件名称(如果加载一个不属于当前项目的程序集,则要写上全名)

Load  参数:提供程序集名称即可,而非文件名称。

二,反射程序集示例

首先,我们建立如下结构解决方案:

然后在Test类库中的class1里面添加如下测试内容:

namespace Test
{
    public abstract class BaseClass { }

    public struct DemoStruct { }

    public delegate void DemoDelegate(Object sender,EventArgs e);

    public enum DemoEnum { terrible,bad,common=4,good,wonderful=8}

    public interface IDemoInterface {

        void SayGreeting(string name);

    }

    public interface IdemoInterface2 { }

    public sealed class DemoClass : BaseClass, IDemoInterface, IdemoInterface2 {

        private string name;
        private string city;
        public  readonly string title;
        public const string text = "const field";
        public event DemoDelegate myEvent;

        public string Name {

            private get { return name; }
            set { name = value; }

        }

        public DemoClass() {

            title = "Readonly field";

        }

        public class NestedClass { }

        public void SayGreeting(string name)
        {

            Console.WriteLine("morning:"+name);
        }

    }
}

接着,我们就使用Assembly来获取程序集:

namespace 反射程序集
{
    class Program
    {
        static void Main(string[] args)
        {
            AssemblyExplore();

        }

        //查看Test程序集中的全部类型
        public static void AssemblyExplore() {

            StringBuilder sb = new StringBuilder();

            Assembly asm = Assembly.Load("Test");  //加载Test
            sb.AppendLine("全名:"+asm.FullName); //输出全名
            sb.AppendLine("路径:"+asm.Location);//输出路径

            Module[] modules = asm.GetModules();  //获取程序集中所有模块
            foreach (Module model in modules )   //遍历模块数组
            {
                sb.AppendLine("模块:"+model);
                Type[] types = model.GetTypes();  //得到模块里面的各种类,接口啥的。。。
                foreach (Type t in types)
                {
                    sb.AppendLine("  类型:"+t);   //看看啥类型滴。。。。
                }

            }

            Console.WriteLine(sb.ToString());

        }
    }

}

查看我们运行结果:

真的好神奇呀~~~等等,是不是想起以前设计模式中读取配置文件,然后反射加载D层了呢?

时间: 2024-07-28 20:45:01

反射程序集的相关文章

反射 | 程序集

什么是程序集: 程序集是.net中的概念,net中dll和exe都是程序集,他们的区别就是exe可以直接执行(因为它有入口main函数,而dll没有,)而dll 不可以直接执行,它没有入口main函数,它是供其他程序来调用的 控制台应用程序最后编译成了exe文件,而类库编译生成了dll文件 什么是放射: 放射就是通过编程的方式,动态加载程序集,并获取里面类型,并创建对象,调用其成员的过程,这就是反射 <1> 我们来首先在解决方案下创建一个类库,命名为"TestDll"  代

14反射程序集

1.什么是程序集? 程序集是.net中的概念. .net中的dll与exe文件都是程序集.程序集(Assembly),可以看作是一堆相关类打一个包,相当于Java中的jar包(*) 程序集包含:类型元数据(描述在代码中定义的每一类型和成员,二进制形式).程序元数据(程序集清单.版本号.名称等).IL代码(这些都被装在exe或dll中).资源文件.每个程序集都有自己的名称.版本等信息.这些信息可以通过AssemblyInfo.cs文件来定义. 使用程序集的好处: 程序中只引用必须的程序集,减小程序

【C#反射程序集】

一.在.NET中,程序集是进行部署,版本控制的基本单元.System.Reflection命名空间中的Assembly类型,代表了一个程序集.并包含了关于程序集的信息. 二.获取程序集的信息: 创建一个控制台项目,添加一个类库项目,命名为Model,里面有一个User类. static void Main(string[] args) { //1.使用LoadFrom,前提当前项目有该程序集的引用 Assembly asm = Assembly.LoadFrom("Model.dll"

Type.GetType()在跨程序集反射时返回null的解决方法

在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll获取程序集B.dll中的类型,就会返回Null. 关于跨程序集的反射,有两点需要注意: 1.如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行.可以说,typeof是支持强类型的.比如 1 Type supType = typeof(BNameSpace

Type.GetType()与 typeof跨程序集反射

原博地址:http://www.cnblogs.com/hyl8218/archive/2010/02/19/1667440.html 上一篇的热更新还不够完善,所以另外查了下相关资料,准备做一个完整的热更新系统. 在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll获取程序集B.dll中的类型,就会返回Null. 关于

概述反射和序列化

1.概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访问其字段和属性 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.在另一端,反序列化将从该流重新构造对象. 2.什么是SOAP,有哪些应用? 答:SOAP(Simple

元数据与反射(二)

1.反射程序集 获取Assmbly对象有以下方法: (1)Assmbly.Load("程序集文件名称") Assembly assembly = Assembly.Load("类库Demo"); (2)Assmbly.LoadFrom("程序集文件名") Assembly assembly = Assembly.LoadFrom("类库Demo.dll"); 上述两个方法的区别就在于Load只需要提供文件名不加后缀的信息即可.

C#反射之Assembly.Load,Assembly.LoadFile 与 Assembly.LoadFrom方法介绍

一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集,模块,类的成员以及成员的一些信息:接下来就是动态调用类的成员方法:第三个方面就动态产生程序集,模块和类以及类的成员.好了,现在就让我们从反射各种信息开始吧 在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: System.Reflection命名空间 (1)   AppDomain:

C#- 反射之 GetType()方法

Type.GetType()在跨程序集反射时返回null的解决方法 在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll获取程序集B.dll中的类型,就会返回Null. 关于跨程序集的反射,有两点需要注意: 1.如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行.可以说,typeof是支持强类型的.比如