C#中的法式集和反射引見。本站提示廣大學習愛好者:(C#中的法式集和反射引見)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中的法式集和反射引見正文
甚麼是法式集?
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類是完成反射的一個很主要的類,經由過程它我們可以獲得類中的一切信息包含辦法、屬性等。可以靜態挪用類的屬性機及辦法。
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復制到掌握台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();
}
}
}
成果:
未完待續。。。。。