以前在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();
}