关于窗体方面的问题(DLL窗体)

lxkim 2005-01-13 03:17:17
想把软件做成一个MDI主界面(MDI窗体),然后将每个大模块都写成Dll,
每个Dll中包含很多窗体,在主界面动态生成菜单,菜单里调用这些dll,显示封装在dll里的窗体,请问如何实现将Dll窗体显示?并且显示时成为主界面(MDIForm)的子窗体?dll窗体里还要用按钮返回主窗体。
另外:如果我在主界面中调用Dll,不使用引用的方法,有没有动态调用Dll的方法,即不
预先将所有的Dll调入内存,而是要用哪一个模块,就动态地调用哪一个Dll窗体.就像执行一个Exe文件一样?因为dll有可能增加。
最好能有实例代码
...全文
330 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
egxsun 2005-01-14
  • 打赏
  • 举报
回复
Assembly asm = Assembly.LoadFile("childForm.dll");
Type formType = asm.GetType("form1");
Form frm = OpenForm(formType);

//OpenForm写法
Form OpenForm(Type formType)
{
Form frm = formType.InvokeMember(null,
BindingFlags.DeclaredOnly
| BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Instance
| BindingFlags.CreateInstance,
null, null, formArgs) as Form;
frm.MdiParent = mdiParent;
frm.Show();
return frm;
}
试试看
FJGoodGood 2005-01-14
  • 打赏
  • 举报
回复
呵呵,就是formType不同而已:

Type formType1 = asm.GetType("form1"); // 这里可能要求加命名空间,比如:MyChildForm.form1
Form frm = OpenForm(formType1);

Type formType2 = asm.GetType("form2");
Form frm = OpenForm(formType2);
lxkim 2005-01-14
  • 打赏
  • 举报
回复
to:FJGoodGood(_FJ_强中强) ,你好!
你的childForm.dll里封装了一个MyChildForm吧?如果封装几个,比如有form1、form2......,怎么来在主窗体里调用childForm.dll里指定的form1?
还有form1里有一个按钮,可以返回主窗体,怎么写这个代码,并退出form1?
谢谢!
GHGB 2005-01-14
  • 打赏
  • 举报
回复
学习中...
FJGoodGood 2005-01-14
  • 打赏
  • 举报
回复
其中mdiParent可以用this代替。
FJGoodGood 2005-01-14
  • 打赏
  • 举报
回复
楼主,我上边不是写了打开窗口的代码了嘛。

另外,如果要动态获得DLL里面的类型,可以这样做:

Assembly asm = Assembly.LoadFile("childForm.dll");
Type formType = asm.GetType("MyChildForm");
Form frm = OpenForm(formType);

//OpenForm写法
Form OpenForm(Type formType)
{
Form frm = formType.InvokeMember(null,
BindingFlags.DeclaredOnly
| BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Instance
| BindingFlags.CreateInstance,
null, null, formArgs) as Form;
frm.MdiParent = mdiParent;
frm.Show();
return frm;
}
lxkim 2005-01-14
  • 打赏
  • 举报
回复
to:nga96(),你好!能给一点代码吗?
lxkim@126.com
谢谢!
nga96 2005-01-14
  • 打赏
  • 举报
回复
对,跟我们的一样,使用反射来完成。要代码么
LoveCherry 2005-01-14
  • 打赏
  • 举报
回复
mark
lxkim 2005-01-14
  • 打赏
  • 举报
回复
能不能给一个比较详细的例子呀
北京的雾霾天 2005-01-14
  • 打赏
  • 举报
回复
相似的问题太多的,楼主在CSDN上找一下,只下午就好几个类似问题的帖子.....

http://community.csdn.net/Expert/topic/3725/3725621.xml?temp=.2467157
http://community.csdn.net/Expert/topic/3724/3724594.xml?temp=.1360437
http://community.csdn.net/Expert/TopicView.asp?id=3724752
tsys2000 2005-01-14
  • 打赏
  • 举报
回复
mark
Fibona 2005-01-14
  • 打赏
  • 举报
回复
同意楼上的。
lingyun2003 2005-01-14
  • 打赏
  • 举报
回复
学习!
lxkim 2005-01-14
  • 打赏
  • 举报
回复
谢谢,我试试
egxsun 2005-01-14
  • 打赏
  • 举报
回复
private void button1_Click(object sender, System.EventArgs e)
{
Assembly asm = Assembly.LoadFile(Application.StartupPath +"\\WindowsControlLibrary1.dll");
Type formType = asm.GetType("WindowsControlLibrary1.Form1");
Form frm = OpenForm(formType);
this.Hide();

}

Form OpenForm(Type formType)
{
Form frm = formType.InvokeMember(null,
BindingFlags.DeclaredOnly
| BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Instance
| BindingFlags.CreateInstance,
null, null, null) as Form;
//frm.MdiParent = this;
frm.Owner =this;
frm.Show();
return frm;
}

如果是Mdi窗体就用frm.MdiParent = this;如果是普通窗体就用frm.Owner =this;

在WindowsControlLibrary1.dll里有一个按钮button1可以返回主窗体,同样
this.Owner.Show();
this.Close();
如果是MDI窗体就用this.MdiParent.show();
lxkim 2005-01-14
  • 打赏
  • 举报
回复
谢谢
egxsun 2005-01-14
  • 打赏
  • 举报
回复
我给你发了一个程序源码,你看看
egxsun 2005-01-14
  • 打赏
  • 举报
回复
行不行?
Jim3 2005-01-13
  • 打赏
  • 举报
回复
使用反射

如果需要数据交换可以再定义一个接口
加载更多回复(9)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