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[2] { 1, 2 }); 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(); }
相关推荐
C#中通过Assembly类可以访问程序集信息. 1.允许访问给定程序集的元元素,包含可以加载和执行程序集的方法; 2.加载程序集: 使用静态方法Assembly.Load(程序集名称) 或Assembly.LoadFrom(程序集完整路径名); 3....
(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。 (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法...
C#中通过Assembly类可以访问程序集信息. 1.允许访问给定程序集的元元素,包含可以加载和执行程序集的方法; 2.加载程序集:使用静态方法Assembly.Load(程序集名称)或Assembly.LoadFrom(程序集完整路径名); 3.属性:...
使用由Roslyn提供动力的源生成器,在ThisAssembly类中将项目和程序集级别信息公开为常量。 在全局名称空间中,主要生成的入口点类型是ThisAssembly ,并且被声明为局部的,因此您也可以使用手动创建的成员对其进行...
assembly assembly assembly assembly
Assembly-Java:从Java实例调用Assembly
以前我只知道把一个窗体项目属性改成输出类库(也是一个dll,嘻嘻),然后用assembly类反射,也能 加载,实现弹出窗体,这个是以前的俺的作品《乱码记事本》里面的所谓的插件技术;但是我们都知道那不 是真正的...
System.Reflection.Assembly类--它可以用于访问给定程序集的信息,或者把这个程序集加载到程序中。 System.Type类: System.Type 类对于反射起着核心的作用。但它是一个抽象的基类,Type有与每种数据类型对应...
spark正常运行所需要的jar包,适用于spark1版本, 一个jar包中包含所有使用spark编程所需要的关键类,功能超级强大! spark-assembly-1.52-bc1.3.1-hadoop2.6.0-bc1.3.1.jar