Я ищу простой и безопасный способ доступа к плагинам из приложения .NET. Хотя я считаю, что это очень распространенное требование, я изо всех сил стараюсь найти все, что соответствует всем моим потребностям:
- Хост-приложение будет обнаруживать и загружать свои сборки плагинов во время выполнения
- Плагины будут созданы неизвестными третьими сторонами, поэтому они должны быть изолированы, чтобы предотвратить их выполнение вредоносного кода.
- Общая сборка interop будет содержать типы, на которые ссылаются как хост, так и его плагины
- Каждая сборка плагинов будет содержать один или несколько классов, которые реализуют общий интерфейс плагина
- При инициализации экземпляра плагина хост передаст ему ссылку на себя в виде интерфейса хоста
- Хост будет вызывать плагин через свой общий интерфейс, и плагины могут также вызвать хост
- Хост и плагины будут обмениваться данными в форме типов, определенных в сборке interop (включая общие типы)
Я изучил как MEF, так и MAF, но я изо всех сил пытаюсь понять, как можно сделать любой из них, чтобы соответствовать счету.
Предполагая, что мое понимание верное, MAF не может поддерживать передачу общих типов через границу изоляции, что очень важно для моего приложения. (MAF также очень сложно реализовать, но я был бы готов работать с этим, если бы мог решить проблему типового типа).
MEF - почти идеальное решение, но, похоже, не соответствует требованиям безопасности, поскольку он загружает свои сборки расширения в том же AppDomain, что и хост, и, таким образом, по-видимому, предотвращает песочницу.
Я видел этот вопрос, в котором говорится о запуске MEF в изолированном режиме, но не описывается как. В этом сообщении указано, что "при использовании MEF вы должны доверять расширениям, чтобы не запускать вредоносный код, или предлагать защиту через защиту кода доступа", он не описывает, как это сделать. Наконец, есть этот пост, в котором описывается, как предотвратить загрузку неизвестных плагинов, но это не подходит для моей ситуации, так как даже законный плагины будут неизвестны.
Мне удалось применить атрибуты безопасности .NET 4.0 к моим сборкам, и они правильно соблюдаются MEF, но я не вижу, как это помогает мне блокировать злоумышленный код, так как многие из методов структуры, которые могут быть угроза безопасности (например, методы System.IO.File
) отмечены как SecuritySafeCritical
, что означает, что они доступны из SecurityTransparent
сборок. Я что-то упустил? Есть ли какой-нибудь дополнительный шаг, который я могу предпринять, чтобы сказать MEF, что он должен предоставлять интернет-привилегии для сборки плагинов?
Наконец, я также рассмотрел создание моей собственной простой изолированной архитектуры плагинов, используя отдельный AppDomain, как описано здесь. Однако, насколько я вижу, этот метод позволяет мне использовать последнее связывание для вызова статических методов на классах в ненадежной сборке. Когда я пытаюсь расширить этот подход, чтобы создать экземпляр одного из моих классов плагинов, возвращаемый экземпляр не может быть перенесен в общий интерфейс плагина, а это означает, что приложение-хост не может вызвать его. Есть ли какой-то метод, который я могу использовать для получения строго прокси-доступа через границу AppDomain?
Извиняюсь за длину этого вопроса; причина заключалась в том, чтобы показать все пути, которые я уже исследовал, в надежде, что кто-то может предложить что-то новое, чтобы попробовать.
Большое спасибо за ваши идеи, Тим