Share via


Considérations relatives à la sécurité d'appel de code non managé

Mise à jour : novembre 2007

Les membres Assert, Deny et PermitOnly de l'énumération SecurityAction sont connus sous le nom de modificateurs de parcours de la pile. Ces membres sont ignorés s'ils sont utilisés comme attributs déclaratifs dans les déclarations d'appel de code non managé et les instructions IDL (Interface Definition Language) COM.

Exemples d'appel de code non managé

Les exemples d'appel de code non managé fournis dans cette section illustrent l'utilisation de l'attribut RegistryPermission avec les modificateurs de parcours de la pile.

Dans l'exemple de code suivant, les modificateurs SecurityActionAssert, Deny et PermitOnly sont ignorés.

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

Toutefois, le modificateur Demand dans l'exemple suivant est accepté.

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

Les modificateurs SecurityAction fonctionnent correctement s'ils sont placés sur une classe qui contient (encapsule) l'appel de code non managé.

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

Les modificateurs SecurityAction fonctionnent également correctement dans un scénario imbriqué quand ils sont placés sur l'appelant de l'appel de code non managé :

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

Exemples COM Interop

Les exemples COM Interop fournis dans cette section illustrent l'utilisation de l'attribut RegistryPermission avec les modificateurs de parcours de la pile.

Les déclarations d'interface COM Interop ignorent les modificateurs Assert, Deny et PermitOnly, de la même façon que les exemples d'appel de code non managé dans la section précédente.

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

En outre, le modificateur Demand n'est pas accepté dans les scénarios de déclaration de l'interface COM Interop, comme illustré dans l'exemple suivant.

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

Voir aussi

Concepts

Autorisations de sécurité

Création de prototypes dans du code managé

Consommation de fonctions DLL non managées

Référence

SecurityAction

Autres ressources

Interopération avec du code non managé

Interopérabilité