C#中的程序集和反射介紹
什么是程序集?
1.程序集(assembly)是一個及一個以上托管模塊,以及一些資源文件的邏輯組合。
2.程序集是組件復(fù)用,以及實施安全策略和版本策略的最小單位。
3.程序集是包含一個或者多個類型定義文件和資源文件的集合。在程序集包含的所有文件中,有一個文件用于保存清單。(清單是元數(shù)據(jù)部分中一組數(shù)據(jù)表的集合,其中包含了程序集中一部分文件的名稱,描述了程序集的版本,語言文化,發(fā)布者,共有導(dǎo)出類型,以及組成該程序集的所有文件)。
4、在編譯應(yīng)用程序中,所創(chuàng)建的CIL代碼存儲在一個程序集中,程序集包括可執(zhí)行的應(yīng)用程序文件(.exe擴(kuò)展名文件)和其他應(yīng)用程序使用的庫(.dll擴(kuò)展名文件)。
作為一個單元進(jìn)行版本控制和部署的一個或多個文件的集合。程序集是.NETFramework 應(yīng)用程序的主要構(gòu)造塊。所有托管類型和資源都包含在某個程序集內(nèi),并被標(biāo)記為只能在該程序集的內(nèi)部訪問,或者被標(biāo)記為可以從其他程序集中的代碼訪問。程序集在安全方面也起著重要作用。代碼訪問安全系統(tǒng)使用程序集信息來確定為程序集中的代碼授予的權(quán)限集。
程序集是.NET Framework編程的基本組成部分。(此上是在百度百科的定義)
簡單的說,net中的dll和exe文件都是程序集
程序集包含資源文件,類型元數(shù)據(jù)(描述在代碼中定義的每一類型和成員,二進(jìn)制形式)、IL代碼(這些都被裝在exe或dll中),每個程序集都有自己的名稱、版本等信息。這些信息可以通過AssemblyInfo.cs文件來自己定義。
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有關(guān)程序集的常規(guī)信息通過以下
// 特性集控制。更改這些特性值可修改
// 與程序集關(guān)聯(lián)的信息。
[assembly: AssemblyTitle("AssemblyDemo")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AssemblyDemo")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 將 ComVisible 設(shè)置為 false 使此程序集中的類型
// 對 COM 組件不可見。如果需要從 COM 訪問此程序集中的類型,
// 則將該類型上的 ComVisible 特性設(shè)置為 true。
[assembly: ComVisible(false)]
// 如果此項目向 COM 公開,則下列 GUID 用于類型庫的 ID
[assembly: Guid("e7da9959-0c97-444c-aa40-6d9bbf728068")]
// 程序集的版本信息由下面四個值組成:
//
// 主版本
// 次版本
// 內(nèi)部版本號
// 修訂號
//
// 可以指定所有這些值,也可以使用“內(nèi)部版本號”和“修訂號”的默認(rèn)值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
AssemblyInfo.cs
使用程序集的優(yōu)點:
程序只需要應(yīng)用必要的程序集,減少了編碼量(例如log4net.dll),程序的尺寸 。
可以在程序集中封裝一些代碼,提供必要的接口,供引用該程序集的項目使用。
反射
提到程序集,就不得不說反射。反射就是動態(tài)獲取程序集中的元數(shù)據(jù)(提供程序集的類型信息)的功能。也就是動態(tài)獲取程序集中的元數(shù)據(jù)來操作類型的。比如咱們使用的vs中的智能提示,就是通過反射獲取類的方法、屬性的。
Type類是實現(xiàn)反射的一個很重要的類,通過它我們可以獲取類中的所有信息包括方法、屬性等??梢詣討B(tài)調(diào)用類的屬性機(jī)及方法。
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);
}
}
}
新建一個控制臺項目AssemblyDemo,將MyAssembly.dll復(fù)制到控制臺bin/debug下,接下來通過動態(tài)加載程序集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)
{
//通過反射動態(tài)調(diào)用另一個程序集中的方法
//1加載程序集
string path = AppDomain.CurrentDomain.BaseDirectory;//獲取當(dāng)前.exe執(zhí)行文件的路徑
path = Path.Combine(path, "MyAssembly.dll");//拼接程序集的路徑
Assembly assembly = Assembly.LoadFile(path);
//2創(chuàng)建Person類的對象
Type type = assembly.GetType("MyAssembly.Person");
object o = Activator.CreateInstance(type,"wolf",22,"未知");//實例化
//3獲取方法的類型
MethodInfo methodInfo = type.GetMethod("SayHi");
//4反射調(diào)用方法
methodInfo.Invoke(o, null);
Console.Read();
}
}
}
結(jié)果:
未完待續(xù)。。。。。
相關(guān)文章
c#開發(fā)的程序安裝時動態(tài)指定windows服務(wù)名稱
前段時間由于項目的需求,要在Windows里把同樣的組件制作成多個不同名稱的服務(wù),這些服務(wù)完成類似的功能,僅需要修改業(yè)務(wù)配置文件2012-06-06解決unity rotate旋轉(zhuǎn)物體 限制物體旋轉(zhuǎn)角度的大坑
這篇文章主要介紹了解決unity rotate旋轉(zhuǎn)物體 限制物體旋轉(zhuǎn)角度的大坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04C#中的矩形數(shù)組(多維數(shù)組)和鋸齒數(shù)組的實現(xiàn)
本文主要介紹了C#中的矩形數(shù)組(多維數(shù)組)和鋸齒數(shù)組的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04