AppDomain.DoCallBack требует ReflectionPermission? - PullRequest
1 голос
/ 21 января 2012

У меня есть этот класс, экземпляр которого я создаю в AppDomain без разрешений, но SecurityPermissionFlag.Execute :

class IsolationEntryPoint : MarshalByRefObject
{
    // main is the original AppDomain with all the permissions
    public void Enter(AppDomain main)
    {
        // these work correctly
        Console.WriteLine("Currently in: " + AppDomain.CurrentDomain.FriendlyName);
        Console.WriteLine("Host: " + main.FriendlyName);

        // the exception is thrown here
        main.DoCallBack(this.MyCallBack);
    }

    public void MyCallBack()
    {
        Console.WriteLine("Currently in: " + AppDomain.CurrentDomain.FriendlyName);
    }
}

Странно то, что я получаю SecurityException в строке DoCallback, говоря:

Запрос разрешения типа 'System.Security.Permissions.ReflectionPermission, mscorlib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089 ' не удалось.

MSDNsays это о требованиях к разрешениям AppDomain.DoCallBack:

ReflectionPermission при вызове с поздним связыванием через такие механизмы как Type.InvokeMember.

В вызове не используется ничего типа Type.InvokeMember , почему я получаю исключение?

EDIT

Для ясности, вот код, который я использую для создания домена приложения с объектом изоляции:

    [STAThread]
    static void Main(string[] args)
    {

        var setup = new AppDomainSetup();
        setup.ApplicationBase = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);

        var evidence = new Evidence();

        var permissions = new PermissionSet(PermissionState.None);
        permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

        var domain = AppDomain.CreateDomain(
            "isolationDomain",
            evidence,
            setup,
            permissions);

        var handle = Activator.CreateInstanceFrom(
            domain, typeof(IsolationEntryPoint).Assembly.ManifestModule.FullyQualifiedName,
            typeof(IsolationEntryPoint).FullName);

        var instance = (IsolationEntryPoint)handle.Unwrap();

        instance.Enter(AppDomain.CurrentDomain);
    }

Эти две части кода являются моим полным приложением, больше ничего нет (поэтому исключение должно быть легко воспроизвести).

Спасибо за вашу помощь

Ответы [ 2 ]

3 голосов
/ 25 января 2012

Решение на самом деле довольно простое: вы пропустили добавление public модификатора доступа к class IsolationEntryPoint, т.е. после изменения сигнатуры класса, как, например, ваш пример работает просто отлично:

public class IsolationEntryPoint : MarshalByRefObject
{
    // [...]
}
0 голосов
/ 21 января 2012

Я попробовал ниже, и это похоже на работу.

class Program
{

    static void Main(string[] args)
    {
        SecurityPermission t = new SecurityPermission(SecurityPermissionFlag.Execution);
        t.Demand();
        IsolationEntryPoint x = new IsolationEntryPoint();
        x.Enter(AppDomain.CurrentDomain);
    }
}


class IsolationEntryPoint : MarshalByRefObject
{
    // main is the original AppDomain with all the permissions 
    public void Enter(AppDomain main)
    {
        // these work correctly 
        Console.WriteLine("Currently in: " + AppDomain.CurrentDomain.FriendlyName);
        Console.WriteLine("Host: " + main.FriendlyName);

        // the exception is thrown here 
        main.DoCallBack(this.MyCallBack);
    }

    public void MyCallBack()
    {
        Console.WriteLine("Currently in: " + AppDomain.CurrentDomain.FriendlyName);
    }
}
...