C#反射新

根據(jù)DLL獲取窗體


image.png

image.png

獲取某個類或者某個接口

/// <summary>
      /// <para>以反射的方式從指定DLL創(chuàng)建指定類的實例,如果文件名中沒有包含絕對路徑,則自動加上系統(tǒng)運行目錄合成絕對路徑。</para>
      /// <para>創(chuàng)建實例時自動獲取登錄用戶的數(shù)據(jù)庫連接字符串傳入實例</para>
      /// <para>異常:</para>
      /// <para>  ArgumentNullException</para>
      /// <para>  MissingMethodException</para>
      /// <para>  FileNotFoundException</para>
      /// <para>  FileLoadException</para>
      /// <para>  BadImageFormatException</para>
      /// <para>  SecurityException</para>
      /// <para>  ArgumentException</para>
      /// <para>  PathTooLongException</para>
      /// </summary>
      /// <typeparam name="T">返回的實例類型</typeparam>
      /// <param name="dllFile">指定類所在DLL文件,如果沒有指定絕對路徑,則自動加上系統(tǒng)運行目錄合成絕對路徑</param>
      /// <param name="className">用于創(chuàng)建實例的完全限定類名</param>
      /// <param name="args">實例化時傳給構(gòu)造函數(shù)的參數(shù)</param>
      /// <returns>實例創(chuàng)建成功且能成功轉(zhuǎn)換成指定的類型,則返回實例對象,否則返回null</returns>
      public static T CreateInstanceWithCnString<T>(string dllFile, string className, params object[] args) where T : class
      {
          string fullName = "";

          // 在當前目錄中搜索
          if (File.Exists(dllFile))
          {
              fullName = dllFile;
          }
          else if (!Path.IsPathRooted(dllFile))
          {
              fullName = Path.Combine(CoreOption.SystemRunPath, dllFile);
              // 在系統(tǒng)運行目錄中搜索
              if (!File.Exists(fullName))
              {
                  fullName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, String.Format(@"bin\{0}", dllFile));
                  // 在系統(tǒng)運行目錄中的Bin目錄中搜索,主要是處理Web應(yīng)用程序
                  if (!File.Exists(fullName))
                  {
                      throw new FileNotFoundException(String.Format("應(yīng)用程序缺少部件,未找到文件:{0}", fullName));
                  }
              }
          }
          else
          {
              throw new FileNotFoundException(String.Format("應(yīng)用程序缺少部件,未找到文件:{0}", dllFile));
          }

          if (String.IsNullOrEmpty(Erp7Runtime.UserLoginInfo.ID))
              return HSAssembly.CreateInstance<T>(fullName, className);
          else
              return HSAssembly.CreateInstance<T>(fullName, className, LoginManagerFactory.Owner.Create().GetDBConnectionString(Erp7Runtime.UserLoginInfo.ID));
      }

繼續(xù)調(diào)用類 HSAssembly
      public static T CreateInstance<T>(string dllFile, string className, params object[] args) where T : class
      {
          Assembly dll = Assembly.LoadFrom(dllFile);
          Type instance = dll.GetType(className, true);       // 僅為找不到類時引發(fā)錯誤
          T rstInstance = dll.CreateInstance(className, false, BindingFlags.CreateInstance, null, args, null, null) as T;

          return rstInstance;
      }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容