Partilhar via


CA2205: usar equivalentes gerenciados da API do Win32

TypeName

UseManagedEquivalentsOfWin32Api

CheckId

CA2205

Categoria

Microsoft.Usage

Alteração Significativa

Sem Quebra

Causa

Um método de invocação de plataforma é definido e um método com a funcionalidade equivalente existe na biblioteca de classes de .NET Framework .

Descrição da Regra

Um método de invocação de plataforma é usado para chamar uma função não gerenciado DLL e definido usando o atributo de DllImportAttribute , ou a palavra-chave de Declare no Visual Basic.Um método definido incorretamente de invocação de plataforma pode resultar em exceções em tempo de execução devido a problemas como uma função misnamed, defeituoso um mapeamento de tipos de dados do parâmetro e o valor de retorno, e as especificações de campo incorretas, como a convenção de chamada e o conjunto de caracteres.Se disponível, normalmente é mais simples e o sujeito a erros chamar o método gerenciado equivalente do que para definir diretamente e chamar o método não gerenciado.Chamar um método de invocação de plataforma também pode resultar em problemas de segurança adicionais que precisam ser resolvidos.

Como Corrigir Violações

Para corrigir uma violação desta regra, substitua a chamada para a função não gerenciado com uma chamada para seu equivalente gerenciado.

Quando Suprimir Alertas

Suprima um aviso dessa regra se o método sugerido de substituição não fornece a funcionalidade necessária.

Exemplo

O exemplo a seguir mostra uma definição do método de invocação de plataforma que viola a regra.Além disso, as chamadas para o método de invocação de preparo e ao método gerenciado equivalente são mostrados.

Imports System
Imports System.Runtime.InteropServices
Imports System.Text

Namespace UsageLibrary

   Class NativeMethods

      Private Sub New()
      End Sub 

      ' The following method definitions violate the rule.

      <DllImport("kernel32.dll", CharSet := CharSet.Unicode, _ 
         SetLastError := True)> _ 
      Friend Shared Function ExpandEnvironmentStrings _ 
         (lpSrc As String, lpDst As StringBuilder, nSize As Integer) _ 
         As Integer 
      End Function 

      Friend Declare Unicode Function ExpandEnvironmentStrings2 _ 
         Lib "kernel32.dll" Alias "ExpandEnvironmentStrings" _ 
         (lpSrc As String, lpDst As StringBuilder, nSize As Integer) _ 
         As Integer 

   End Class 

   Public Class UseNativeMethod

      Shared Sub Main()

         Dim environmentVariable As String = "%TEMP%" 
         Dim expandedVariable As New StringBuilder(100)

         ' Call the unmanaged method.
         NativeMethods.ExpandEnvironmentStrings( _ 
            environmentVariable, _ 
            expandedVariable, _ 
            expandedVariable.Capacity)

         ' Call the unmanaged method.
         NativeMethods.ExpandEnvironmentStrings2( _ 
            environmentVariable, _ 
            expandedVariable, _ 
            expandedVariable.Capacity)

         ' Call the equivalent managed method.
         Environment.ExpandEnvironmentVariables(environmentVariable)

      End Sub 

   End Class 

End Namespace
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace UsageLibrary
{
   internal class NativeMethods
   {
      private NativeMethods() {}

      // The following method definition violates the rule.
      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, 
          SetLastError = true)]
      internal static extern int ExpandEnvironmentStrings(
         string lpSrc, StringBuilder lpDst, int nSize);
   }

   public class UseNativeMethod
   {
      public void Test()
      {
         string environmentVariable = "%TEMP%";
         StringBuilder expandedVariable = new StringBuilder(100);

         // Call the unmanaged method.
         NativeMethods.ExpandEnvironmentStrings(
            environmentVariable, 
            expandedVariable, 
            expandedVariable.Capacity);

         // Call the equivalent managed method.
         Environment.ExpandEnvironmentVariables(environmentVariable);
      }
   }
}

Regras Relacionadas

CA1404: chamar GetLastError logo depois de P/Invoke

CA1060: mover P/Invokes para a classe NativeMethods

CA1400: os pontos de entrada P/Invoke devem existir

CA1401: P/Invokes não deve estar visível

CA2101: especificar marshaling para argumentos da cadeia de caracteres P/Invoke