Click to Rate and Give Feedback

  Switch on low bandwidth view
This page is specific to
Microsoft Visual Studio 2008/.NET Framework 3.5

Other versions are also available for the following:
.NET Framework Class Library
ReflectionPermission Class

Controls access to non-public types and members through the System.Reflection APIs. Controls some features of the System.Reflection.Emit APIs.

Namespace:  System.Security.Permissions
Assembly:  mscorlib (in mscorlib.dll)
Visual Basic (Declaration)
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public NotInheritable Class ReflectionPermission _
    Inherits CodeAccessPermission _
    Implements IUnrestrictedPermission
Visual Basic (Usage)
Dim instance As ReflectionPermission
C#
[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class ReflectionPermission : CodeAccessPermission, 
    IUnrestrictedPermission
Visual C++
[SerializableAttribute]
[ComVisibleAttribute(true)]
public ref class ReflectionPermission sealed : public CodeAccessPermission, 
    IUnrestrictedPermission
JScript
public final class ReflectionPermission extends CodeAccessPermission implements IUnrestrictedPermission

Without ReflectionPermission, code can use reflection to access only the public members of objects. Code with ReflectionPermission and the appropriate ReflectionPermissionFlag flags can access the protected and private members of objects.

Caution noteCaution:

Because ReflectionPermission can provide access to non-public types and members, we recommend that you do not grant ReflectionPermission to Internet code, except with the ReflectionPermissionFlag..::.RestrictedMemberAccess flag. RestrictedMemberAccess allows access to non-public members, with the restriction that the grant set of the non-public members must be equal to, or a subset of, the grant set of the code that accesses the non-public members.

Certain features of reflection emit, such as emitting debug symbols, require ReflectionPermission with the ReflectionPermissionFlag..::.ReflectionEmit flag.

For more information, see the ReflectionPermissionFlag enumeration.

The following code example shows the behavior of the ReflectionPermission class methods.

NoteNote:

The code example is intended to show the behavior of the methods, not to demonstrate their use. In general, the methods of permission classes are used by the security infrastructure; they are not typically used in applications. Generally, only the constructors are used in application code. The created instance validates or controls resource access by using inherited CodeAccessPermission methods such as Demand.

Visual Basic
Imports System
Imports System.Security
Imports System.Security.Permissions



Public Class ReflectionPermissionDemo

    ' Demonstrate all methods.
    Public Shared Sub Main(ByVal args() As String)
        IsSubsetOfDemo()
        CopyDemo()
        UnionDemo()
        IntersectDemo()
        ToFromXmlDemo()
        Console.WriteLine("Press the Enter key to exit.")
        Console.ReadLine()

    End Sub 'Main

    ' IsSubsetOf determines whether the current permission is a subset of the specified permission.
    Private Shared Sub IsSubsetOfDemo()

        Dim memberAccessPerm As New ReflectionPermission(ReflectionPermissionFlag.MemberAccess)
        Dim restrictedMemberAccessPerm As New ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess)
        If restrictedMemberAccessPerm.IsSubsetOf(memberAccessPerm) Then
            Console.WriteLine(restrictedMemberAccessPerm.Flags + " is a subset of " + memberAccessPerm.Flags)
        Else
            Console.WriteLine(restrictedMemberAccessPerm.Flags.ToString() + _
            " is not a subset of " + memberAccessPerm.Flags.ToString())
        End If

    End Sub 'IsSubsetOfDemo

    ' Union creates a new permission that is the union of the current permission and the specified permission.
    Private Shared Sub UnionDemo()
        Dim memberAccessPerm As New ReflectionPermission(ReflectionPermissionFlag.MemberAccess)
        Dim restrictedMemberAccessPerm As New ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess)
        Dim reflectionPerm3 As ReflectionPermission = _
                CType(memberAccessPerm.Union(restrictedMemberAccessPerm), ReflectionPermission)
        If reflectionPerm3 Is Nothing Then
            Console.WriteLine("The union of " + memberAccessPerm.Flags.ToString() + " and " + _
            restrictedMemberAccessPerm.Flags.ToString() + " is null.")
        Else
            Console.WriteLine("The union of " + memberAccessPerm.Flags.ToString() + _
            " and " + restrictedMemberAccessPerm.Flags.ToString() + " = " + _
            CType(reflectionPerm3, ReflectionPermission).Flags.ToString())
        End If

    End Sub 'UnionDemo


    ' Intersect creates and returns a new permission that is the intersection of the current
    ' permission and the permission specified.
    Private Shared Sub IntersectDemo()
        Dim memberAccessPerm As New ReflectionPermission(ReflectionPermissionFlag.MemberAccess)
        Dim restrictedMemberAccessPerm As New ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess)
        Dim reflectionPerm3 As ReflectionPermission = CType(memberAccessPerm.Intersect(restrictedMemberAccessPerm), ReflectionPermission)
        If Not (reflectionPerm3 Is Nothing) Then
            Console.WriteLine("The intersection of " + memberAccessPerm.Flags.ToString() + _
            " and " + restrictedMemberAccessPerm.Flags.ToString() + " = " + _
            CType(reflectionPerm3, ReflectionPermission).Flags.ToString())
        Else
            Console.WriteLine("The intersection of " + memberAccessPerm.Flags.ToString + " and " + _
                restrictedMemberAccessPerm.Flags.ToString() + " is null.")
        End If

    End Sub 'IntersectDemo


    'Copy creates and returns an identical copy of the current permission.
    Private Shared Sub CopyDemo()
        Dim memberAccessPerm As New ReflectionPermission(ReflectionPermissionFlag.MemberAccess)
        Dim restrictedMemberAccessPerm As ReflectionPermission = CType(memberAccessPerm.Copy(), ReflectionPermission)
        Console.WriteLine("Result of copy = " + restrictedMemberAccessPerm.ToString())

    End Sub 'CopyDemo

    ' ToXml creates an XML encoding of the permission and its current state;
    ' FromXml reconstructs a permission with the specified state from the XML encoding.
    Private Shared Sub ToFromXmlDemo()
        Dim memberAccessPerm As New ReflectionPermission(ReflectionPermissionFlag.MemberAccess)
        Dim restrictedMemberAccessPerm As New ReflectionPermission(PermissionState.None)
        restrictedMemberAccessPerm.FromXml(memberAccessPerm.ToXml())
        Console.WriteLine("Result of ToFromXml = " + restrictedMemberAccessPerm.ToString())

    End Sub 'ToFromXmlDemo
