反射整理学习<二>
使用 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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架