CA2138 : Les méthodes transparentes ne doivent pas appeler les méthodes ayant l'attribut SuppressUnmanagedCodeSecurity
TypeName |
TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods |
CheckId |
CA2138 |
Catégorie |
Microsoft.Security |
Modification avec rupture |
Oui |
Cause
Une méthode transparente de sécurité appelle une méthode marquée avec l'attribut SuppressUnmanagedCodeSecurityAttribute.
Description de la règle
Cette règle déclenche sur toute méthode transparente qui fait directement appel au code natif, par exemple via un appel P/Invoke (appel de code).Les méthodes P/Invoke et COM Interop marquées avec l'attribut SuppressUnmanagedCodeSecurityAttribute produisent un LinkDemand effectué sur la méthode d'appel.Parce que le code transparent de sécurité ne peut pas satisfaire LinkDemands, le code ne peut pas également appeler les méthodes marquées avec l'attribut SuppressUnmanagedCodeSecurity, ou les méthodes de classe marquée avec l'attribut SuppressUnmanagedCodeSecurity.La méthode échouera ou la demande sera convertie en demande complète.
Les violations de cette règle provoquent une MethodAccessException dans le modèle de transparence de sécurité de niveau 2, et une demande complète pour UnmanagedCode dans le modèle de transparence de niveau 1.
Comment corriger les violations
Pour résoudre une violation de cette règle, supprimez l'attribut SuppressUnmanagedCodeSecurityAttribute et marquez la méthode avec l'attribut SecurityCriticalAttribute ou SecuritySafeCriticalAttribute.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle.
Exemple
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace TransparencyWarningsDemo
{
public class CallSuppressUnmanagedCodeSecurityClass
{
[SuppressUnmanagedCodeSecurity]
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool Beep(uint dwFreq, uint dwDuration);
public void CallNativeMethod()
{
// CA2138 violation - transparent method calling a method marked with SuppressUnmanagedCodeSecurity
// (this is also a CA2149 violation as well, since this is a P/Invoke and not an interface call).
Beep(10000, 1);
}
}
}