CA2149 : Les méthodes transparentes ne doivent pas appeler du code natifCA2149: Transparent methods must not call into native code

TypeNameTypeName TransparentMethodsMustNotCallNativeCodeTransparentMethodsMustNotCallNativeCode
CheckIdCheckId CA2149CA2149
CategoryCategory Microsoft.SecurityMicrosoft.Security
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Une méthode appelle une fonction native via un stub de méthode tel que P/Invoke.A method calls a native function through a method stub such as P/Invoke.

Description de la règleRule Description

Cette règle se déclenche sur toute méthode transparente qui appelle directement en code natif (par exemple, via un appel P/Invoke).This rule fires on any transparent method which calls directly into native code, for example, through a P/Invoke. Les violations de cette règle provoquent une MethodAccessException dans le modèle de transparence de niveau 2 et une demande complète pour UnmanagedCode dans le modèle de transparence de niveau 1.Violations of this rule lead to a MethodAccessException in the level 2 transparency model, and a full demand for UnmanagedCode in the level 1 transparency model.

Comment corriger les violationsHow to Fix Violations

Pour corriger une violation de cette règle, marquez la méthode qui appelle le code natif avec le SecurityCriticalAttribute ou SecuritySafeCriticalAttribute attribut.To fix a violation of this rule, mark the method that calls the native code with the SecurityCriticalAttribute or SecuritySafeCriticalAttribute attribute.

Quand supprimer les avertissementsWhen to Suppress Warnings

Ne supprimez aucun avertissement de cette règle.Do not suppress a warning from this rule.

ExempleExample

using System;
using System.Runtime.InteropServices;

namespace TransparencyWarningsDemo
{

    public class CallNativeCodeClass
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool Beep(uint dwFreq, uint dwDuration);

        public void CallNativeMethod()
        {
            // CA2149 violation - transparent method calling native code
            Beep(10000, 1);
        }
    }

}