引用的控件是如何加载在C#工程里面的?

如题。很多控件都是通过 【添加引用】后添加的。一般放在生成文件的目录下。
请问是用程序动态加载 该怎么实现???谢谢

作者: ponydph   发布时间: 2011-06-15

用Assembly

作者: bdmh   发布时间: 2011-06-15

用反射
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection; //一定要引用

namespace LearnPractice
{
  class Program
  {
  static void Main(string[] args)
  {
  //加载程序集
  //Assembly ass = Assembly.Load("ReflectionLearn");
  //和上面的效果是一样的
  Assembly ass = Assembly.LoadFrom("ReflectionLearn.dll");

  //获取程序集中敌定义的类型
  Type[] types = ass.GetTypes();

  Type stu = null;

  //遍历程序集中的类型
  foreach (Type t in types)
  {
  //判断类型名称是否为Student
  if (t.Name == "Student")
  {
  //获取类型
  stu = t;
  }
  }

  //获取程序集中的模块
  Module[] mous = ass.GetModules();

  //遍历程序集中的模块
  foreach (Module m in mous)
  {
  //输出程序集名称
  Console.WriteLine(m.Name);
  }
  Console.WriteLine("=====================");

  //获取类型中的方法
  MethodInfo[] methods = stu.GetMethods();

  //遍历类型中的方法
  foreach (MethodInfo mf in methods)
  {
  //输出方法名称
  Console.WriteLine(mf.Name);
  }
  Console.WriteLine("================");

  //动态创建类,通过无参的构造函数实现
  Object obj = Activator.CreateInstance(stu);

  //获取指定的方法
  MethodInfo GetName = stu.GetMethod("GetName");
  MethodInfo learn = stu.GetMethod("learn");
  MethodInfo ShowStr = stu.GetMethod("ShowStr");


  //输出方法的返回类型名称
  Console.WriteLine(GetName.ReturnType.Name);
  Console.WriteLine("=========================");

  //执行方法通过上面动态创建的类来执行方法,第一个参数即动态创建的类,第二个参数为方法的参数
  Console.WriteLine(GetName.Invoke(obj, null));

  //获取类型的属性作为参数
  object[] mParas = { "zhou" };
  Console.WriteLine(learn.Invoke(obj, mParas));

  //动态创建类,通过带参的构造函数实现
  //创建参数结合
  object[] objs = { "jack", 22, "男" };
  Object objPara = Activator.CreateInstance(stu,objs);

  //执行方法通过上面动态创建的类来执行方法,第一个参数即动态创建的类,第二个参数为方法的参数
  Console.WriteLine(GetName.Invoke(objPara, null));
  Console.WriteLine(learn.Invoke(objPara, mParas));

  Console.WriteLine("============================");
  //获取方法的参数
  ParameterInfo[] parameters = learn.GetParameters();

  //遍历方法的参数
  foreach (ParameterInfo para in parameters)
  {
  //输出参数的名称,参数类型
  Console.WriteLine(para.Name+":"+para.ParameterType);
  }
  //上面执行的方法都是非静态方法下面执行静态方法
  Console.WriteLine(ShowStr.Invoke(null, null));
   
  //私有方法调用,第二个参数设置实例成员和非公共成员在搜索范围中
  MethodInfo GetMsg = stu.GetMethod("GetMsg",BindingFlags.Instance|BindingFlags.NonPublic);
  Console.WriteLine(GetMsg.Invoke(objPara, null));
   
  //获取属性
  PropertyInfo Name = stu.GetProperty("Name");
  Console.WriteLine(Name.GetValue(objPara, null));
  //设置属性值
  Name.SetValue(objPara, "zhou", null);
  Console.WriteLine(Name.GetValue(objPara, null));

  //获取无参构造
  ConstructorInfo con = stu.GetConstructor(new Type[0]);
  object conObj = con.Invoke(null);
  Console.WriteLine(GetName.Invoke(conObj, null));

  //获取带参构造
  ConstructorInfo conPara = stu.GetConstructor(new Type[] { typeof(string), typeof(int), typeof(string) });
  object conParaObj = conPara.Invoke(new object[] { "wang", 24, "男" });
  Console.WriteLine(GetName.Invoke(conParaObj, null));
   
  }
  }
}

作者: zhou_xuexi   发布时间: 2011-06-15

多谢。

作者: ponydph   发布时间: 2011-06-15