Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > AppDomain и StrongName[]


Автор: vecT 21.1.2011, 15:26
Есть статический метод AppDomain.CreateDomain( string friendlyName,
                        Evidence securityInfo,
                        AppDomainSetup info,
                        PermissionSet grantSet,
                        params StrongName[] fullTrustAssemblies);
По мсдн-у последний аргумент содержит список строгих имен сборок для которых будет использован режим полного доверия, то есть, по логике, ограничения накладываемые grantSet должны игнорироваться. Однако у меня так и не получилось заставить работать сборку в таком режиме.
Следующий код (Консольное приложение имеющее строгое имя):
Код

using System;
using System.Security;
using System.Security.Policy;
using System.IO;
using System.Reflection;
using System.Runtime.Remoting;

[assembly: SecurityRules(SecurityRuleSet.Level2)]
namespace SimpleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Создание домена
            AppDomainSetup info = new AppDomainSetup();
            info.ApplicationBase = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            StrongName sName_Main = Assembly.GetExecutingAssembly().Evidence.GetHostEvidence<StrongName>();
            AppDomain domain = AppDomain.CreateDomain("sundboxedWithFT", null, info, GetPermissionSet(), new StrongName[] { sName_Main});
            //Создание экземпляра объекта в изолированном домене
            Type t = typeof(FileWriter);
            ObjectHandle handle = Activator.CreateInstanceFrom(domain, t.Assembly.ManifestModule.FullyQualifiedName, t.FullName);
            FileWriter infos = (FileWriter)handle.Unwrap();
            //Выполнение небезопасного кода, вызывающего исключение
            infos.WriteInfo();
        }


        public static PermissionSet GetPermissionSet()
        {
            Evidence ev = new Evidence();
            ev.AddHostEvidence(new Zone(SecurityZone.Internet));
            return SecurityManager.GetStandardSandbox(ev);
        }
    }

    class FileWriter:MarshalByRefObject
    {
        public void WriteInfo()
        {
            using (System.IO.FileStream fstr = new System.IO.FileStream(@"test.txt", System.IO.FileMode.OpenOrCreate))
            {
                fstr.Write(System.Text.Encoding.Default.GetBytes("\nhello from app"), 0, 15);
                fstr.Flush();
                fstr.Close();
            }
        }
    }
}


Вызывает SecurityException. :( 
Что я упустил?

Автор: vecT 24.1.2011, 12:19
Ну, в общем, я уже и сам разобрался.  PermissionSet -ы применяются ко всем загруженым в домен сборкам независимо от того, входят ли они в   fullTrustAssemblies или нет. Сам же список StronName[] определяет сборки имеющие доступ к SecurityCritical - коду.  Вопрос можно считать закрытым.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)