Assembly类
System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到。
由于这个类实在有太多的字段、属性与方法。实在不想将一个个属性方法从MSDN复制出来然后逐个属性、方法敲一次,我想改变一下学习方法,从实际运用学习。
一、加载程序集并执行方法
使用反射加载程序集并执行方法,加载程序集主要使用LoadFrom()方法。
static void Main(string[] args)
{
Assembly ass = Assembly.LoadFrom(@"D:\test.dll");
Type type = ass.GetType("Test.Add"); //注意要输入全部路径,包括命名空间
object obj = Activator.CreateInstance(type);
MethodInfo Add = type.GetMethod("AddCalculate"); //根据方法名获取MethodInfo对象
int i = (int)Add.Invoke(obj, new object[] { , });
Console.WriteLine(i); Console.ReadKey();
}
以上程序运行输出3。
注意在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();
}
Assembly类的更多相关文章
- C# Assembly类_反射
System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到. 由于这个类实在有太多的字段.属性与方法.实在不想将一个个属性方法从MSDN复制出来然后逐个属性.方法敲 ...
- 反射+type类+Assembly+特性
什么是元数据,什么是反射: 程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BLC中的类)这些也是数据. 有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程 ...
- 【Unity|C#】基础篇(12)——反射(Reflection)(核心类:Type、Assembly)
[学习资料] <C#图解教程>(第24章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...
- 加载dll过程中assembly失败
错误现象: 进行插件读取时出现错误:“尝试从一个网络位置加载程序集,在早期版本的 .NET Framework 中,这会导致对该程序集进行沙盒处理.此发行版的 .NET Framework 默认情况下 ...
- 反射,System.Type类
http://m.blog.csdn.net/blog/woddle/40623333 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到 ...
- 加载网络映射盘中的assembly失败
我有一个网络映射盘,盘符是Z:.在Z盘下面,放了一个assembly,名为test.dll.然后,我在VS2010中建立了一个.NET 4.0的工程,程序中有下面一段代码: string dll = ...
- C#反射Assembly 详细说明
1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等 ...
- Assembly(c#中简单说明[转]
什么是Assembly(程序集)?Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合.在.net框架中通过Assembly类来支持,该类位于System. ...
- C#反射实例应用--------获取程序集信息和通过类名创建类实例
AppDomain.CurrentDomain.GetAssemblies();获取程序集,但是获取的只是已经加载的dll,引用的获取不到. System.Reflection.Assembly.Ge ...
随机推荐
- windows下同时安装python2和python3
之前学习的时候使用2.7比较多. 想练习3.7的时候,两个版本兼容的问题,苦恼了几天. 查了一下资料,发现了一个很好的方法.记录一下,也做一个分享. 本篇内容主要讲一下,在同一台电脑上如何同时安装Py ...
- Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value
Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...
- Java字符串常见实例与函数
字符串比较 字符串函数 compareTo (string) ,compareToIgnoreCase(String) 及 compareTo(object string) 来比较两个字符串,并返回字 ...
- redux-saga印象
saga作为redux的中间件,用来处理异步任务. 先收集资料: 贴个文章(2)中的图先: 注意:参考文献(4)是redux-saga作者写的. 参考文章: (1)https://redux-saga ...
- 拥抱 Android Studio 之一:从 ADT 到 Android Studio
http://kvh.io/cn/embrace-android-studio-migration.html 1. 拥抱变化,拥抱新事物 Android Studio(IntelliJ IDEA)vs ...
- php 根据ip获取城市以及网络运营商名称(利用qqwry.dat)
根据用户IP地址判定出所在城市以及网络运营商 qqwry.dat下载地址:http://files.cnblogs.com/guangxiaoluo/qqwry.rar 解压出来即可 //获取用户真 ...
- Iterator 迭代器
意图 提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示. 动机 一个聚合对象, 如列表(list), 应该提供一种方法来让别人可以访问它的元素,而又不需暴露它的内部结构 迭 ...
- [水煮 ASP.NET Web API2 方法论](1-4)从 MVC Controller 链接到 API Controller 以及反向链接
问题 想创建一个从 ASP.NET MVC controller 到 ASP.NET Web API controller 的直接链接,或者反向链接. 解决方案 可以使用 System.Web.Htt ...
- Rookey.Frame之实体类
上周跟大家分享了Rookey.Frame框架的初始化功能,今天继续给大家介绍实体类的设计. 先看下下面菜单实体示例代码: using Rookey.Frame.EntityBase; using Ro ...
- bzoj 1212: [HNOI2004]L语言
思路:字典树+dp, dp[ i ] 表示 前缀到 i 能不能被理解, 如果dp[ i ] 是能被理解的那么, 把i + 1, i + 2 .... 在字典树上走,走到一个单词就转移. ,这样可行的 ...