从激活的程序集(插件)加载时,System.Windows.Forms.Timer对象不会勾选

时间:2011-01-25 21:17:20

标签: c# winforms reflection plugins

我目前正在开发一个项目,它将程序集(插件)加载到主AppDomain空间(通过Reflection的Assembly.LoadFile()和Activator类)。作为带有插件的API的一部分,托管应用程序可以请求Control派生对象显示在主机的表单上。

基本上:“托管应用程序”是一个WinForms应用程序,可以加载包含控件的程序集。托管应用程序加载程序集(通过Assembly.LoadFile()),然后从每个程序集请求控件。然后在窗体上呈现控件(添加到容器中)。

一切似乎与控件一起工作正常(按钮,标签,图像等)并且它是交互式的。但是,如果在表单中使用了Timer(WinForms组件 - 非System.Threading.Timer) - 它不会勾选。如果控件直接在主机中使用(当作为依赖项引用时),则计时器将按预期打开。

是否有人意识到如果从程序集加载,WinForms Timer无法正确挂钩消息泵?

1 个答案:

答案 0 :(得分:1)

目前尚不清楚“AppDomain空间”可能意味着什么。猜测:这是一个很好的blog post,它描述了在辅助AppDomain中加载控件的危险。关键部分是这一部分,然后是如何使其工作的建议:

  

Windows窗体仅支持隔离   通过应用领域的顶级窗口。它   不支持亲子   跨领域的关系。许多   人们已经认为是因为   控制最终源于   MarshalByRefObject它可以   成功远程;这不是   真正。控件上的某些接口   可以跨域远程,但是   控件的API本身不支持   远程处理。当你看到异常   声明对象不能   远程,因为它不可序列化,   你所看到的是有人有   试图将远程代理转换为   控制。