以前在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中的方法
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(); } 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(" 装载出错 !"); } } }