次の方法で共有


CA2205: Win32 API に相当するマネージ API を使用します

TypeName

UseManagedEquivalentsOfWin32Api

CheckId

CA2205

分類

Microsoft.Usage

互換性に影響する変更点

なし

原因

プラットフォーム呼び出しメソッドが定義されましたが、同等の機能を持つメソッドが .NET Framework クラス ライブラリに存在します。

規則の説明

プラットフォーム呼び出しメソッドは、アンマネージ DLL 関数を呼び出すときに使用されます。また、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 クラスに移動します

CA1400: P/Invoke エントリ ポイントは存在しなければなりません

CA1401: P/Invoke は参照可能になりません

CA2101: P/Invoke 文字列引数に対してマーシャリングを指定します