End Class 'ReflectionPermissionDemo

' This code example creates the following output:
'RestrictedMemberAccess is not a subset of MemberAccess
'Result of copy = <IPermission class="System.Security.Permissions.ReflectionPermi
'ssion, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e0
'89"
'version="1"
'Flags="MemberAccess"/>
'The union of MemberAccess and RestrictedMemberAccess = MemberAccess, RestrictedM
'emberAccess
'The intersection of MemberAccess and RestrictedMemberAccess is null.
'Result of ToFromXml = <IPermission class="System.Security.Permissions.Reflection
'Permission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561
'934e089"
'version="1"
'Flags="MemberAccess"/>
'Press the Enter key to exit.

C#
using System;
using System.Security;
using System.Security.Permissions;

public class ReflectionPermissionDemo
{
    // Demonstrate all methods.
    public static void Main(String[] args)
    {
        IsSubsetOfDemo();
        CopyDemo();
        UnionDemo();
        IntersectDemo();
        ToFromXmlDemo();
        Console.WriteLine("Press the Enter key to exit.");
        Console.ReadLine();
    }
    // IsSubsetOf determines whether the current permission is a subset of the specified permission.
    private static void IsSubsetOfDemo()
    {
        ReflectionPermission memberAccessPerm = new ReflectionPermission(ReflectionPermissionFlag.MemberAccess);
        ReflectionPermission restrictedMemberAccessPerm = new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess);

