.net WPF GUI插件设计。我需要一个lil';反馈

.net WPF GUI插件设计。我需要一个lil';反馈,.net,wpf,plugins,.net,Wpf,Plugins,我参与了一个项目,可以在运行中连接到不同的硬件设备。我们被指派制作一个触摸屏GUI,这样我们就有了设备的MMI 由于任何设备(以及任何类型的设备)都有可能连接到我们的框架,我们决定让第三方设备开发人员制作他们自己的GUI插件。到目前为止一切都很好:) 真正的问题是,我们的经理希望这些GUI能够执行某些形式的控制流,他不希望我们拥有自己的DSL——因此,当我们在WPF中执行GUI时,他们必须能够执行MSIL。这是一个巨大的安全威胁,我告诉过他,但作为一个原型,他说没关系。好吧,很好。 不过还有另一

我参与了一个项目,可以在运行中连接到不同的硬件设备。我们被指派制作一个触摸屏GUI,这样我们就有了设备的MMI

由于任何设备(以及任何类型的设备)都有可能连接到我们的框架,我们决定让第三方设备开发人员制作他们自己的GUI插件。到目前为止一切都很好:)

真正的问题是,我们的经理希望这些GUI能够执行某些形式的控制流,他不希望我们拥有自己的DSL——因此,当我们在WPF中执行GUI时,他们必须能够执行MSIL。这是一个巨大的安全威胁,我告诉过他,但作为一个原型,他说没关系。好吧,很好。
不过还有另一个问题-任意MSIL可能会崩溃或死锁,所以我们需要在某种异步上下文中托管它。由于WPF不允许多个线程访问GUI,因此我们将自己置于一个复杂的场景中

到目前为止,我对如何解决这个问题的想法还很缺乏。我的最佳选择是将GUI部分和代码部分分成两部分:GUI的原始Xaml,代码的MSIL托管在另一个线程中。然后,我需要创建一个facade(在运行时?),通过向其他线程发送调用将GUI和MSIL链接在一起。
我可以这样做,没问题,但我觉得它真的很臭。你强迫其他开发人员使用MVVM而不使用代码隐藏,我不确定我是否能支持所有绑定,我不喜欢视图和视图模型处于不同的线程中(嗯,我不介意,但我不确定它是否会引起问题,因为这个设计对插件开发人员来说是非常透明的,所以他不会考虑让数据变得安全)。
有人对如何设计它有什么想法吗?或者对需求有什么想法吗?任何形式的反馈都很好。

这里可能有一条中间道路-你的老板不希望你创建自己的DSL,但是像IronPython/IronRuby这样的现有动态语言怎么样


我不确定这是否会给你带来你想要的灵活性,但这是值得研究的。我同意允许MSIL被注入是有问题的。我不确定将你的视图和视图模型分离到单独的线程中是否会起作用,更不用说干净的工作了。

如果你想“正确”地做这件事,可以考虑在中托管插件单独的应用程序域。在托管应用程序的这些应用程序域上设置安全级别,并与定义良好的通道通信

如果你想完成它,使用插件架构,没有什么能比得上这种模式


希望这会有帮助,祝你好运!

我会尝试给你一个不同的答案。不幸的是,我认为你不会很轻松。不过听起来确实很有趣:)

  • 通过使用某种由您控制的应用程序启动代码,将插件托管在不同的应用程序中
  • 使用此机制以您想要的方式设置安全性(不允许访问文件系统、internet等)
  • 使用WCF和本地计算机二进制模式进行通信。无论如何,您都将提供某种API,因此这可能不会增加太多的开销
  • 将插件托管在没有边框的窗口中,并手动将其放置在主应用程序窗口上。(我曾经参与过一个项目,我们使用一些Office应用程序来实现这一点。它可以非常好地工作)您可能会花费最多的时间来实现这一点。不过,一些小黑客会觉得自己像个英雄!:)
  • 在DLL级别进行一些资源共享(UI蒙皮、外观、常用控件等等)

已经提出了这一建议,但显然这是一个禁忌:s。。是的,我不确定我是否能让它完全和分离一起工作。我觉得我在这里走到了死胡同:(谢谢你的意见:)已经在使用MEF了,太棒了!但真正的问题是WPF不允许所有者调度程序以外的其他线程访问GUI,因此需要以某种方式桥接通信。感谢您的关注。我与我的一位朋友进行了一些长时间的讨论,发现这个问题与O/S在运行代码时遇到的问题有很多相似之处。除非我们比微软、苹果或整个*Nix社区更聪明,否则没有解决方案。甚至没有理由在异步上下文中运行所有东西:)最好的办法是在插件加载到GUI之前验证、测试和签名插件。好吧,这就是我们的结论:)我会接受这个答案,因为它提供了最好的反馈:)