C#开发之反射的简单使用

以前在Windows Mobile中写过一个写好的Dll中的图片的例子,现在在项目中有接触到在一个大的窗体中,动态的加载一些窗体这样的需求。将功能按照模块的划分进行单独开发成单独的Dll,主框架根据需要动态加载不同的Dll来加载不同的窗体来满足不同的需求。
1.以下是一个简单的例子,有一个按钮点击事件,点击事件实现加载已知的Dll中的窗体。

private void button1_Click(object sender, EventArgs e) {

            //点击加载DLL中的窗体Form4
            string dllName = "ClassLibrary1.dll";
            string formName = "ClassLibrary1.Form4";
            Form ff = null;
			//加载Dll
            Assembly MyAssembly = Assembly.LoadFrom(dllName);
            //获得Dll中的所有类、成员
			Type[] types = MyAssembly.GetTypes();
            Type type = null;
			//遍历出需要的成员(窗体)
            foreach(Type t in types) {
                if(t.FullName == formName) {
                    type = t;                
                    break;
                }
            }
			//对窗体进行实例化
            ff = (Form)Activator.CreateInstance(type);
            ff.Show();
        }

----------------------卑鄙的分割线------------------------------
2.反射机制调用Dll中的方法

 public string Add(int x, int y) {

            return x + y + "";
        }
 private void button2_Click(object sender, EventArgs e) {

		//加载Dll信息
		string dllName = "ClassLibrary1.dll";
		string dllNamespace="ClassLibrary1";
		string className = "Class1";
		string methodName = "Add";
		//调用的方法参数
		object[] parameters = new object[2] { 1, 2 };
		string message = "";
		//加载Dll信息
		Assembly MyAssembly = Assembly.LoadFrom(dllName);
		Type[] types = MyAssembly.GetTypes();
		//遍历方法所在的类
		foreach(Type t in types) {
			if(t.Namespace == dllNamespace && t.Name == className) {
				MethodInfo m = t.GetMethod(methodName);
				if(m != null) {
					//调用Dll中的方法
					object o = Activator.CreateInstance(t);
					message= m.Invoke(o, parameters).ToString();
					MessageBox.Show(message);
				} else
					MessageBox.Show(" 装载出错 !");
			}
		}

        }

----------------------卑鄙的分割线------------------------------
3.再来一个简单的应用,动态加载本项目下的窗体(貌似用处不大)

  private void Form1_Load(object sender, EventArgs e)
        {

            //加载本项目下的窗体
            Type type = Type.GetType("TabWindow.Form2");
            Form ff = (Form)Activator.CreateInstance(type);
            ff.Show();
        }




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章