.NET добавила «Managed Addin Framework», которая может соответствовать всем требованиям. Он имеет следующие особенности:
- Изоляция . Плагины запускаются в собственном AppDomain , если необходимо, или даже в собственном процессе , если вам нужен такой уровень изоляции.
- Договорная связь . Вы устанавливаете контракты, и это единственное, что вы распространяете среди авторов плагинов. Им не нужно знать ни о каком другом аспекте вашего заявления.
- Discovery . Имеет встроенный механизм для извлечения плагинов из папки, полной сборок.
- Безопасность . Наборы CASPOL автоматически применяются при загрузке плагина. Есть несколько опций, встроенных для упрощения этого (см. AddInSecurityLevel Enum ).
Большинство подходов к изоляции также ограничивают взаимодействие и интеграцию пользовательского интерфейса. MAF пытается обойти эти ограничения. Это требует, чтобы вы установили договорные коммуникационные конвейеры, но выполнили бы большую часть работы, которую вы обычно должны были бы делать самостоятельно.
Примером может быть соединение частей пользовательского интерфейса, работающих в двух отдельных процессах (это волшебство), или возможность вызывать события в AppDomain или процессе. Эти вещи нетривиальны, но MAF очень помогает в этом отношении.
Пример
Вот простой пример. Как автор "Shell", вы будете заключать контракт с авторами ваших плагинов. Вот типичный контракт (это просто абстрактный класс):
public abstract class Calculator
{
public abstract double Add(double a, double b);
public abstract double Subtract(double a, double b);
public abstract double Multiply(double a, double b);
public abstract double Divide(double a, double b);
}
Если автор плагина хочет написать плагин, он просто подклассирует этот контракт и добавляет атрибут «Addin»:
[AddIn("Sample Calculator AddIn", Version="1.0.0.0")]
public class SampleCalculatorAddIn : Calculator
{
public override double Add(double a, double b)
{
return a + b;
}
public override double Subtract(double a, double b)
{
return a-b;
}
public override double Multiply(double a, double b)
{
return a * b;
}
public override double Divide(double a, double b)
{
return a / b;
}
}
А вот как вы можете загрузить эти надстройки и взаимодействовать с ними:
// In this sample we expect the AddIns and components to
// be installed in the current directory
String addInRoot = Environment.CurrentDirectory;
// Check to see if new AddIns have been installed
AddInStore.Rebuild(addInRoot);
// Look for Calculator AddIns in our root directory and
// store the results
Collection<AddInToken> tokens =
AddInStore.FindAddIns(typeof(Calculator), addInRoot);
// Ask the user which AddIn they would like to use
AddInToken calcToken = ChooseCalculator(tokens);
// Activate the selected AddInToken in a new AppDomain set sandboxed
// in the internet zone. You can find out what this gives access
// to by running "mscorcfg.msc", but essentially this will limit
// any access to the filesystem and other obvious OS services.
// Use of reflection is also very limited in this zone.
Calculator calculator =
calcToken.Activate<Calculator>(AddInSecurityLevel.Internet);
// Run the read-eval-print loop
RunCalculator(calculator);
Это в значительной степени суть. Это, очевидно, нечто большее, чем это, но вы поняли.
Дальнейшее чтение
Хорошая вступительная статья
https://web -beta.archive.org / веб / 20140820145919 / http://msdn.microsoft.com/en-us/magazine/cc163476.aspx
Обзор MSDN
http://msdn.microsoft.com/en-us/library/bb384200.aspx
System.Addin на Codeplex (много образцов)
http://www.codeplex.com/clraddins
Инструменты
Pipeline Builder (помогает создать коммуникационный конвейер между оболочкой и надстройками)
http://clraddins.codeplex.com/wikipage?title=Pipeline%20Builder&referringTitle=Home
Правила Fx-Cop для System.Addin
http://clraddins.codeplex.com/wikipage?title=Add-in%20FxCop%20Rules&referringTitle=Home