Share via


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

Item [値]
規則 ID CA2205
カテゴリ Microsoft.Usage
互換性に影響する変更点 なし

原因

プラットフォーム呼び出しメソッドが定義されており、同等の機能を持つメソッドが .NET に存在します。

規則の説明

プラットフォーム呼び出しメソッドは、アンマネージド DLL 関数を呼び出すために使用され、System.Runtime.InteropServices.DllImportAttribute 属性または Visual Basic の Declare キーワードを使用して定義されます。 プラットフォーム呼び出しメソッドが正しく定義されていないと、関数の名前の誤り、パラメーターと戻り値のデータ型のマッピングの誤り、呼び出し規則や文字セットなどのフィールド指定の誤りなどの問題が原因で、実行時例外が発生する可能性があります。 可能な場合は、アンマネージド メソッドを定義して直接呼び出すよりも、同等のマネージド メソッドを呼び出す方がより簡単でエラーが発生しにくくなります。 プラットフォーム呼び出しメソッドを呼び出すと、対処する必要がある追加のセキュリティ問題が発生する可能性もあります。

違反の修正方法

この規則の違反を修正するには、アンマネージド関数の呼び出しを、それと同等のマネージド関数の呼び出しに置き換えてください。

どのようなときに警告を抑制するか

提案された置換方法によっても必要な機能が得られない場合は、この規則による警告を表示しないようにしてください。

次の例は、規則に違反するプラットフォーム呼び出しメソッドを示しています。 さらに、プラットフォーム呼び出しメソッドと同等のマネージド メソッドの呼び出しを示しています。

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);
      }
   }
}