zoukankan      html  css  js  c++  java
  • 反射整理学习<二>

    使用 Assembly 类可以加载程序集、浏览程序集的元数据和构成部分、发现程序集中包含的类型以及创建这些类型的实例。

    若要获取 Assembly 对象(表示当前加载到应用程序域(例如,简单项目的默认应用程序域)中的程序集)的数组,可以使用 AppDomain ..::.GetAssemblies 方法。

    若要动态加载程序集, Assembly 类可提供下列静态方法(在 Visual Basic 中为 Shared 方法)。 程序集被加载到发生加载操作的应用程序域中。

    加载程序集的推荐方式是使用 Load 方法,该方法标识要由其显示名称加载的程序集(例如"System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")。 搜索程序集时遵守 运行时如何定位程序集中描述的规则。

    使用 ReflectionOnlyLoad 和 ReflectionOnlyLoadFrom 方法可以为反射加载程序集,但不能为执行加载程序集。 例如,可以由在 32 位平台上运行的代码检查针对 64 位平台的程序集。

    LoadFile 和 LoadFrom 方法是为必须由路径标识程序集的极少数方案提供的。

    若要获取当前执行的程序集的 Assembly 对象,可以使用 GetExecutingAssembly 方法。

    Assembly 类的许多成员都提供有关程序集的信息。 例如:

    • GetName 方法返回一个 AssemblyName 对象,该对象提供对程序集显示名称部分的访问。
    • GetCustomAttributes 方法列出应用于程序集的属性。
    • GetFiles 方法提供对程序集清单中文件的访问。
    • GetManifestResourceNames 方法提供程序集清单中资源的名称。
    • GetTypes 方法列出程序集中的所有类型。 GetExportedTypes 方法列出对程序集以外的调用方可见的类型。 GetType 方法可用于在程序集中搜索特定类型。 CreateInstance 方法可用于在程序集中搜索和创建类型的实例。
     1 using System;
     2 using System.Reflection;
     3 
     4 namespace AssemblyTest
     5 {
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10             try
    11             {
    12                 ShowAllLoadAssemblies();
    13                 LoadAssignAssembly();
    14             }
    15             catch (Exception ex)
    16             {
    17                 Console.WriteLine(ex.Message);
    18             }
    19             Console.ReadKey();
    20         }
    21         /// <summary>
    22         /// 获取当前的程序域中已经加载的程序集列表
    23         /// </summary>
    24         public static void ShowAllLoadAssemblies()
    25         {
    26             Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
    27             Console.WriteLine("当前的程序域中已经加载的程序集如下:");
    28             foreach (Assembly assembly in assemblies)
    29             {
    30                 Console.WriteLine(assembly);
    31             }       
    32         }
    33         /// <summary>
    34         /// 加载指定的程序集
    35         /// </summary>
    36         public static void LoadAssignAssembly()
    37         {
    38             Console.WriteLine("请输入一个程序集名:");
    39             string assembiyName = Console.ReadLine();
    40             //LoadFrom 方法是为必须由路径标识程序集的极少数方案
    41             Assembly a = Assembly.LoadFrom(assembiyName);
    42             Console.WriteLine("============================\n加载程序集{0}之后\n=========================================", a.FullName);
    43             //刷新显示当前已加载的程序集
    44             ShowAllLoadAssemblies();
    45             Console.WriteLine("==============================\n新加载程序集的信息\n=========================");
    46             Console.WriteLine("程序集全名:"+a.FullName);
    47             #region AssemblyName注释
    48             //GetName 方法返回一个 AssemblyName 对象,该对象提供对程序集显示名称部分的访问。 
    49             //AssemblyName 对象包含有关程序集的信息,在绑定到该程序集时可以使用此信息。 程序集的标识由以下部分组成:
    50             //简单名称。
    51             //版本号。
    52             //加密密钥对。
    53             //支持的区域性。 
    54             #endregion
    55             Console.WriteLine("程序集的版本"+a.GetName().Version);
    56             Console.WriteLine("程序集的初始位置:"+a.CodeBase);
    57             Console.WriteLine("程序集位置:"+a.Location);
    58             Console.WriteLine("程序集入口点:"+a.EntryPoint);
    59             Console.WriteLine("是否是在全局程序集缓存中:" + a.GlobalAssemblyCache);
    60             Console.WriteLine("公共语言运行时版本:"+a.ImageRuntimeVersion);
    61          
    62             //获取程序集的类型
    63             Type[] types = a.GetTypes();
    64             Console.WriteLine("\n该程序集包含如下类型:");
    65             foreach (Type type in types)
    66             {
    67                 Console.WriteLine("类型名:"+type.Name);
    68             }
    69 
    70             //获取程序集引用程序集信息
    71             AssemblyName[] assemblynames = a.GetReferencedAssemblies();
    72             Console.WriteLine("该程序集引用的所有程序集如下:");
    73             foreach (AssemblyName ass in assemblynames)
    74             {
    75                 Console.WriteLine(ass);
    76             }
    77         }
    78     }
    79 }
  • 相关阅读:
    宏定义问题
    (转载)(int)a、&a、(int)&a、(int&)a的区别,很偏僻的题
    boolalpha的作用
    一些小细节
    HTTP Keep-Alive的作用
    数据库三大范式
    laravel 安装语言包
    MySQL存储引擎中的MyISAM和InnoDB区别详解
    推荐一款超好用的工具cmder
    如何保证代码质量
  • 原文地址:https://www.cnblogs.com/rohelm/p/2473388.html
Copyright © 2011-2022 走看看