亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# 動態加載程序集信息

2020-01-24 00:44:03
字體:
來源:轉載
供稿:網友

 在設計模式的策略模式中,需要動態加載程序集信息,本文通過一個簡單的實例,來講解動態加載Dll需要的知識點。

涉及知識點:

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

如下圖所示:

具體代碼如下:

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="請選擇"      };      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("請選擇dll文件");        return;      }      LoadDllInfo(this.txtDllFile.Text);    }    /// <summary>    /// 動態加載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();//獲取程序集中定義的所有類型        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;//是否加載到只反射模塊中        //更新到節點        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;//公共類型集合        tvNodes[0].Nodes.Add("模塊信息");        int i = 0;        foreach (var module in modules)        {          FieldInfo[] fields = module.GetFields();//返回模塊中定義的全局字段          MethodInfo[] methods = module.GetMethods();//返回模塊中定義的全局方法          Type[] mtypes = module.GetTypes();//返回模塊中定義的類型集合          bool isResource = module.IsResource();//指示此模塊是否是資源          int mdStreamVersion = module.MDStreamVersion;//獲取源數據流的版本          Guid versionId = module.ModuleVersionId;//獲取模塊的版本ID          string moduleName = module.Name;//獲取模塊的名稱,去除路徑的          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("數據流版本:{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("類型信息");        i = 0;        foreach (var type in types)        {          TypeAttributes typeAttributes = type.Attributes;//與Type關聯的屬性          string typeFullName = type.FullName;//獲取類型的完全限定名稱          FieldInfo[] typeFields = type.GetFields();//獲取所有的公共字段          EventInfo[] typeEvents = type.GetEvents();//獲取所有的 公共事件          Type[] typeInterfaces = type.GetInterfaces();//獲取所有的公共接口          MemberInfo[] typeMembers = type.GetMembers();//獲取所有的公共成員          MethodInfo[] typeMethods = type.GetMethods();//獲取所有的公共方法          TypeInfo typeInfo = type.GetTypeInfo();//返回指定類型的表述形式          string nameSpace = type.Namespace; //指定類型的命名空間          string typeName = type.Name;//獲取當前成員的名稱          ConstructorInfo[] typeConstructors = type.GetConstructors();//類型的構造函數          tvNodes[0].Nodes[2].Nodes.Add(string.Format("類型:{0}", typeName));          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(string.Format("全名稱:{0}", typeFullName));          tvNodes[0].Nodes[2].Nodes[i].Nodes.Add(string.Format("制定類型名稱:{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, "構造函數"));          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>    /// 通過類型獲取節點    /// </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>    /// 調用靜態方法的例子    /// </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>    /// 調用非靜態方法的例子    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void btnCallFunctionByReflection_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("TestAssembly", BindingFlags.Instance|BindingFlags.Public);      object tmp= methodInfo.Invoke(o,null);      MessageBox.Show(tmp.ToString());    }  }

