最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 動(dòng)態(tài)加載程序集信息

 更新時(shí)間:2017年03月06日 09:22:18   作者:飛翔的月亮  
在設(shè)計(jì)模式的策略模式中,需要?jiǎng)討B(tài)加載程序集信息,本文通過(guò)一個(gè)簡(jiǎn)單的實(shí)例,來(lái)講解動(dòng)態(tài)加載Dll需要的知識(shí)點(diǎn)。下面跟著小編一起來(lái)看下吧

 在設(shè)計(jì)模式的策略模式中,需要?jiǎng)討B(tài)加載程序集信息,本文通過(guò)一個(gè)簡(jiǎn)單的實(shí)例,來(lái)講解動(dòng)態(tài)加載Dll需要的知識(shí)點(diǎn)。

涉及知識(shí)點(diǎn):

  • AssemblyName類(lèi),完整描述程序集的唯一標(biāo)識(shí), 用來(lái)表述一個(gè)程序集。
  • Assembly類(lèi),在System.Reflection命名空間下,表示一個(gè)程序集,它是一個(gè)可重用、無(wú)版本沖突并且可自我描述的公共語(yǔ)言運(yùn)行時(shí)應(yīng)用程序構(gòu)建基塊。
  • Module類(lèi) 表述在模塊上執(zhí)行反射,表述一個(gè)程序集的模塊信息。
  • Type類(lèi),在System命名空間下,表示類(lèi)型聲明:類(lèi)類(lèi)型、接口類(lèi)型、數(shù)組類(lèi)型、值類(lèi)型、枚舉類(lèi)型、類(lèi)型參數(shù)、泛型類(lèi)型定義,以及開(kāi)放或封閉構(gòu)造的泛型類(lèi)型。
  • FieldInfo類(lèi),發(fā)現(xiàn)字段屬性并提供對(duì)字段元數(shù)據(jù)的訪問(wèn)權(quán)。
  • MethodInfo類(lèi),發(fā)現(xiàn)方法的屬性并提供對(duì)方法元數(shù)據(jù)的訪問(wèn)。
  • EventInfo類(lèi),發(fā)現(xiàn)事件的屬性并提供對(duì)事件元數(shù)據(jù)的訪問(wèn)權(quán)。
  • ConstructorInfo類(lèi),發(fā)現(xiàn)類(lèi)構(gòu)造函數(shù)的屬性并提供對(duì)構(gòu)造函數(shù)元數(shù)據(jù)的訪問(wèn)權(quán)。
  • Activator類(lèi),包含特定的方法,用以在本地或從遠(yuǎn)程創(chuàng)建對(duì)象類(lèi)型,或獲取對(duì)現(xiàn)有遠(yuǎn)程對(duì)象的引用。此類(lèi)不能被繼承。
  • BindingFlags類(lèi),指定控制綁定和由反射執(zhí)行的成員和類(lèi)型搜索方法的標(biāo)志。在獲取方法時(shí),第二個(gè)參數(shù)會(huì)用到

如下圖所示:

具體代碼如下:

public partial class DllLoadForm : Form
  {
    public DllLoadForm()
    {
      InitializeComponent();
    }
    private void btnOpenFile_Click(object sender, EventArgs e)
    {
      OpenFileDialog ofd = new OpenFileDialog()
      {
        Multiselect=false,
        Filter = "Dll Info|*.dll|All Files|*.*",
InitialDirectory=AppDomain.CurrentDomain.BaseDirectory,
        Title="Dll信息",
        Tag="請(qǐng)選擇"
      };
      if (ofd.ShowDialog() == DialogResult.OK) {
        this.txtDllFile.Text = ofd.FileName;
      }
    }
    private void btnLoadDll_Click(object sender, EventArgs e)
    {
      if (string.IsNullOrEmpty(this.txtDllFile.Text.Trim())) {
        MessageBox.Show("請(qǐng)選擇dll文件");
        return;
      }
      LoadDllInfo(this.txtDllFile.Text);
    }
    /// <summary>
    /// 動(dòng)態(tài)加載Dll
    /// </summary>
    /// <param name="dllPath">需要加載的Dll的路徑</param>
    public void LoadDllInfo(string dllPath)
    {
      if (File.Exists(dllPath))
      {
        TreeNodeCollection tvNodes = tvDllInfo.Nodes;
        tvNodes.Clear();
        tvNodes.Add("DllInfo");
        AssemblyName dllAssemblyName = AssemblyName.GetAssemblyName(dllPath);
        Assembly dllAssembly = Assembly.Load(dllAssemblyName);
        Module[] modules = dllAssembly.GetModules();//獲取作為程序集一部分的所有模塊信息
        Type[] types = dllAssembly.GetTypes();//獲取程序集中定義的所有類(lèi)型
        AssemblyName[] referrenceAsseblies = dllAssembly.GetReferencedAssemblies();//獲取程序集引用的程序集信息
        tvNodes[0].Nodes.Add("基本信息");
        string dllFullName = dllAssembly.FullName;
        bool isGlobalAsseblyCache = dllAssembly.GlobalAssemblyCache;//是否從全局程序集加載
        bool isFullTrusted = dllAssembly.IsFullyTrusted;//是否已完全信任方式加載的
        Module manifestModule = dllAssembly.ManifestModule;//獲取清單模塊
        bool isReflectionOnly = dllAssembly.ReflectionOnly;//是否加載到只反射模塊中
        //更新到節(jié)點(diǎn)
        tvNodes[0].Nodes[0].Nodes.Add(string.Format("全路徑:{0}", dllFullName));
        tvNodes[0].Nodes[0].Nodes.Add(string.Format("是否全局程序集:{0}", isGlobalAsseblyCache));
        tvNodes[0].Nodes[0].Nodes.Add(string.Format("是否全信任:{0}", isFullTrusted));
        tvNodes[0].Nodes[0].Nodes.Add(string.Format("是否只反射:{0}", isReflectionOnly));
        tvNodes[0].Nodes[0].Nodes.Add(string.Format("清單模塊:{0}", manifestModule.Name));
        IEnumerable<Type> exportedTypes = dllAssembly.ExportedTypes;//公共類(lèi)型集合
        tvNodes[0].Nodes.Add("模塊信息");
        int i = 0;
        foreach (var module in modules)
        {
          FieldInfo[] fields = module.GetFields();//返回模塊中定義的全局字段
          MethodInfo[] methods = module.GetMethods();//返回模塊中定義的全局方法
          Type[] mtypes = module.GetTypes();//返回模塊中定義的類(lèi)型集合
          bool isResource = module.IsResource();//指示此模塊是否是資源
          int mdStreamVersion = module.MDStreamVersion;//獲取源數(shù)據(jù)流的版本
          Guid versionId = module.ModuleVersionId;//獲取模塊的版本ID
          string moduleName = module.Name;//獲取模塊的名稱(chēng),去除路徑的
          int metadataToken = module.MetadataToken;
          string scopeName = module.ScopeName;
          tvNodes[0].Nodes[1].Nodes.Add(string.Format("模塊:{0}", moduleName));
          tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("數(shù)據(jù)流版本:{0}", mdStreamVersion));
          tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("是否資源:{0}", isResource));
          tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("版本ID:{0}", versionId));
          tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("MetaData:{0}", metadataToken));
          tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("ScopeName:{0}", scopeName));
          tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(GetNodes<FieldInfo>(fields, "公共字段"));
          tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(GetNodes<MethodInfo>(methods, "Mehods"));
          //tvNodes[0].Nodes[1].Nodes[i].Nodes.Add(string.Format("Types:{0}", string.Join(",", mtypes.Select(p => p.Name))));
          i++;
        }
        tvNodes[0].Nodes.Add("類(lèi)型信息");
        i = 0;
        foreach (var type in types)
        {
          TypeAttributes typeAttributes = type.Attributes;//與Type關(guān)聯(lián)的屬性
          string typeFullName = type.FullName;//獲取類(lèi)型的完全限定名稱(chēng)
          FieldInfo[] typeFields = type.GetFields();//獲取所有的公共字段
          EventInfo[] typeEvents = type.GetEvents();//獲取所有的 公共事件
          Type[] typeInterfaces = type.GetInterfaces();//獲取所有的公共接口
          MemberInfo[] typeMembers = type.GetMembers();//獲取所有的公共成員
          MethodInfo[] typeMethods = type.GetMethods();//獲取所有的公共方法
          TypeInfo typeInfo = type.GetTypeInfo();//返回指定類(lèi)型的表述形式
          string nameSpace = type.Namespace; //指定類(lèi)型的命名空間
          string typeName = type.Name;//獲取當(dāng)前成員的名稱(chēng)
          ConstructorInfo[] typeConstructors = type.GetConstructors();//類(lèi)型的構(gòu)造函數(shù)
          tvNodes[0].Nodes[2].Nodes.Add(string.Format("類(lèi)型:{0}", typeName));
          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(string.Format("全名稱(chēng):{0}", typeFullName));
          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(string.Format("制定類(lèi)型名稱(chēng):{0}", typeInfo.Name));
          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(string.Format("命名空間:{0}", nameSpace));
          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(string.Format("接口:{0}", string.Join(",", typeInterfaces.Select(p => p.Name))));
          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(GetNodes<FieldInfo>(typeFields, "公共字段"));
          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(GetNodes<ConstructorInfo>(typeConstructors, "構(gòu)造函數(shù)"));
          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(GetNodes<EventInfo>(typeEvents, "事件"));
          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(GetNodes<MemberInfo>(typeMembers, "成員Member"));
          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(GetNodes<MethodInfo>(typeMethods, "公共方法"));
          i++;
        }
      }
    }
    /// <summary>
    /// 通過(guò)類(lèi)型獲取節(jié)點(diǎn)
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="lstInfos"></param>
    /// <param name="name"></param>
    /// <returns></returns>
    public TreeNode GetNodes<T>(T[] lstInfos, string name) where T : MemberInfo
    {
      TreeNode tNode = new TreeNode(name);
      foreach (var t in lstInfos)
      {
        tNode.Nodes.Add(t.Name);
      }
      return tNode;
    }
    /// <summary>
    /// 調(diào)用靜態(tài)方法的例子
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnCallStaticByReflection_Click(object sender, EventArgs e)
    {
      AssemblyName assemblyName = AssemblyName.GetAssemblyName("TestAssembly.exe");
      Assembly assembly = Assembly.Load(assemblyName);
      Type t = assembly.GetType("TestAssembly.Program", true, true);
      //object o= Activator.CreateInstance(t, false);
      MethodInfo methodInfo = t.GetMethod("Main",BindingFlags.Static|BindingFlags.Public);
      methodInfo.Invoke(null,new string[][] { new string[] { "g" } });
    }
    /// <summary>
    /// 調(diào)用非靜態(tài)方法的例子
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnCallFunctionByReflection_Click(object sender, EventArgs e)
    {
      AssemblyName assemblyName = AssemblyName.GetAssemblyName("TestAssembly.exe");//此處是相對(duì)路徑
      Assembly assembly = Assembly.Load(assemblyName);
      Type t = assembly.GetType("TestAssembly.Program", true, true);
      object o = Activator.CreateInstance(t, false);
      MethodInfo methodInfo = t.GetMethod("TestAssembly", BindingFlags.Instance|BindingFlags.Public);
      object tmp= methodInfo.Invoke(o,null);
      MessageBox.Show(tmp.ToString());
    }
  }