        if (restrictedMemberAccessPerm.IsSubsetOf(memberAccessPerm))
        {
            Console.WriteLine(restrictedMemberAccessPerm.Flags + " is a subset of " +
                memberAccessPerm.Flags);
        }
        else
        {
            Console.WriteLine(restrictedMemberAccessPerm.Flags + " is not a subset of " +
                memberAccessPerm.Flags);
        }
    }
    // Union creates a new permission that is the union of the current permission and the specified permission.
    private static void UnionDemo()
    {
        ReflectionPermission memberAccessPerm = new ReflectionPermission(ReflectionPermissionFlag.MemberAccess);
        ReflectionPermission restrictedMemberAccessPerm = new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess);
        ReflectionPermission reflectionPerm3 = (ReflectionPermission)memberAccessPerm.Union(restrictedMemberAccessPerm);
        if (reflectionPerm3 == null)
        {
            Console.WriteLine("The union of " + memberAccessPerm.Flags + " and " +
                restrictedMemberAccessPerm.Flags + " is null.");
        }
        else
        {
            Console.WriteLine("The union of " + memberAccessPerm.Flags + " and " +
                restrictedMemberAccessPerm.Flags + " = " +
                ((ReflectionPermission)reflectionPerm3).Flags.ToString());
        }

    }
    // Intersect creates and returns a new permission that is the intersection of the current
    // permission and the permission specified.
    private static void IntersectDemo()
    {
        ReflectionPermission memberAccessPerm = new ReflectionPermission(ReflectionPermissionFlag.MemberAccess);
        ReflectionPermission restrictedMemberAccessPerm = new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess);
        ReflectionPermission reflectionPerm3 = (ReflectionPermission)memberAccessPerm.Intersect(restrictedMemberAccessPerm);
        if (reflectionPerm3 != null)
        {
            Console.WriteLine("The intersection of " + memberAccessPerm.Flags +
                " and " + restrictedMemberAccessPerm.Flags + " = " +
                ((ReflectionPermission)reflectionPerm3).Flags.ToString());
        }
        else
        {
            Console.WriteLine("The intersection of " + memberAccessPerm.Flags + " and " +
                restrictedMemberAccessPerm.Flags + " is null.");
        }

    }
    //Copy creates and returns an identical copy of the current permission.
    private static void CopyDemo()
    {
        ReflectionPermission memberAccessPerm = new ReflectionPermission(ReflectionPermissionFlag.MemberAccess);
        ReflectionPermission restrictedMemberAccessPerm = (ReflectionPermission)memberAccessPerm.Copy();
        Console.WriteLine("Result of copy = " + restrictedMemberAccessPerm.ToString());
    }
    // ToXml creates an XML encoding of the permission and its current state;
    // FromXml reconstructs a permission with the specified state from the XML encoding.
    private static void ToFromXmlDemo()
    {
        ReflectionPermission memberAccessPerm = new ReflectionPermission(ReflectionPermissionFlag.MemberAccess);
        ReflectionPermission restrictedMemberAccessPerm = new ReflectionPermission(PermissionState.None);
        restrictedMemberAccessPerm.FromXml(memberAccessPerm.ToXml());
        Console.WriteLine("Result of ToFromXml = " +
            restrictedMemberAccessPerm.ToString());
    }
}

// This code example creates the following output:

//RestrictedMemberAccess is not a subset of MemberAccess
//Result of copy = <IPermission class="System.Security.Permissions.ReflectionPermi
//ssion, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e0
//89"
//version="1"
//Flags="MemberAccess"/>

//The union of MemberAccess and RestrictedMemberAccess = MemberAccess, RestrictedM
//emberAccess
//The intersection of MemberAccess and RestrictedMemberAccess is null.
//Result of ToFromXml = <IPermission class="System.Security.Permissions.Reflection
//Permission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561
//934e089"
//version="1"
//Flags="MemberAccess"/>

//Press the Enter key to exit.


Visual C++
// ReflectionPermission.cpp : main project file.

using namespace System;
using namespace System::Security;
using namespace System::Security::Permissions;
using namespace System::Runtime::InteropServices;




void DisplayIntro()
{
    Console::WriteLine(
    "Welcome to the Reflection Permission Demo\n\n"
    "Background:  ReflectionPermission Class\n\n"
    "  1) Controls access to metadata through the System.Reflection APIs\n"
    "  2) Cannot be inherited\n"
    "  3) Contains a Flags Property:  Gets or sets the type of\n" 
    "       reflection allowed for the current permission.\n"
    "       Possible values are:\n\n"
    "       a.  ReflectionPermissionFlag::AllFlags\n"
    "       b.  ReflectionPermissionFlag::MemberAccess\n"
    "       c.  ReflectionPermissionFlag::RestrictedMemberAccess\n"
    "       d.  ReflectionPermissionFlag::NoFlags\n"
    "       e.  ReflectionPermissionFlag::ReflectionEmit\n"

    "  4) Supports the System.Security IPermissions interface.\n"
    "     The following members are demonstrated:\n\n"
    "       a.  IsSubsetOf  Determines whether the current permission is a subset\n"
    "                          of the specified permission\n\n"
    "       b.  Copy        Creates and returns an identical copy of the current\n"
    "                          permission\n\n"
    "       c.  Intersect   Creates and returns a permission that is the\n"
    "                          intersection of the current permission and the\n"
    "                          specified permission\n\n"
    "       d.  Union       Creates a permission that is the union of the\n"
    "                          current permission\n"
    "                          and the specified permission\n\n"
    "       e.  ToXml       When overridden in a derived class, creates an\n"
    "                          XML encoding of the\n"
    "                          security object and its current state.\n\n"
    "       f.  FromXML     When overridden in a derived class, reconstructs\n"
    "                          a security object with a specified state \n"
    "                          from an XML encoding\n\n"

    "Sample Introduction\n\n"
    "This sample consists of five small tests, illustrating the preceeding\n"
    "interface members.  In each test, two RelectionPermission objects are\n"
    "instantiated with various combinations of ReflectionPermissionFlag properties.\n"
    "These two objects are then compared with, or manipulated against, each other.\n\n");
}