動態加載和反射調用的功能還有很多,不能一一列舉,只能在以后的工作中用到時再加以研究。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人情趣片在线观看免费| 欧美在线观看日本一区| 成人av在线亚洲| 日韩av在线天堂网| 欧美日韩国产综合视频在线观看中文| 精品动漫一区二区三区| 亚洲电影第1页| 国产一区二区三区视频| 亚洲精品第一国产综合精品| 最新国产精品亚洲| 国产精品第一视频| 精品福利一区二区| 国产成人涩涩涩视频在线观看| 麻豆国产va免费精品高清在线| 国产欧洲精品视频| 日韩电视剧免费观看网站| 一区二区三区 在线观看视| 国产成人一区二区在线| 在线成人一区二区| 精品欧美一区二区三区| 中国人与牲禽动交精品| 操日韩av在线电影| 亚洲欧美精品中文字幕在线| 久久久久国产精品www| 欧洲美女7788成人免费视频| 久久99热这里只有精品国产| 久久天天躁夜夜躁狠狠躁2022| 日韩电影免费在线观看| 国产日韩中文字幕在线| 欧美在线一区二区视频| 欧美日韩免费在线观看| 中文字幕亚洲天堂| 精品视频久久久久久久| 疯狂做受xxxx欧美肥白少妇| 亚洲一二三在线| 中文字幕不卡av| 国产亚洲精品久久久久久| 欧美在线激情视频| 亚洲一区二区黄| 日韩在线观看免费| 97免费中文视频在线观看| 色伦专区97中文字幕| 日产精品久久久一区二区福利| 色午夜这里只有精品| 亚洲日本中文字幕免费在线不卡| 亚洲第一区中文字幕| 国产亚洲精品综合一区91| 亚洲成年人在线播放| 92国产精品久久久久首页| 国产午夜精品一区理论片飘花| 国模私拍一区二区三区| 精品国产自在精品国产浪潮| 成人亚洲综合色就1024| 亚洲最新在线视频| 久久久久久成人精品| 一区二区国产精品视频| 国产欧美日韩最新| 国产成人+综合亚洲+天堂| 日韩国产中文字幕| 国产精品激情av在线播放| 中文字幕亚洲综合久久筱田步美| 成人黄在线观看| 国产99久久精品一区二区永久免费| 8x海外华人永久免费日韩内陆视频| 欧美日韩精品中文字幕| 亚洲人成电影网站色…| 国产亚洲一区二区精品| 久久手机精品视频| 欧美在线性视频| 中文字幕亚洲一区| 在线看国产精品| 亚洲国产99精品国自产| 668精品在线视频| 自拍亚洲一区欧美另类| 欧美孕妇与黑人孕交| 日韩理论片久久| 奇米四色中文综合久久| 国产精品久久久久99| 亚洲综合最新在线| 亚洲午夜女主播在线直播| 97热在线精品视频在线观看| 久久久久久久久中文字幕| 日韩精品丝袜在线| 日韩第一页在线| 日韩av免费在线播放| 亚洲成人精品av| 久久久久久国产免费| 欧美性xxxxxx| 91福利视频在线观看| 国产精品一区二区三区在线播放| 亚洲欧洲av一区二区| 国产精品盗摄久久久| 日韩精品在线观看一区| 亚洲香蕉在线观看| 欧美一级免费看| 国产精品激情av电影在线观看| 国产精品一区二区性色av| 欧美性猛交99久久久久99按摩| 日韩欧中文字幕| 日韩成人网免费视频| 日韩电影第一页| 奇米一区二区三区四区久久| 色偷偷噜噜噜亚洲男人| 国产一区二区三区四区福利| 欧美重口另类videos人妖| 亚洲第一页中文字幕| 中文字幕欧美视频在线| 另类专区欧美制服同性| 亚洲精品一区二区网址| 在线观看日韩视频| 亚洲精品美女在线观看播放| 欧美国产第二页| 97久久精品在线| 91亚洲永久免费精品| 精品五月天久久| 在线精品视频视频中文字幕| 欧美精品一区二区三区国产精品| 亚洲qvod图片区电影| 91国偷自产一区二区三区的观看方式| 疯狂做受xxxx欧美肥白少妇| 欧美成人午夜激情视频| 精品女同一区二区三区在线播放| 亚洲欧美日韩国产成人| 久久五月天色综合| 欧美国产日本在线| 亚洲成色www8888| 成人妇女淫片aaaa视频| 色香阁99久久精品久久久| 国产精品av免费在线观看| 亚洲人成电影网站| 精品二区三区线观看| 亚洲国产精品国自产拍av秋霞| 91香蕉亚洲精品| 亚洲精品小视频在线观看| 欧美一级大片在线观看| 亚洲男人天堂2024| 日本欧美一级片| 国产精品爱久久久久久久| 国产美女久久精品| 亚洲国产日韩精品在线| 成人福利在线视频| 欧美国产高跟鞋裸体秀xxxhd| 丝袜情趣国产精品| 国产亚洲美女久久| 亚洲在线www| 欧美老女人性生活| 亚洲美女性视频| 日韩中文在线中文网在线观看| 精品成人在线视频| 中文字幕久久精品| 欧美精品九九久久| 琪琪亚洲精品午夜在线| 国产午夜精品视频免费不卡69堂| 久久激情视频免费观看| 国产精品午夜国产小视频| 57pao精品| 国产精品入口夜色视频大尺度| 亚洲高清免费观看高清完整版| 精品亚洲一区二区三区在线观看| 国产精品美女久久久久久免费| 国产日韩欧美影视| 国产精品无码专区在线观看| 国产mv免费观看入口亚洲| 久久久女人电视剧免费播放下载|