国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中的程序集和反射介紹

2019-10-29 21:48:09
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C#中的程序集和反射介紹,程序集包含資源文件,類型元數據、IL代碼,每個程序集都有自己的名稱、版本等信息,反射就是動態獲取程序集中的元數據的功能,需要的朋友可以參考下
 

什么是程序集?

1.程序集(assembly)是一個及一個以上托管模塊,以及一些資源文件的邏輯組合。
2.程序集是組件復用,以及實施安全策略和版本策略的最小單位。
3.程序集是包含一個或者多個類型定義文件和資源文件的集合。在程序集包含的所有文件中,有一個文件用于保存清單。(清單是元數據部分中一組數據表的集合,其中包含了程序集中一部分文件的名稱,描述了程序集的版本,語言文化,發布者,共有導出類型,以及組成該程序集的所有文件)。
4、在編譯應用程序中,所創建的CIL代碼存儲在一個程序集中,程序集包括可執行的應用程序文件(.exe擴展名文件)和其他應用程序使用的庫(.dll擴展名文件)。

作為一個單元進行版本控制和部署的一個或多個文件的集合。程序集是.NETFramework 應用程序的主要構造塊。所有托管類型和資源都包含在某個程序集內,并被標記為只能在該程序集的內部訪問,或者被標記為可以從其他程序集中的代碼訪問。程序集在安全方面也起著重要作用。代碼訪問安全系統使用程序集信息來確定為程序集中的代碼授予的權限集。

程序集是.NET Framework編程的基本組成部分。(此上是在百度百科的定義)
簡單的說,net中的dll和exe文件都是程序集

程序集包含資源文件,類型元數據(描述在代碼中定義的每一類型和成員,二進制形式)、IL代碼(這些都被裝在exe或dll中),每個程序集都有自己的名稱、版本等信息。這些信息可以通過AssemblyInfo.cs文件來自己定義。

 

復制代碼代碼如下:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

 

// 有關程序集的常規信息通過以下
// 特性集控制。更改這些特性值可修改
// 與程序集關聯的信息。
[assembly: AssemblyTitle("AssemblyDemo")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AssemblyDemo")]
[assembly: AssemblyCopyright("Copyright ©  2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 將 ComVisible 設置為 false 使此程序集中的類型
// 對 COM 組件不可見。如果需要從 COM 訪問此程序集中的類型,
// 則將該類型上的 ComVisible 特性設置為 true。
[assembly: ComVisible(false)]

// 如果此項目向 COM 公開,則下列 GUID 用于類型庫的 ID
[assembly: Guid("e7da9959-0c97-444c-aa40-6d9bbf728068")]

// 程序集的版本信息由下面四個值組成:
//
//      主版本
//      次版本 
//      內部版本號
//      修訂號
//
// 可以指定所有這些值,也可以使用“內部版本號”和“修訂號”的默認值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

AssemblyInfo.cs

 

使用程序集的優點:

程序只需要應用必要的程序集,減少了編碼量(例如log4net.dll),程序的尺寸 。
可以在程序集中封裝一些代碼,提供必要的接口,供引用該程序集的項目使用。   

反射

提到程序集,就不得不說反射。反射就是動態獲取程序集中的元數據(提供程序集的類型信息)的功能。也就是動態獲取程序集中的元數據來操作類型的。比如咱們使用的vs中的智能提示,就是通過反射獲取類的方法、屬性的。

Type類是實現反射的一個很重要的類,通過它我們可以獲取類中的所有信息包括方法、屬性等??梢詣討B調用類的屬性機及方法。

Type是對類的描述。

一個簡單的例子新建一個類庫MyAssembly添加Person類,生成:

 

復制代碼代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace MyAssembly
{
    public class Person
    {
        private string name;
 
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int age;
 
        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private string gender;
 
        public string Gender
        {
            get { return gender; }
            set { gender = value; }
        }
        public Person(string name, int age, string gender)
        {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
        public void SayHi()
        {
            Console.WriteLine("大家好,我是{0},今年{1}歲了。",this.name,this.age);
        }
    }
}

 

C#中的程序集和反射介紹

新建一個控制臺項目AssemblyDemo,將MyAssembly.dll復制到控制臺bin/debug下,接下來通過動態加載程序集MyAssembly.dll獲取該程序集下person類的屬性和方法。代碼如下:

 

復制代碼代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

 

namespace AssemblyDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //通過反射動態調用另一個程序集中的方法
            //1加載程序集
            string path = AppDomain.CurrentDomain.BaseDirectory;//獲取當前.exe執行文件的路徑
            path = Path.Combine(path, "MyAssembly.dll");//拼接程序集的路徑
            Assembly assembly = Assembly.LoadFile(path);
            //2創建Person類的對象
            Type type = assembly.GetType("MyAssembly.Person");
            object o = Activator.CreateInstance(type,"wolf",22,"未知");//實例化
            //3獲取方法的類型
            MethodInfo methodInfo = type.GetMethod("SayHi");
            //4反射調用方法
            methodInfo.Invoke(o, null);
            Console.Read();
        }
    }
}

 

結果:

C#中的程序集和反射介紹

未完待續。。。。。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黑水县| 大城县| 巴中市| 马关县| 枣强县| 漳浦县| 厦门市| 龙陵县| 乌什县| 辛集市| 全椒县| 沙洋县| 临泉县| 河曲县| 无极县| 文山县| 沛县| 玉龙| 宜章县| 四平市| 青海省| 宜丰县| 萨嘎县| 建德市| 定陶县| 马山县| 丽江市| 普定县| 深州市| 台东县| 无极县| 正宁县| 蒙自县| 遂溪县| 天柱县| 常德市| 土默特左旗| 湘乡市| 固原市| 高邑县| 渝中区|