Share via


platform invoke (considerazioni sulla sicurezza)

I membri Assert, Deny e PermitOnly dell'enumerazione SecurityAction sono denominati modificatori di percorso chiamate nello stack. Questi membri vengono ignorati se utilizzati come attributi dichiarativi in dichiarazioni pInvoke e istruzioni COM del linguaggio di definizione dell'interfaccia (IDL, Interface Definition Language).

Esempi di platform invoke

Negli esempi di pInvoke presenti in questa sezione viene illustrato l'utilizzo dell'attributo RegistryPermission con i modificatori del percorso chiamate nello stack.

Nell'esempio di codice seguente, vengono ignorati i modificatori SecurityActionAssert, Deny e 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();

Nell'esempio seguente viene invece accettato il modificatore Demand.

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

I modificatori SecurityAction funzionano correttamente se vengono inseriti in una classe contenente la chiamata pInvoke.

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

I modificatori SecurityAction funzionano correttamente anche in un scenario annidato in cui vengono inseriti nel chiamante della chiamata pInvoke:

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

Esempi di interoperabilità COM

Negli esempi di interoperabilità COM presenti in questa sezione viene illustrato l'utilizzo dell'attributo RegistryPermission con i modificatori del percorso chiamate nello stack.

Nelle dichiarazioni di interfaccia di interoperabilità COM seguenti vengono ignorati i modificatori Assert, Deny e PermitOnly, in modo analogo agli esempi di pInvoke della sezione precedente.

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

Inoltre, il modificatore Demand non viene accettato negli scenari di dichiarazione di interfaccia di interoperabilità COM, come mostrato nell'esempio seguente.

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

Vedere anche

Riferimenti

SecurityAction

Concetti

Autorizzazioni di sicurezza

Creazione di prototipi nel codice gestito

Utilizzo di funzioni di DLL non gestite

Altre risorse

Interoperabilità con codice non gestito

Interoperabilità