关于跨AppDomain传递Form的问题

lemonlee 2009-03-22 05:32:52
最近在做一个动态的程序。主窗体是一个MDI的父窗体。子窗体是一个一个的Form,并且这些Form是包含在各个dll的Assembly里面的。子窗体通过反射的方式加载、并添加到一个单独的AppDomain里面,这样的话子窗体和父窗体不在同一个应用程序域里面。我已经实现了在父窗体获取这个跨应用程序域返回过来的Form对象。只是在设置MDI方式显示的时候,在运行的时候获得一个异常:

程序集“System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中的类型“System.Windows.Forms.MdiClient+ControlCollection”未标记为可序列化。

其对应的语句是:

Form childForm = plugin.Frm;
childForm.MdiParent = this;
childForm.Show();

我实验过,如果注释掉红色的那一行,也即不设置MDI父窗体,这个Form也是可以显示的,只是它并不作为MDI的子窗体。
经过我推测,估计是在设置MdiParent属性的时候,需要将this对象跨域回传给childForm。而this也就是MDI父窗体,也是一个简单的Form,而没有继承自MarshalByRefObject,这样的话貌似跨域传递会有问题。

不知道哪位大侠有没有遇到过这样的问题?应该如何解决?请赐教……
...全文
213 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangping_li 2009-04-02
  • 打赏
  • 举报
回复
你就建一个单独的项目,里面包括所有窗体(父窗体和子窗体),然后生成一个Forms的程序集
主要看下面的PurviewModule,然后创建实例,实例创建后你想怎么操作都行了

//我下面的sdo就是一个DataRow,绑定TreeView的时候把DataRow给了Node.Tag
PurviewModule pmode = new PurviewModule();
pmode.FormName = sdo.Field<String>("FormName");//窗体名称
pmode.Procedures = sdo.Field<String>("Procedures");//这个读出来的都是Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Type type = pmode.ModuleType;//得到了当前双击窗体的类型
你的窗体类型 form = Activator.CreateInstance(type) as 你的窗体类型;//这样子实例化了你想怎么操作都行

public class PurviewModule
{
public String FormName = String.Empty;//你程序集里窗体的名称
public String Procedures = String.Empty;//你上面的这个Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089东西,我这两个都是存在数据库的,然后构造成tree,再打开
Type moduleType;

public Type ModuleType
{
get
{

if (moduleType == null)
{
try
{
moduleType = Assembly.GetType(FormName, false, true);
if (moduleType == null)
{
Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly var in ass)
{
moduleType = var.GetType(FormName, false);
if (moduleType != null)
break;
}
}
}
catch
{
}
}
return moduleType;
}
set { moduleType = value; }
}

Assembly assembly;
public Assembly Assembly
{
get
{

if (assembly == null)
{
try
{
assembly = AppDomain.CurrentDomain.Load(Procedures);
}
catch
{

}
}
return assembly;
}
set { assembly = value; }
}
}
fiveandfive 2009-04-02
  • 打赏
  • 举报
回复
为什么要跨AppDomain?
jietuan 2009-03-24
  • 打赏
  • 举报
回复
System.Windows.Forms.Form 怎么能序列化,它包含了很多可视化的东西;跨Appdomian访问,用web service,.net remoting 或者是WCF。
cppfaq 2009-03-24
  • 打赏
  • 举报
回复
UP
wuyq11 2009-03-22
  • 打赏
  • 举报
回复

111,126

社区成员

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

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

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