首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AppDomain.DoCallBack需要ReflectionPermission?

AppDomain.DoCallBack需要ReflectionPermission?
EN

Stack Overflow用户
提问于 2012-01-21 17:08:29
回答 2查看 655关注 0票数 1

我有这个类,我在AppDomain中创建这个类的实例除了SecurityPermissionFlag.Execute之外没有任何权限。

代码语言:javascript
复制
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、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089‘类型的权限失败。

MSDNsays 关于AppDomain.DoCallBack的权限要求:

当通过诸如ReflectionPermission等机制调用后期绑定时,就会出现Type.InvokeMember。

调用没有使用像 Type.InvokeMember这样的东西,为什么我会得到异常呢?

编辑

为了清晰起见,下面是使用隔离对象创建AppDomain的代码:

代码语言:javascript
复制
    [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);
    }

这两段代码是我的完整应用程序,没有其他任何东西(所以异常应该很容易再现)。

谢谢你的帮忙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-25 12:24:20

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

代码语言:javascript
复制
public class IsolationEntryPoint : MarshalByRefObject
{
    // [...]
}
票数 3
EN

Stack Overflow用户

发布于 2012-01-21 19:29:34

我试过下面的方法,看起来很管用。

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8954881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档