• 如何遍历所有程序集中的成员、类


    引用网址:https://blog.csdn.net/qiandeqiande/article/details/79150589

    System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到。


    //第一种:此方法发射加载DLL文件获取Mapping类
    //string assembleFileName = Assembly.GetExecutingAssembly().CodeBase.Replace("Colligate.DataSource.ServiceMonitor.DLL", "Colligate.AddIn.Application.Mapping.dll").Replace("file:///", "");
    //Assembly asm = Assembly.LoadFile(assembleFileName);

    //第二种:此方法通过程序集获取到Mapping类
    Assembly asm = Assembly.Load("Colligate.DataSource.ServiceMonitor");


    var typesToRegister = asm.GetTypes()
    .Where(type => !String.IsNullOrEmpty(type.Namespace))
    .Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
    foreach (var type in typesToRegister)
    {
    dynamic configurationInstance = Activator.CreateInstance(type);
    modelBuilder.Configurations.Add(configurationInstance);
    }

    注意在Assembly里面的加载程序集有3个方法,分别是Load、LoadFrom和LoadFile。这3个方法有什么异同呢?

    如果你引用了命名空间,那么就直接Load()方法,参数里面写上命名空间+类名就可以加载了。
    如果仅仅知道一个dll文件的那么就要用LoadFrom()方法了,参数里面直接填写完整的路径。
      LoadFrom 方法具有以下缺点。请考虑改用 Load。

    如果已加载一个具有相同标识的程序集,则即使指定了不同的路径,LoadFrom 仍返回已加载的程序集。
    如果用 LoadFrom 加载一个程序集,随后加载上下文中的一个程序集尝试加载具有相同显示名称的程序集,则加载尝试将失败。对程序集进行反序列化时,可能发生这种情况。
      总结: LoadFrom只能用于加载不同标识的程序集, 也就是唯一的程序集, 不能用于加载标识相同但路径不同的程序集。

      3.LoadFile 加载指定路径上的程序集文件的内容。

      这个方法是从指定的文件来加载程序集,它是调用外部的API实现的加载方式,和上面Load,LoadFrom方法的不同之处是这个方法不会加载此程序集引用的其他程序集,也就是不会加载程序的依赖项。而同时也是不能加载相同标识的程序集的。

      4.GetExecutingAssembly获取当前正在执行的程序集。


    static void Main(string[] args)
    {
    //需引用命名空间
    Assembly assm = Assembly.Load("fanshe");
    Console.WriteLine(assm.FullName); //输出 fanshe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

    //依靠路径
    Assembly assm1 = Assembly.LoadFrom(@"D:\fanshe.dll");
    Console.WriteLine(assm1.FullName); 输出 fanshe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

    //与Assembly.LoadFrom基本一样,只是如果被加载的dll,还依赖其他的dll的话,被依赖的对象不会加载
    Assembly assm2 = Assembly.LoadFile(@"D:\fanshe.dll");
    Console.WriteLine(assm2.FullName);

    //当前正在执行的程序集
    Assembly assm3 = Assembly.GetExecutingAssembly();
    Console.WriteLine(assm3.FullName);

    Console.ReadKey();
    }


    二、读取程序集中嵌入的资源
      读取嵌入的资源,主要有如下两个方法:

    GetManifestResourceNames:读取嵌入的资源名称。
    GetManifestResourceStream:读取嵌入的资源为流。
    static void Main(string[] args)
    {
    Assembly ass = Assembly.LoadFrom(@"D:\test.dll");
    string[] names = ass.GetManifestResourceNames();
    foreach (string name in names)
    {
    Console.WriteLine("所有的嵌入资源名:" + name);
    }

    Stream myStream = ass.GetManifestResourceStream("Test.1.txt");
    Console.WriteLine();
    using (StreamReader sr = new StreamReader(myStream, Encoding.Default))
    {
    //嵌入的资源1.txt的内容
    Console.WriteLine("嵌入的资源1.txt的内容:" + sr.ReadToEnd());
    }

    Console.ReadKey();
    }

    ————————————————
    版权声明:本文为CSDN博主「qiandeqiande」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qiandeqiande/article/details/79150589

  • 相关阅读:
    python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)
    python 全栈开发,Day73(django多表添加,基于对象的跨表查询)
    python 全栈开发,Day72(昨日作业讲解,昨日内容回顾,Django多表创建)
    bootstrap源码里的function加上了+号
    php get set方法深入理解
    20160519
    NetStatusEvent info对象的状态或错误情况的属性
    php 代码大全
    常见HTTP状态(304,200等)
    php strtotime 和 date 日期操作
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15766264.html
Copyright © 2020-2023  润新知