如何使用ReflectionPermission来拒绝reflection

我试图在我的应用程序中添加插件,但是我不希望插件使用reflection,插件代码可以是使用应用程序域的沙箱。

我已经在MSDN上find了一个AppDomain 示例 ,但没有任何对ReflectionPermision的引用,并且拒绝安全属性也被折旧了,很多属性都被折旧了,那么我该如何停止reflection呢?

要使用AppDomain.CreateDomain创建沙盒应用程序域,您应该传递一个PermissionSet,其中只包含要授予沙盒程序集的权限。 如果您不想授予ReflectionPermission,则不应将其添加到权限集。

也就是说,ReflectionPermission远非唯一的“危险”许可,通常应该拒绝一般来源加载项。 如果你想要非常严格,你可能要考虑只授予SecurityPermission \ Execution。 例如

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

如果您想要包含额外的“安全”权限,则可以使用其他AddPermission调用将它们添加到权限集中。 如果您想要包含所有被认为足够安全的权限,以便将其授予源代码为脱机的CAS策略系统,则可以通过将Internet区域证据传递给SecurityManager.GetStandardSandbox静态方法来提取这些权限。 例如

 Evidence evidence = new Evidence(); evidence.AddHostEvidence(new Zone(SecurityZone.Internet)); PermissionSet permissionSet = SecurityManager.GetStandardSandbox(evidence); 

注意 :这两种方法在您提到的MSDN文章中都有描述。

根据文档, ReflectionPermission是您授予代码访问私有和受保护的成员的东西。 默认情况下,它不被授予,代码只能访问公共成员。 如果您试图隐藏公共成员,您将需要创建一个不会公开他们的新界面。