Consideraciones sobre la seguridad de invocación de plataforma

Actualización: noviembre 2007

Los miembros Assert, Deny y PermitOnly de la enumeración SecurityAction se denominan modificadores de recorrido de pila. Estos miembros se omiten si se utilizan como atributos declarativos en las declaraciones de invocación de plataforma y en instrucciones de lenguaje de definición de interfaz (IDL) COM.

Ejemplos de invocación de plataforma

Los ejemplos de invocación de plataforma de esta sección muestran el uso del atributo RegistryPermission con los modificadores de recorrido de pila.

En el ejemplo de código siguiente, se omiten los modificadores SecurityActionAssert, Deny y PermitOnly.

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
    private static extern bool CallRegistryPermissionAssert();

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]
    private static extern bool CallRegistryPermissionDeny();

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]
    private static extern bool CallRegistryPermissionDeny();

Sin embargo, el modificador Demand se acepta en el ejemplo siguiente.

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
    private static extern bool CallRegistryPermissionDeny();

Los modificadores SecurityAction funcionan correctamente si se colocan en una clase que contiene la llamada de invocación de plataforma.

[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
public ref class PInvokeWrapper
{
public:
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
    private static extern bool CallRegistryPermissionDeny();
};
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
class PInvokeWrapper
{
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
    private static extern bool CallRegistryPermissionDeny();
}

Los modificadores SecurityAction también funcionan correctamente en escenarios anidados, donde se colocan en el llamador de la llamada de invocación de plataforma:

{
public ref class PInvokeWrapper
public:
    [DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
    private static extern bool CallRegistryPermissionDeny();

    [RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
    public static bool CallRegistryPermission()
    {
     return CallRegistryPermissionInternal();
    }
};
class PInvokeScenario
{
    [DllImport(“MyClass.dll”, EntryPoint = “CallRegistryPermission”)]
    private static extern bool CallRegistryPermissionInternal();

    [RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
    public static bool CallRegistryPermission()
    {
     return CallRegistryPermissionInternal();
    }
}

Ejemplos de interoperabilidad COM

Los ejemplos de interoperabilidad COM de esta sección muestran el uso del atributo RegistryPermission con los modificadores de recorrido de pila.

Las siguientes declaraciones de interfaz de interoperabilidad COM omiten los modificadores Assert, Deny y PermitOnly, de forma similar a los ejemplos de invocación de plataforma de la sección anterior.

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IAssertStubsItf
{
[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
    bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Assert, Unrestricted = true)]
    bool CallFileIoPermission();
}

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IDenyStubsItf
{
[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]
    bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Deny, Unrestricted = true)]
    bool CallFileIoPermission();
}

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IAssertStubsItf
{
[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]
    bool CallRegistryPermission();
[FileIOPermission(SecurityAction.PermitOnly, Unrestricted = true)]
    bool CallFileIoPermission();
}

Además, el modificador Demand no se acepta en escenarios de declaración de interfaz de interoperabilidad COM, como se muestra en el ejemplo siguiente.

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IDemandStubsItf
{
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
    bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Demand, Unrestricted = true)]
    bool CallFileIoPermission();
}

Vea también

Conceptos

Permisos de seguridad

Crear prototipos en código administrado

Consumir funciones DLL no administradas

Referencia

SecurityAction

Otros recursos

Interoperar con código no administrado

Interoperabilidad