int main()
{
    DisplayIntro();

    array<ReflectionPermissionFlag>^ aRPF =  {ReflectionPermissionFlag::AllFlags,
                                              ReflectionPermissionFlag::MemberAccess,
                                              ReflectionPermissionFlag::RestrictedMemberAccess,
                                              ReflectionPermissionFlag::NoFlags,
                                              ReflectionPermissionFlag::ReflectionEmit};

    int i,j;
    String^ spacer = "------------------------------------------------------\n";

    ReflectionPermission^ RP1, ^RP2, ^RP3;

    Console::WriteLine( "\n**********************  IsSubsetOf() Demo **********************\n" );
    for ( i=0;i<5;i++)
       {
       RP1 = gcnew ReflectionPermission( aRPF[i] );

       for ( j=0;j<5;j++)
            {
            RP2 = gcnew ReflectionPermission( aRPF[j] );
            Console::WriteLine("   {0} is {1}a subset of {2} ", RP2->Flags,
                               RP2->IsSubsetOf(RP1)?"":"not ", RP1->Flags);
            }
       Console::WriteLine(spacer);
       }


    Console::WriteLine( "\n*************************  Copy Demo() *************************\n" );
    for ( i=0;i<5;i++)
       {
       RP1 = gcnew ReflectionPermission( aRPF[i] );

       for ( j=0;j<5;j++)
            {
            RP2 = gcnew ReflectionPermission( aRPF[j] );
            Console::WriteLine("   {0} is {1}a subset of {2} ", RP2->Flags,
                               RP2->IsSubsetOf(RP1)?"":"not ", RP1->Flags);
            }
       Console::WriteLine(spacer);
       }


    Console::WriteLine( "\n*********************  Intersection() Demo *********************\n" );
    for ( i=0;i<5;i++)
       {
       RP1 = gcnew ReflectionPermission( aRPF[i] );

       for ( j=0;j<5;j++)
            {
            RP2 = gcnew ReflectionPermission( aRPF[j] );
            RP3 = dynamic_cast<ReflectionPermission^>(RP1->Intersect( RP2 ));
            if ( RP3 != nullptr )
               Console::WriteLine( "The intersection of {0} and {1} = {2}", RP1->Flags, RP2->Flags,
                                    (dynamic_cast<ReflectionPermission^>(RP3))->Flags );
            else
               Console::WriteLine( "The intersection of {0} and {1} is null", RP1->Flags, RP2->Flags );
            }
       Console::WriteLine(spacer);
       }


    Console::WriteLine( "\n************************  Union() Demo *************************\n" );
    for ( i=0;i<5;i++)
       {
       RP1 = gcnew ReflectionPermission( aRPF[i] );

       for ( j=0;j<5;j++)
            {
            RP2 = gcnew ReflectionPermission( aRPF[j] );
            RP3 = dynamic_cast<ReflectionPermission^>(RP1->Union( RP2 ));
            if ( RP3 != nullptr )
               Console::WriteLine( "The union of {0} and {1} = {2}", RP1->Flags, RP2->Flags,
                                    (dynamic_cast<ReflectionPermission^>(RP3))->Flags );
            else
               Console::WriteLine( "The union of {0} and {1} is null", RP1->Flags, RP2->Flags );
            }
       Console::WriteLine(spacer);
       }


    Console::WriteLine( "\n*******************  ToXml() and FromXml Demo ******************\n" );
    RP1 = gcnew ReflectionPermission( aRPF[1] );
    Console::WriteLine( "RP1->ToXml = {0}", RP1->ToXml() );
                                                                // Next 2 lines are identical
    RP2 = gcnew ReflectionPermission( PermissionState::None );  // Sets the NoFlag state
//  RP2 = gcnew ReflectionPermission( aRPF[2] );                // Explicitely sets the NoFlag state
    Console::WriteLine( "RP2->ToXml = {0}", RP2->ToXml() );
    RP2->FromXml( RP1->ToXml() );
    Console::WriteLine( "RP2:   RP2->FromXml( RP1->ToXml() ) = {0}", RP2 );
    Console::WriteLine( "Note:  RP2 Flag changed from NoFlags to MemberAccess", RP2 );


    Console::WriteLine("\n\nHit ENTER to return");
    Console::ReadLine();
}

System..::.Object
  System.Security..::.CodeAccessPermission
    System.Security.Permissions..::.ReflectionPermission
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0
Tags What's this?: Add a tag
Community Content   What is Community Content?
Add new content RSS  Annotations
Processing
© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Page view tracker