我目前正在开发一个项目,它将程序集(插件)加载到主AppDomain空间(通过Reflection的Assembly.LoadFile()和Activator类)。作为带有插件的API的一部分,托管应用程序可以请求Control派生对象显示在主机的表单上。
基本上:“托管应用程序”是一个WinForms应用程序,可以加载包含控件的程序集。托管应用程序加载程序集(通过Assembly.LoadFile()),然后从每个程序集请求控件。然后在窗体上呈现控件(添加到容器中)。
一切似乎与控件一起工作正常(按钮,标签,图像等)并且它是交互式的。但是,如果在表单中使用了Timer(WinForms组件 - 非System.Threading.Timer) - 它不会勾选。如果控件直接在主机中使用(当作为依赖项引用时),则计时器将按预期打开。
是否有人意识到如果从程序集加载,WinForms Timer无法正确挂钩消息泵?
答案 0 :(得分:1)
目前尚不清楚“AppDomain空间”可能意味着什么。猜测:这是一个很好的blog post,它描述了在辅助AppDomain中加载控件的危险。关键部分是这一部分,然后是如何使其工作的建议:
Windows窗体仅支持隔离 通过应用领域的顶级窗口。它 不支持亲子 跨领域的关系。许多 人们已经认为是因为 控制最终源于 MarshalByRefObject它可以 成功远程;这不是 真正。控件上的某些接口 可以跨域远程,但是 控件的API本身不支持 远程处理。当你看到异常 声明对象不能 远程,因为它不可序列化, 你所看到的是有人有 试图将远程代理转换为 控制。