CA2205: Win32 API に相当するマネージ API を使用します
TypeName |
UseManagedEquivalentsOfWin32Api |
CheckId |
CA2205 |
[カテゴリ] |
Microsoft.Usage |
互換性に影響する変更点 |
なし |
原因
プラットフォーム呼び出しメソッドが定義されましたが、同等の機能を持つメソッドが .NET Framework クラス ライブラリに存在します。
規則の説明
プラットフォーム呼び出しメソッドは、アンマネージ DLL 関数を呼び出すときに使用されます。また、System.Runtime.InteropServices.DllImportAttribute 属性 (Visual Basic では Declare キーワード) を使用して定義されます。プラットフォーム呼び出しメソッドの定義を誤ると、実行時に例外が発生することがあります。原因は、関数名の誤り、パラメーターと戻り値のデータ型のマッピング エラー、呼び出し規約や文字セットのようなフィールド仕様の誤りなどです。一般に、可能であれば同等のマネージ メソッドを呼び出す方が、アンマネージ メソッドの定義と呼び出しを直接行うよりも、簡単でミスも少なくなります。また、プラットフォーム呼び出しメソッドは、その他のセキュリティ問題の原因にもなり、そのための対処が必要です。
違反の修正方法
この規則違反を修正するには、アンマネージ関数の呼び出しを同等のマネージ関数の呼び出しに置換します。
警告を抑制する状況
置換できる機能を持つマネージ関数がない場合は、この規則による警告を抑制します。
使用例
この規則に違反するプラットフォーム呼び出しメソッドの定義を次の例に示します。また、このプラットフォーム呼び出しメソッドと同等の機能を持つマネージ メソッドも含まれます。
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);
}
}
}
関連規則
CA1404: P/Invoke の直後に GetLastError を呼び出します
CA1060: P/Invoke を NativeMethods クラスに移動します