Compartilhar via


Use o gerenciado equivalentes da API do Win32

TypeName

UseManagedEquivalentsOfWin32Api

CheckId

CA2205

Category (Categoria)

Microsoft.uso

Quebrando alterar

Não separável

Causa

Uma invocação de plataforma método está definido e existe um método com a funcionalidade equivalente no .NET Framework biblioteca de classes.

Descrição da regra

Uma plataforma de invocar o método é usado para telefonar uma função DLL não gerenciada e é definido usando o System.Runtime.InteropServices.DllImportAttribute atributo, ou o Declare palavra-chave no Visual Basic. Incorretamente definido invocação de plataforma método pode levar a exceções de tempo de execução devido a problemas sistema autônomo uma função misnamed defeituoso de mapeamento de tipos de dados de valor do parâmetro e retorno e especificações de campo incorreta, sistema autônomo a chamada convenção e o conjunto de caractere de.Se estiver disponível, geralmente é mais simples e menos propensa chamar o método equivalente gerenciado que definem e chamar o método não-gerenciado diretamente.Chamando um invocação de plataforma método também pode levar a problemas de segurança adicionais que precisam ser tratados.

Como corrigir violações

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

Quando suprimir avisos

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

Exemplo

O exemplo a seguir mostra a plataforma chama definição do método que viola a regra.Além disso, as chamadas para invocação de plataforma 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

telefonar GetLastError imediatamente após P/Invoke

Mover P/Invokes para classe NativeMethods

Pontos de entrada de P/Invoke devem existir

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

Especifique o marshaling para argumentos de seqüência de caracteres de P/Invoke