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