Compartilhar via


CA2205: Equivalentes do gerenciado de uso da API do Win32

TypeName

UseManagedEquivalentsOfWin32Api

CheckId

CA2205

<strong>Categoria</strong>

Microsoft.Usage

Alteração significativa

Não separável

Causa

Uma plataforma chamar método está definido e existe um método com a funcionalidade equivalente a .NET Framework biblioteca de classes.

Descrição da regra

Uma plataforma de invocar o método é usado para chamar uma função DLL não gerenciada e é definida usando o System.Runtime.InteropServices.DllImportAttribute atributo, ou o Declare palavra-chave em Visual Basic.Uma plataforma definida incorretamente invocar o método pode causar exceções de tempo de execução devido problemas como, por exemplo, uma função equivocado, com defeito de mapeamento de tipos de dados de valor de parâmetro e retorno e especificações de campo incorreto, como, por exemplo, o conjunto de caracteres e de convenção de chamada.Se estiver disponível, geralmente é mais simples e menos propensa chamar o método gerenciado equivalente que definem e chamar o método não gerenciado diretamente.Chamando uma plataforma de invocar o método também podem levar a problemas de segurança adicionais que precisam ser tratados.

Como corrigir violações

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

Quando suprimir avisos

Elimina um aviso esta regra se o método sugerido de substituição não fornecer a funcionalidade necessária.

Exemplo

A exemplo a seguir mostra a plataforma chama a definição do método que viola a regra.Além disso, as chamadas para a plataforma chamar o método e o 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 imediatamente após P/Invoke.

CA1060: Mover P/Invokes à classe NativeMethods

CA1400: Os pontos de entrada de P/Invoke devem existir

CA1401: P/Invokes não deverá ser visível

CA2101: Especifique o empacotamento para argumentos de seqüência de caracteres de P/Invoke.