動(dòng)態(tài)加載和反射調(diào)用的功能還有很多,不能一一列舉,只能在以后的工作中用到時(shí)再加以研究。

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • C#使用OpenCvSharp4實(shí)現(xiàn)讀取本地視頻

    C#使用OpenCvSharp4實(shí)現(xiàn)讀取本地視頻

    OpenCvSharp4庫(kù)是一個(gè)基于.Net封裝的OpenCV庫(kù),這篇文章主要介紹了C#使用OpenCvSharp4實(shí)現(xiàn)讀取本地視頻的詳細(xì)教程,有需要的小伙伴可以參考下
    2024-01-01
  • C#?HttpClient超時(shí)重試機(jī)制詳解

    C#?HttpClient超時(shí)重試機(jī)制詳解

    超時(shí)重試的實(shí)現(xiàn)方式可以使用循環(huán)結(jié)構(gòu),在請(qǐng)求發(fā)起后等待一定時(shí)間,若超時(shí)未收到響應(yīng),則再次發(fā)起請(qǐng)求,循環(huán)次數(shù)可以根據(jù)實(shí)際情況進(jìn)行設(shè)置,一般建議不超過(guò)三次,這篇文章主要介紹了C#?HttpClient超時(shí)重試,需要的朋友可以參考下
    2023-06-06
  • 關(guān)于C#中yield關(guān)鍵字的深入解析

    關(guān)于C#中yield關(guān)鍵字的深入解析

    這篇文章主要給大家介紹了關(guān)于C#中yield關(guān)鍵字的深入解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • C#使用DateTime獲取日期和時(shí)間的實(shí)現(xiàn)

    C#使用DateTime獲取日期和時(shí)間的實(shí)現(xiàn)

    在C#中,DateTime類(lèi)是用來(lái)處理日期和時(shí)間的類(lèi),它具有許多屬性和方法,用于操作和獲取日期和時(shí)間的不同部分,本文就來(lái)介紹一下C#使用DateTime獲取,感興趣的可以了解一下
    2023-11-11
  • C#使用Parallel類(lèi)進(jìn)行多線程編程實(shí)例

    C#使用Parallel類(lèi)進(jìn)行多線程編程實(shí)例

    這篇文章主要介紹了C#使用Parallel類(lèi)進(jìn)行多線程編程的方法,實(shí)例分析了Parallel類(lèi)的相關(guān)使用技巧,需要的朋友可以參考下
    2015-06-06
  • 探討:關(guān)閉瀏覽器后,php腳本會(huì)不會(huì)繼續(xù)運(yùn)行

    探討:關(guān)閉瀏覽器后,php腳本會(huì)不會(huì)繼續(xù)運(yùn)行

    本篇文章是對(duì)關(guān)閉瀏覽器后,php腳本會(huì)不會(huì)繼續(xù)運(yùn)行進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C#生成帶注釋的dll并引用實(shí)現(xiàn)

    C#生成帶注釋的dll并引用實(shí)現(xiàn)

    本文主要介紹了C#生成帶注釋的dll并引用實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Winform學(xué)生信息管理系統(tǒng)登陸窗體設(shè)計(jì)(1)

    Winform學(xué)生信息管理系統(tǒng)登陸窗體設(shè)計(jì)(1)

    這篇文章主要為大家詳細(xì)介紹了Winform學(xué)生信息管理系統(tǒng)登陸窗體設(shè)計(jì)思路,感興趣的小伙伴們可以參考一下
    2016-05-05
  • C#操作 JSON方法匯總

    C#操作 JSON方法匯總

    本文給大家匯總了一下使用C#操作Json的方法,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下
    2015-10-10
  • C#運(yùn)算符大全_各種運(yùn)算符號(hào)的概述及作用

    C#運(yùn)算符大全_各種運(yùn)算符號(hào)的概述及作用

    以下是對(duì)C#中各種運(yùn)算符號(hào)的說(shuō)明及作用進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10

最新評(píng)論

连城县| 安多县| 喜德县| 铜山县| 泗水县| 上饶县| 班戈县| 绍兴县| 图木舒克市| 哈巴河县| 蕉岭县| 莱州市| 囊谦县| 英德市| 济阳县| 江都市| 高台县| 青阳县| 中阳县| 德昌县| 大姚县| 三门峡市| 延吉市| 万山特区| 无为县| 莒南县| 昌邑市| 三河市| 吉林省| 西畴县| 乌苏市| 丹凤县| 黄平县| 蒙山县| 南江县| 绥滨县| 固原市| 威远县| 长垣县| 依兰县| 泌阳县|