2012-05-10 2 views
0

Я хочу создать систему WPF, которая может включать addin, разработанную внешним сообществом разработчиков. Поскольку я не могу ручаться за тех разработчиков, я хочу, чтобы их код работал в безопасной среде. Кажется, что MAF - хорошее решение, поэтому я решил исследовать безопасность MAF. Можно определить точное разрешение для каждого аддона, что очень приятно.Безопасность и дополнения MAF

Однако я хочу, чтобы AddOns могли возвращать элементы управления WPF. Для этого им необходимо иметь возможность запускать сборки WPF. Кроме того, я не хочу, чтобы аддоны могли запускать неуправляемый код, чтобы они не могли переопределить разрешения безопасности, которые я установил при загрузке аддона.

Так вот проблема: если я загружаю аддон без разрешения запуска неуправляемого кода, то аддон не сможет создавать элементы управления WPF. Как я могу решить эту проблему?

Чтобы проверить этот вопрос немного больше, я написал небольшое приложение WPF и попытался загрузить его и запустить его из второго приложения. Bellow - это код, который загружает и запускает приложение WPF. Он отлично работает, если есть, но если я удалю последний оператор AddPermission (тот, который имеет флаг UnmanageCode), то он перестает работать, заявив, что он не может создать окно приложения WPF.

PermissionSet set = new PermissionSet(PermissionState.None); 
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, PATH)); 
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 
set.AddPermission(new UIPermission(PermissionState.Unrestricted)); 
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)); 

Evidence ev = new Evidence(); 
AppDomain domain = AppDomain.CreateDomain("Test", ev, new AppDomainSetup() { ApplicationBase = PATH }, set); 
domain.ExecuteAssembly(PATH); 

ответ

0

Вы посмотрите на this перегрузки метода CreateDomain? Вы можете установить некоторые assebmlies, которые будут считаться полным доверием.

Если вы посмотрите на исходном коде System.AddIn (найдено here), вы увидите, что в AddInActivator.cs файлов они создают экземпляр StrongName с помощью StrongNamePublicKeyBlob, что они взяли из AssemblyName, взятых из системы. AddIn.

Так что, возможно, вы могли бы сделать то же самое с PresentationCore и System.Windows.Presentation или любой другой сборкой, которой вы хотите предоставить полное доверие.

Например, вы могли бы попробовать это (взято почти дословно из AddInActivator.cs):

//assembly is the Assembly object you want to grant full trust permissions. 
AssemblyName assemblyName = assembly.GetName(); 

// get the public key blob 
byte[] publicKey = assemblyName.GetPublicKey(); 
if (publicKey == null || publicKey.Length == 0) 
    throw new InvalidOperationException(Res.NoStrongName); 

StrongNamePublicKeyBlob keyBlob = new StrongNamePublicKeyBlob(publicKey); 

// and create the StrongName 
StrongName strongName = new StrongName(keyBlob, assemblyName.Name, assemblyName.Version); 
// then call the overload of CreatDomain that takes a StrongName object parametes. 
0

Он работал для меня, я думаю, что проблема в том, как активировать плагин. Старайтесь не создавать AppDomain самостоятельно. Ваш код должен выглядеть так:

PermissionSet set = new PermissionSet(PermissionState.None); 
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, PATH)); 
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 
set.AddPermission(new UIPermission(PermissionState.Unrestricted)); 

// .. retreive the addin token 
var plugin = token.Activate<IMyPluginInterface>(set); 

Это работало для меня, когда я использовал этот плагин таким образом. Это был также интерфейс wpf.

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