Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AppDomain.docCallback需要ReflectionPermission吗?_C#_.net_Remoting_Appdomain_Isolation - Fatal编程技术网

C# AppDomain.docCallback需要ReflectionPermission吗?

C# AppDomain.docCallback需要ReflectionPermission吗?,c#,.net,remoting,appdomain,isolation,C#,.net,Remoting,Appdomain,Isolation,我有这个类,我在AppDomain中创建了它的实例,没有权限,但是: 奇怪的是,我在DoCallback行中看到SecurityException,它说: 请求类型的权限 'System.Security.Permissions.ReflectionPermission,mscorlib, 版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089' 失败了 MSDN对AppDomain.docCallback的权限要求进行说明: ReflectionPe

我有这个类,我在AppDomain中创建了它的实例,没有权限,但是:

奇怪的是,我在DoCallback行中看到SecurityException,它说:

请求类型的权限 'System.Security.Permissions.ReflectionPermission,mscorlib, 版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089' 失败了

MSDN对AppDomain.docCallback的权限要求进行说明:

ReflectionPermission在通过诸如 作为Type.InvokeMember

呼叫未使用以下内容:为什么我会收到异常?

编辑

为清楚起见,以下是我用来创建带有隔离对象的AppDomain的代码:

    [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);
    }
这两段代码是我的完整应用程序,没有其他代码(因此异常应该很容易复制)


谢谢你的帮助

我尝试了下面的方法,似乎效果不错

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);
    }
}

解决方案实际上非常简单:您没有将公共访问修饰符添加到
类IsolationEntryPoint
,即在更改类签名之后,您的示例运行得很好:

public class IsolationEntryPoint : MarshalByRefObject
{
    // [...]
}

但是您是从默认的AppDomain执行它的,默认情况下AppDomain具有反射权限。我正在从AppDomain执行它,没有权限,只有执行。您可以尝试通过appDomainObject.PermissionSet.AddPermission(新建SecurityPermission(SecurityPermissionFlag.Execution)),显式地向AppDomain添加自定义权限;那会有什么帮助?AppDomain具有正确的执行权限(为了安全起见,我不想添加反射权限)。我还发布了我用来创建AppDomain的完整代码。重塑者甚至对我大吼大叫,给这个班一个访问限定符。谢谢你的帮助,+100(曾经允许我):)哟,有时候使用工具胜过使用源代码;)-感谢慷慨的赏金,这使得解决这些难题更加值得:)
public class IsolationEntryPoint : MarshalByRefObject
{
    // [...]
}