Может ли сборка быть выполнена или загружена в C # .NET COM компонент? - PullRequest
0 голосов
/ 07 декабря 2009

У меня есть COM (написанный на .NET), который должен создать AppDomain и загрузить / выполнить сборки .NET в нем. Так что я мог выгрузить этот appDomain позже вместе со всеми загруженными DLL. Работая нормально в нормальном (например, WinForms) приложении .NET, я получаю исключения безопасности, если этот код запускается из контекста COM. Предполагая, что сборка COM строго названа и помещена в GAC, она имеет политику полного доверия. Кто-нибудь может объяснить, если это возможно, а если нет - почему?

1 Ответ

0 голосов
/ 08 декабря 2009

Да, может. Чтобы CAS позволил вам сделать это, вы должны включить

[assembly: System.Security.AllowPartiallyTrustedCallersAttribute()]

атрибут в сборке COM и загруженных сборках. Кроме того, создание объектов и выполнение сборок потребует добавления правильного набора разрешений в новый домен приложения, например:

 AppDomainSetup setup = new AppDomainSetup();
 setup.ApplicationBase = Path.GetDirectoryName(path); 
 PermissionSet trustPermissionSet = new PermissionSet(PermissionState.Unrestricted);
 AppDomain newDomain = AppDomain.CreateDomain( "descriptive name", null, setup, trustPermissionSet);

Тогда вы можете просто создать объект через CreateInstanceFromAndUnwrap() или executeAssembly. Существует также способ обойти эту проблему - использовать Activator:

System.Runtime.Remoting.ObjectHandle objHandle = Activator.CreateInstanceFrom(_pluginStore[path], path, pluginClass);

if (objHandle != null)
{
    object unwrappedInstance = objHandle.Unwrap();
    result.Add(unwrappedInstance);
}

но после его выполнения код не имеет права делать какие-либо "сложные вещи".

Вы можете узнать больше здесь .

...