`

Assembly类

    博客分类:
  • C#
 
阅读更多

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个方法有什么异同呢?

  1. 如果你引用了命名空间,那么就直接Load()方法,参数里面写上命名空间+类名就可以加载了。
  2. 如果仅仅知道一个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();
        }
复制代码

 

  

二、读取程序集中嵌入的资源

  读取嵌入的资源,主要有如下两个方法:

  1. GetManifestResourceNames:读取嵌入的资源名称。
  2. 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类访问程序集信息

    ### C#中通过Assembly类访问程序集信息 在.NET框架中,程序集是部署、版本控制、安全性以及重用的基本单元。程序集包含了编译后的代码(中间语言IL)及元数据,它由一个或多个模块组成。在C#中,`Assembly`类提供了...

    C# 反射 Type Assembly类

    (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。 (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法...

    C# Assembly类访问程序集信息

    ### C# Assembly类访问程序集信息 #### 一、引言 在.NET框架中,程序集(Assembly)是部署的基本单元,它包含了编译后的代码(IL中间语言)、资源和其他元数据。`Assembly`类提供了丰富的功能来访问和操作这些信息...

    ThisAssembly:使用由Roslyn提供支持的源生成器在ThisAssembly类中将项目和程序集级别信息公开为常量

    使用由Roslyn提供动力的源生成器,在ThisAssembly类中将项目和程序集级别信息公开为常量。 在全局名称空间中,主要生成的入口点类型是ThisAssembly ,并且被声明为局部的,因此您也可以使用手动创建的成员对其进行...

    assembly各种ASM

    【标题】:“汇编语言(Assembly)详解” 【描述】:汇编语言,简称ASM,是一种低级编程语言,它与计算机硬件紧密相关,每条指令通常对应于一个或几个机器码。汇编语言用于编写操作系统、设备驱动程序、嵌入式系统和...

    Assembly-Java:从Java实例调用Assembly

    对于上述Java类,将生成如下头文件: ```c /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class NativeDemo */ #ifndef _Included_NativeDemo #define _Included_NativeDemo #...

    ex.rar_ex

    标题“ex.rar_ex”可能是指一个关于C#中Assembly类使用的示例项目或教程,其中"ex"可能是“example”的缩写。而"ex.cs"则很可能是一个C#源代码文件,包含了具体实现这些功能的代码。 描述中提到的“C#中通过...

    使用Maven assembly打多个自定义包及War包简介

    `.classpath`和`.project`文件是Eclipse的工作空间配置文件,它们包含了项目的类路径和项目设置信息,主要用于IDE的项目管理。`.settings`目录包含了Maven项目的用户特定配置,这些文件通常是IDE自动生成的,对于...

    dotNet中的反射用法入门教程

    1. Assembly类:代表.NET程序集,它是.NET程序的基本部署单元,通常为.dll或.exe文件。Assembly类可以用于加载程序集、获取程序集内的类型信息以及执行程序集内的代码。 2. Module类:表示程序集中的一个模块,一个...

    c#反射机制

    `System.Reflection.Assembly` 类代表一个程序集。可以通过以下几种方式获取程序集: - `Assembly.Load(string)` - 使用完全限定名称加载程序集。 - `Assembly.LoadFrom(string)` - 从指定路径加载程序集。 - `...

    C#动态加载DLL的DEMO

    动态加载DLL的关键在于System.Reflection命名空间中的Assembly类。Assembly类是.NET程序集的抽象,可以用来加载、检查和执行程序集内的代码。下面将详细介绍这个过程: 1. **获取DLL路径**:首先,你需要知道DLL...

    反射技术简单实现(C#源码)

    - 加载程序集:使用Assembly类的静态方法如LoadFrom、LoadFile或Load等加载程序集。 - 获取类型:使用Assembly的GetTypes方法获取程序集中所有类型,或使用Type类的GetType方法根据类型名获取类型。 - 创建对象:...

    C#开发中用到的反射工具

    - **Assembly类**:用于加载和探索程序集,如`Assembly.LoadFrom("path.dll")`加载dll。 - **Type类**:表示类型,可以使用`typeof()`或`Assembly.GetType()`获取。 - **Activator类**:创建类型实例,`Activator...

    pb11呼叫assembly

    PB11引入了.NET Interop服务,允许PowerBuilder应用程序直接调用.NET Assembly中的方法和类。这样,PB开发者可以利用.NET Framework的丰富库,如ADO.NET、Windows Forms、WPF等,而无需从头编写C#或VB.NET代码。 **...

    如何查找程序集特殊成员例子C#.net源代码编写

    1. 加载程序集:使用Assembly类的静态方法,如LoadFrom、LoadFile或GetExecutingAssembly,来加载指定路径的程序集。 ```csharp Assembly assembly = Assembly.LoadFrom("path_to_your_assembly.dll"); ``` 2. ...

    反射程序集信息

    2. **程序集与Assembly类**:在.NET中,程序集是代码的物理单元,包含元数据和IL代码。`System.Reflection.Assembly`类是.NET提供的用于处理程序集的主要类,它提供了加载、查询和操作程序集的各种方法。 3. **动态...

    Visual Assembly

    开发工具类软件如Visual Assembly,通常会包含一系列辅助开发的功能,例如调试器、代码分析工具、项目管理工具等。这些工具能够帮助程序员定位和修复错误,优化代码,提高开发效率。Visual Assembly很可能也具备这些...

    Assembly插件

    Assembly插件是Maven或Gradle构建系统中的一个组件,它允许开发者通过XML配置文件(assembly.xml)来定义如何打包项目。这个插件提供了高度定制化的打包能力,包括文件的拷贝、重命名、过滤以及归档格式的选择等。它...

    C#反射示例

    2. Assembly类:Assembly类代表.NET程序集,它是.NET程序的基本模块,包含元数据和可执行代码。可以使用Assembly类加载和操作程序集。 3. MemberInfo类:MemberInfo是一个抽象基类,提供了关于类型成员(如方法、...

Global site tag (gtag.js) - Google Analytics