CA2205: Use o gerenciado equivalentes 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 um método com a funcionalidade equivalente existe na .NET Framework biblioteca de classe.
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 em tempo de execução devido problemas como, por exemplo, uma função equivocado defeituoso 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. Uma plataforma de chamar o método invoke também podem levar a problemas de segurança adicionais que precisam ser abordados.
Como corrigir violações
Para corrigir uma violação desta regra, substitua a chamada para a função não gerenciada com uma chamada para seu equivalente gerenciado.
Quando suprimir avisos
Suprimir um aviso da 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 de 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 NativeMethods classe
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.