WPF GUI插件设计。我需要一个小的反馈

时间:2009-10-15 18:05:18

标签: .net wpf plugins

我参与了一个能够动态连接到不同硬件设备的项目。我们已被分配制作触摸屏GUI,因此我们为设备提供了MMI。

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

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

到目前为止,我对如何解决这个问题的想法很缺乏。我最好的办法是将GUI部分和代码部分分成两部分:GUI的Raw Xaml和代码的另一个线程中托管的MSIL。然后我需要创建一个Facade(在运行时?),通过向每个其他线程发送调用来将GUI和MSIL链接在一起。
我能做到这一点,不是问题,但我认为这真的很臭。你迫使其他开发人员在没有代码的情况下使用MVVM,我不确定我是否可以支持所有绑定,而且我不喜欢View和ViewModel处于单独的线程中(好吧,我不介意,但我不确定它是否会引起问题,因为这个设计对插件开发者来说非常透明,所以他不会考虑让线程安全。)

有没有人对如何设计这个有任何想法?还是对要求的想法?任何形式的反馈都会很好。

3 个答案:

答案 0 :(得分:1)

如果你想做'对';看看在不同的应用程序域中托管插件。从托管应用程序设置这些应用程序域的安全级别,并与明确定义的渠道进行通信。

如果你想完成它;使用MEF。没有什么比插件架构的模式好了。

希望这有帮助并祝你好运!

答案 1 :(得分:0)

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

不确定这是否会为您提供所需的灵活性,但值得研究。我同意允许注入MSIL是hacky。我不确定将你的Views和ViewModels分成单独的线程是否会起作用,更不用说干净利落的工作了。

答案 2 :(得分:0)

我会尝试给你一个不同的答案。不幸的是,我不认为你会有一个轻松的时间。虽然听起来很有意思:))

  • 使用您控制的某种应用启动代码将您的插件托管在不同的应用程序中。
  • 使用此机制以您希望的方式设置安全性(禁止访问文件系统,互联网等)
  • 使用WCF与本地计算机二进制模式进行通信。你打算提供某种API,所以这可能不会增加太多的开销。
  • 将插件托管在没有边框的窗口中,并将其手动放置在主应用程序窗口上。 (我曾经在一个项目上工作,我们用一些Office应用程序来完成这项工作。它可以非常好地工作)你可能会花最多的时间来做这件事。虽然有些小黑客会觉得自己像个英雄! :)
  • 在DLL级别上进行一些资源共享(UI皮肤,外观,常用控件以及什么不是)