2009-10-15 4 views
3

Я участвую в проекте, который способен подключаться к различным аппаратным устройствам «на лету». Нам назначили графический интерфейс с сенсорным экраном, поэтому у нас есть MMI для устройств.Дизайн плагина WPF GUI. Мне нужна обратная связь lil

Поскольку любое устройство (и любое устройство) потенциально может подключаться к нашей инфраструктуре, мы решили позволить сторонним разработчикам устройств создать свой собственный графический плагин. Все хорошо и денди до сих пор :)

Настоящая проблема заключается в том, что наш менеджер хочет, чтобы эти графические интерфейсы могли выполнять некоторые формы потоков управления, и он не хочет, чтобы у нас была собственная DSL. Итак, поскольку мы «Выполняя GUI в WPF, они должны иметь возможность выполнять MSIL. Это огромная угроза безопасности, и я сказал ему об этом, но, поскольку это прототип, он говорит, что все в порядке. Хорошо, хорошо.
Существует еще одна проблема: произвольная MSIL может произойти сбой или тупик, поэтому нам нужно разместить ее в каком-то асинхронном контексте. Поскольку WPF не разрешает доступ к графическому интерфейсу более чем одному потоку, мы сталкиваемся с сложным сценарием.

До сих пор я довольно кратко разбирался в том, как решить эту проблему. Лучше всего разделить часть GUI и часть кода на 2 вещи: Raw Xaml для графического интерфейса, а MSIL - в другом потоке кода. Затем мне нужно создать фасад (On runtime?), Чтобы связать GUI и MSIL вместе, отправив вызовы на потоки друг друга.
Я могу сделать это, не проблема, но я думаю, что это действительно вонючий. Вы заставляете других разработчиков использовать MVVM без кода позади, я не уверен, могу ли я поддерживать все привязки, и мне не нравится, что View и ViewModel находятся в отдельных потоках (ну, я не против, но я не уверен, что это может вызвать проблемы, так как этот дизайн будет очень прозрачным для разработчика плагинов, поэтому он не стал бы рассматривать создание потоковых файлов).

Есть ли у кого-нибудь идеи о том, как это сделать? Или мысли о требованиях? Любая обратная связь будет приятной.

ответ

0

Я попробую дать вам другой ответ. К сожалению, я не думаю, что у вас будет простое время. Это звучит интересно, хотя :)

  • Принимайте свои плагины в отдельных приложениях, используя какой-либо стартовый код приложения, которым вы управляете.
  • Используйте этот механизм, чтобы настроить защиту так, как вам нужно (запретить доступ к файловой системе, интернету и т. Д.)
  • Используйте WCF с двоичным режимом локального компьютера для связи. Вы все равно должны были предоставить какой-то API, поэтому это, вероятно, не добавит слишком много накладных расходов от того, что вы сделали бы.
  • Размещение плагинов в окне без рамки и размещение его вручную в главном окне приложения. (Раньше я работал над проектом, где мы делали это с помощью нескольких приложений Office. Он может работать замечательно). Вероятно, вы потратите больше времени на это. Какой-то маленький хакер будет похож на героя! :)
  • У некоторых совместное использование ресурсов на уровне DLL (UI скининга, выглядеть и чувствовать себя, общие элементы управления, а что-нет)
+0

Спасибо, что вложили в это свой ум. У меня были длительные дискуссии с моим другом, и я нашел много параллелей между этой проблемой и проблемой, которую O/S'es имеют при запуске кода. Если мы не умнее Microsoft, Apple или всего сообщества Nix, для этого нет никакого решения. Даже не причина запускать все в асинхронном контексте :) Лучшая ставка - проверить, протестировать и подписать плагины, прежде чем они загрузятся в графический интерфейс. Ну, это наш вывод :) Я приму этот ответ, поскольку он обеспечил лучшую обратную связь :) – cwap

0

Здесь может быть дорога среднего размера - ваш босс не хочет, чтобы вы создали свой собственный DSL, но как насчет существующего динамического языка, такого как IronPython/IronRuby?

Не уверен, что это даст вам гибкость, которую вы ищете, но стоит посмотреть. Я согласен с тем, что использование MSIL для инъекций является взломанным. Я не уверен, что разделение ваших Views и ViewModels на отдельные потоки будет работать вообще, не говоря уже о чистой работе.

+0

уже предположил, что, но, очевидно, что не это не годен: S – cwap

+0

.. и да, я не уверен, смогу ли я заставить его полностью работать с разделом. Я чувствую, что я в тупике здесь :( – cwap

1

Если вы хотите сделать это «правильно»; Посмотрите на размещение плагинов в отдельных доменах приложений. Установите уровни безопасности в этих доменах приложений из приложения-хостинга и общайтесь с четко определенными каналами.

Если вы хотите это сделать; Используйте MEF. Ничто не сравнится с этим шаблоном для архитектуры плагина.

Надеюсь, это помогло и удачи!

+0

Спасибо за вход :) Уже используя MEF, это потрясающе! Но реальная проблема заключается в том, что WPF не разрешает другим потокам, чем диспетчер-владелец, обращаться к графическому интерфейсу, поэтому связь должна быть каким-то образом перекрыта. – cwap

+0

Это отстой. Я чувствую вашу боль –

Смежные вопросы