引用的控件是如何加载在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));
}
}
}
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