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 ...
随机推荐
- 简单ORACLE分区表、分区索引
前一段听说CSDN.COM里面很多好东西,同事建议看看合适自己也可以写一写,呵呵,今天第一次开通博客,随便写点东西,就以第一印象分区表简单写第一个吧. ORACLE对于分区表方式其实就是将表分段存储, ...
- Python 安装requests模块
window下安装: 注:不要使用 easy_install requests 命令 这种方式安装后不能卸载,建议使用pip 方法 1.自动安装 输入cmd命令进入命令行窗口,执行 pip insta ...
- HttpRunner接口自动化测试框架
简介 2018年python开发者大会上,了解到HttpRuuner开源自动化测试框架,采用YAML/JSON格式管理用例,能录制和转换生成用例功能,充分做到用例与测试代码分离,相比excel维护测试 ...
- POJ 2186 Popular Cows(强联通分量)
题目链接:http://poj.org/problem?id=2186 题目大意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种 ...
- select into的缺点
当使用到select * into 表A from 表 B时可以复制表的结构和数据,但是千万不要忘了给新表A添加主键和索引, 因为在使用select into 时不会复制索引和主键,因此,当我 ...
- 触发器中的inserted表和deleted表
触发器语句中使用了两种特殊的表:deleted 表和 inserted 表.Microsoft? SQL Server 2000 自动创建和管理这些表.可以使用这两个临时的驻留内存的表测试某些数据修改 ...
- CVE-2010-0248
[CNNVD]Microsoft Internet Explorer 多个远程代码执行漏洞(CNNVD-201001-237) Microsoft Internet Explorer 6, 6 SP1 ...
- CVE-2012-0158基于exp分析
CVE-2012-0158这个洞我之前分析过,漏洞战争这本书里也写过,但是都是用poc分析的,我这次找了一个弹计算器的exp来分析,感觉用poc和用exp还是不一样的,从exp分析要比从poc分析更复 ...
- html meta标签使用总结(转)
之前学习前端中,对meta标签的了解仅仅只是这一句. <meta charset="UTF-8"> 但是打开任意的网站,其head标签内都有一列的meta标签.比如我博 ...
- Elasticsearch安全问题
本节内容: 背景 修改默认的 Elasticsearch 集群名称 不要暴露 Elasticsearch 在公网上 不要以 root 身份运行 Elasticsearch 定期对 Elasticsea ...