程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#靜態加載dll擴大體系功效的辦法

C#靜態加載dll擴大體系功效的辦法

編輯:C#入門知識

C#靜態加載dll擴大體系功效的辦法。本站提示廣大學習愛好者:(C#靜態加載dll擴大體系功效的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#靜態加載dll擴大體系功效的辦法正文


本文實例講述了C#靜態加載dll擴大體系功效的辦法。分享給年夜家供年夜家參考。詳細剖析以下:

靜態加載dll,重要是為了擴大功效,加強靈巧性而完成的。重要經由過程xml設置裝備擺設,來獲得一切要靜態加載的dll,然後經由過程反射機制來挪用dll中的類及其辦法。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace DynamicLoadDLL
{
 /// <summary>
 /// 靜態加載dll
 /// </summary>
 public class LoadDLL
 {
  private Assembly ass = null;
  /// <summary>
  /// 加載dll
  /// </summary>
  /// <param name="dllPath">dll文件途徑</param>
  public LoadDLL(string dllPath)
  {
   this.ass = Assembly.LoadFrom(dllPath);
  //應用dll的途徑加載(fullname)
  }
  /// <summary>
  /// 前往反射的dll
  /// </summary>
  /// <returns></returns>
  public Assembly GetAssembly()
  {
   return this.ass;
  }
  /// <summary>
  /// 獲得一切類名
  /// </summary>
  /// <returns></returns>
  public Type[] GetClass()
  {
   return ass.GetTypes();
  }
  /// <summary>
  /// 獲得法式集下的一切文件名
  /// </summary>
  /// <returns></returns>
  public Module[] GetModules()
  {
   return ass.GetModules();
  }
  /// <summary>
  /// 獲得法式集清單文件表中的文件
  /// </summary>
  /// <returns></returns>
  public FileStream[] GetFiles()
  {
   return ass.GetFiles();
  }
 }
}

這個是加載dll的,然後前往一個Assembly類型的一個反射值,假如該dll中有多個定名空間和類的話,就只用一個Assembly類型的一個反射值便可以完成挪用,不然每次生成一個類,都須要反射一次。IO操作絕對而言是比擬消耗CPU,影響效力的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace DynamicLoadDLL
{
 /// <summary>
 /// 加載類
 /// </summary>
 public class LoadClass
 {
  private static LoadClass dlc = null;
  private Type type;
  private object obj = null;
  //實例
  /// <summary>
  /// 加載dll
  /// </summary>
  /// <param name="ass">dll援用</param>
  /// <param name="nameSpace">類的定名空間</param>
  /// <param name="classPath">類稱號</param>
  private LoadClass(Assembly ass, string nameSpace, string classPath)
  {
   //加載dll後,須要應用dll中某類.
   type = ass.GetType(nameSpace + "." + classPath);
   //應用類型的定名空間和稱號取得類型
   //須要實例化類型,才可使用,
   //參數可以工資的指定,也能夠無參數,靜態實例可以省略
   obj = Activator.CreateInstance(type);
  //應用指定的參數實例話類型
  }
  /// <summary>
  /// 加載dll
  /// </summary>
  /// <param name="ass">dll援用</param>
  /// <param name="nameSpace">類的定名空間</param>
  /// <param name="classPath">類稱號</param>
  public static LoadClass GetInstance(Assembly ass, string nameSpace, string classPath)
  {
   if (dlc == null)
   {
    dlc = new LoadClass(ass, nameSpace, classPath);
   }
   return dlc;
  }
  /// <summary>
  /// 獲得屬性集
  /// </summary>
  /// <returns>前往屬性值</returns>
  public PropertyInfo[] GetAttrs()
  {
   //挪用類型中的某個屬性:
   PropertyInfo[] prop = type.GetProperties();
   //經由過程屬性稱號取得屬性
   //前往屬性集
   return prop;
  }
  public MethodInfo[] GetMethods()
  {
   //挪用類型中的辦法:
   MethodInfo[] method = type.GetMethods(BindingFlags.NonPublic);
   //取得辦法集
   //前往辦法集
   return method;
  }
  /// <summary>
  /// 獲得屬性值
  /// </summary>
  /// <param name="attrName">屬性稱號</param>
  /// <returns>前往屬性值</returns>
  public object GetAttrValue(string attrName)
  {
   //挪用類型中的某個屬性:
   PropertyInfo prop = type.GetProperty(attrName);
   //經由過程屬性稱號取得屬性
   //前往屬性值
   return prop.GetValue(obj);
  }
  /// <summary>
  /// 設置屬性值
  /// </summary>
  /// <param name="attrName">屬性稱號</param>
  /// <returns>前往屬性值</returns>
  public void SetAttrValue(string attrName, string attrValue)
  {
   //挪用類型中的某個屬性:
   PropertyInfo prop = type.GetProperty(attrName);
   //經由過程屬性稱號取得屬性
   //前往屬性值
   prop.SetValue(obj, attrValue);
  }
  /// <summary>
  /// 履行類辦法
  /// </summary>
  /// <param name="methodName">辦法稱號</param>
  /// <param name="paras">參數</param>
  /// <param name="types">參數類型</param>
  /// <returns></returns>
  public object GetMethod(string methodName, object[] paras,Type[] types)
  {
   //挪用類型中的某個辦法:
   MethodInfo method = type.GetMethod(methodName,types);
   //經由過程辦法稱號取得辦法
   //履行辦法
   return method.Invoke(obj, paras);
  }
 }
}

下面這個類依據dll反射值,定名空間和類名,反射出一個詳細的類,還供給了屬性和辦法的挪用辦法。很便利。

這些是我在研討插件編程時,順帶研討的,不太深刻。

願望本文所述對年夜家的C#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved