美文网首页
C#反射新

C#反射新

作者: 成熟的青菜 | 来源:发表于2019-04-28 16:19 被阅读0次

根据DLL获取窗体


image.png
image.png

获取某个类或者某个接口

/// <summary>
      /// <para>以反射的方式从指定DLL创建指定类的实例,如果文件名中没有包含绝对路径,则自动加上系统运行目录合成绝对路径。</para>
      /// <para>创建实例时自动获取登录用户的数据库连接字符串传入实例</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文件,如果没有指定绝对路径,则自动加上系统运行目录合成绝对路径</param>
      /// <param name="className">用于创建实例的完全限定类名</param>
      /// <param name="args">实例化时传给构造函数的参数</param>
      /// <returns>实例创建成功且能成功转换成指定的类型,则返回实例对象,否则返回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);
              // 在系统运行目录中搜索
              if (!File.Exists(fullName))
              {
                  fullName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, String.Format(@"bin\{0}", dllFile));
                  // 在系统运行目录中的Bin目录中搜索,主要是处理Web应用程序
                  if (!File.Exists(fullName))
                  {
                      throw new FileNotFoundException(String.Format("应用程序缺少部件,未找到文件:{0}", fullName));
                  }
              }
          }
          else
          {
              throw new FileNotFoundException(String.Format("应用程序缺少部件,未找到文件:{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));
      }

继续调用类 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);       // 仅为找不到类时引发错误
          T rstInstance = dll.CreateInstance(className, false, BindingFlags.CreateInstance, null, args, null, null) as T;

          return rstInstance;
      }

相关文章

  • C#反射新

    根据DLL获取窗体 获取某个类或者某个接口

  • C#它山之石

    C# 使用反射技术实例化指定的类C#之玩转反射Reactive Extensions入门IoC solutions...

  • Unity 之如何写出强壮的代码

    【反射】 Unity C#基础之 反射反射,程序员的快乐 Unity C#基础之 特性,一个灵活的小工具 【多线程...

  • 目录 - C#

    总目录 C# 第01局:泛型 C# 第02局:反射 C# 第03局:特性 C# 第04局:委托 C# 第05局:事...

  • C#特性(Attribute)-现学现用

    前言 想要灵性的使用C#反射机制,特性(Attribute)的使用是必不可少的。 C# 特性(Attribute)...

  • C#反射

    C# 反射(Reflection) 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模...

  • C#反射

    什么是元数据,什么是反射 程序是用来处理数据的,文本和特性都是数据,而程序本身(类的本身和BLC中的类) 这些也是...

  • C#反射

    根据moduleName反射到某个类某个方法 转换成DataView操作Datatable ![B(IRRLH7`...

  • C#反射

    注意:C#本身已经时候用了反射!!!! 以下了解即可不过,反射可以拿到类中private的字段,这个对编程则有用...

  • Swift中的反射Mirror

    Swift中的反射Mirror [TOC] 前言 Mirror是Swift中的反射机制,对于C#和Java开发人员...

网友评论

      本文标题:C#反射新

      本文链接:https://www.haomeiwen.com/subject/cjzfbqtx.html