2009-07-13 4 views
1

У меня есть приложение WPF, которое содержит несколько дочерних элементов управления.Создайте WPF-элемент управления, который запускается во внешнем процессе

В одном из этих элементов управления находится сторонняя библиотека, которая под обложками запускает собственный код, который вызывает нарушения доступа и приводит к сбою приложения. К сожалению, удаление библиотеки не является вариантом.

Что бы я хотел сделать, это развернуть новый процесс Windows, разместить внутри него стороннюю библиотеку и как-то обмениваться информацией с ней. Точно так же, как Google Chrome и IE8 обрабатывают плагины браузера.

Проблема в том, что сторонняя библиотека должна рисовать на экране, поэтому я должен каким-то образом иметь эквивалент HTML iframe внутри главного окна приложения WPF.

Я не уверен, как начать работу с этим, пока это сложно сделать Google. Любые советы высоко ценится.

+0

Что вы здесь делали? Очень любопытно об этом. –

+0

Еще ничего не сделали. Не стоит забывать обновлять этот вопрос, когда мы делаем –

ответ

0

Возможно, это не самая простая задача. Рассматривали ли вы размещение своих сторонних материалов в отдельном домене приложений? Таким образом, вы также получите хороший уровень изоляции, сохранив при этом лишний хлопот другого проекта. Нужно ли постоянно обновляться или обновляться в заранее определенных точках вашего приложения? Может быть, какая-то схема, в которой вы в основном делаете скриншот выхода третьей стороны и показываете его как изображение в вашем оригинальном приложении, тогда будет возможно ...

+0

Как я понимаю, отдельный AppDomain по-прежнему живет в одном и том же процессе win32? Мне нужно запустить его в отдельном процессе Windows, потому что стороннее приложение рушится на уровне собственного кода (нарушения доступа к win32 и т. Д.). Когда это произойдет, весь процесс Windows опустится, .NET и все –

+0

AppDomain должен сделать трюк для вас - если один AppDomain опустится, остальные будут в порядке. Подумайте о AppDomain как о «.NET-процессе» (вроде). – Andy

+0

Чтобы это работало, вам нужно привести элемент управления через границу, и элементы управления не расширяют MarshallByRefObject. Так что это не сработает. – Will

3

Это сложный вопрос, но, к счастью, для вас есть небольшая работа. сделанные в этом пространстве в последнее время.

Вы слышали о пространстве имен System.Addin в .NET 3.5? Вероятно, это поможет. Он позволяет загружать элементы управления в отдельный AppDomain, но отображаться в том же интерфейсе. Я бы предположил, что вам нужно будет немного поработать, чтобы все наладилось правильно (никогда не делал этого раньше), но это возможно.

Посмотрите на этом раннем посте от надстроек в команде: http://blogs.msdn.com/clraddins/archive/2007/08/06/appdomain-isolated-wpf-add-ins-jesse-kaplan.aspx

Кажется, что они держат свои образцы и вспомогательный код на CodePlex: http://clraddins.codeplex.com/

Я очень заинтересован в этом, так что если вы получите эту работу, сообщите нам, как это пошло для вас!

+0

Спасибо. Я исследовал System.Addins раньше, и похоже, что он должен работать. Я загружу образец clr-addins и посмотрю. Надеюсь, я смогу выяснить, какую технику они используют, и использовать ее самостоятельно - материал контракта, требуемый System.Addins намного более тяжелый, чем тот, который мне нужен или нужен. –

+0

То, как я его читаю, они делают много, или вы там. Если вам не нужно много, чтобы быть динамичным, взгляните на «генератор трубопровода» ... Надеюсь, это поможет вам начать работу и, возможно, сможет игнорировать многие детали контракта. Там они делают довольно сумасшедшую магию. Я мог читать неправильно, но похоже, что у них есть поддержка из-за процесса ... Который был бы сумасшедшим, трудно реализовать. –