消息泵和AppDomains我有一个C#(FFx3.5)应用程序,它加载一个DLL作为插件。这些插件加载在单独的AppDomain中(由于多种原因无法更改此架构)。都很好。我现在需要显示其中一个插件的对话框。请记住,我不能将对话框窗体返回到主应用程序并在那里显示它(当前的基础结构不支持它)。失败1在我的DLL中,我创建了一个窗体并将其命名为Show。显示对话框轮廓但未绘制,它不响应鼠标事件。我假设这是因为DLL位于单独的AppDomain中,并且应用程序的消息泵以某种方式无法将消息发送到新表单。失败2在我的DLL中,我创建了一个Form并调用了ShowDialog,所有权利都应该为对话框创建一个内部消息泵。该对话框出现并响应点击(万岁),但似乎主应用程序不再处理或发送Windows消息,因为它退出绘画并且不再响应鼠标事件。出于某种原因,现在似乎没有安排主应用程序的消息泵。失败3在我的DLL中,我创建了一个窗体并调用了Application.Run。这肯定会创建一个完整的第二个消息泵。我得到与失败2相同的行为-对话行为,但调用应用程序却没有。关于这里到底发生了什么的任何想法,以及我如何显示来自其他AppDomain的DLL的对话框并让调用者和被调用者仍然响应并正确绘制?尝试使用appdomain1主窗体的BeginInvoke和显示appdomain2窗体的委托。所以在伪代码中:Appdomain1:AppDomain2.DoSomething(myMainForm);AppDomain2:DoSomething(Formparent){FormfoolishForm=newForm();parent.BeginInvoke(newAction(delegate{foolishForm.Show();}));代码可能并不完美,但它证明了这个概念。顺便说一句,如果您在远程传递表时遇到问题,您可以:publicclassContainer:MarshalByRefObject{privateT_value;公共T值{获取{返回值;}设置{_value=值;}}publicContainer(){}publicContainer(Tvalue){Value=value;}publicstaticimplicitoperatorT(Containercontainer){returncontainer.Value;}}这将包含您抛出的对象。我们有一个非常相似的架构应用程序,它加载DLL文件和插件。每个DLL文件都加载到一个单独的应用程序域中,该域是在一个单独的线程上创建的。我们有一个第三方控件,除非我们定期调用System.Windows.Forms.Application.DoEvents(),否则它不会出现。伪代码:这解决了我们所有的GUI问题。我以前用过的一件事是实现DomainManager。可以自定义各种应用程序域安全/绑定/上下文来处理复杂或鸡蛋类型的问题,以便在您想要的地方提取数据;)我通常使用native.exe执行此操作,它通过COM接口(伪代码,但正确的顺序和方法名称;):CorBindToRuntimeEx()SetHostControl()GetCLRControl()SetAppDomainManagerType("yourdomainmanger","info")//在启动运行时之前设置域管理器Start()HostControl--GetDomainManagerForDefaultDomain()DomainManager--Run()你的域管理器可以是任何CLR类库,所以它们不是更原生的C。旁注,如果你在WPF中;我真的很喜欢使用“Microsoft.DwayneNeed.Controls”方法。您可以使用自己的Dispatcher泵来分隔同一UI控件中的线程(无需求助于全新的Window())。使用这种方法的独特之处在于,即使主UI线程被阻塞/忙碌(一些繁重的操作、扫描文件系统等),这些其他线程也可以毫无问题地绘制/更新它们的UIElement。以上就是C#学习教程:MessagePump和AppDomains分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
