警告 CA1417:P/Invoke 用の文字列パラメーターの OutAttribute

.NET コード アナライザー ルール CA1417 は、.NET 5 以降では既定で有効になっています。 String パラメーターが値渡しされ、OutAttribute でマークされるプラットフォーム呼び出し (P/Invoke) メソッド定義に対して、ビルド警告が生成されます。

変更内容

.NET 5 以降、.NET SDK には .NET ソース コード アナライザーが含まれています。 これらのルールのいくつかは、CA1417 を含め、既定で有効になっています。 このルールに違反し、警告をエラーとして扱うように構成されているコードがプロジェクトに含まれている場合、この変更によってビルドが破損する可能性があります。

String パラメーターが OutAttribute 属性でマークされ、値渡しされる P/Invoke メソッド定義には、ルール CA1417 によってフラグが立てられます。 次に例を示します。

[DllImport("MyLibrary")]
private static extern void PIMethod([Out] string s);

.NET ランタイムでは、インターン プールと呼ばれるテーブルが保持されます。これには、プログラム内の各一意のリテラル文字列への単一の参照が含まれています。 OutAttribute でマークされたインターン文字列が P/Invoke メソッドに値渡しされる場合、ランタイムが不安定になる可能性があります。 文字列インターンの詳細については、String.Intern(String) に関する注釈を参照してください。

導入されたバージョン

5.0

  • 変更された文字列データを呼び出し元にマーシャリングする必要がある場合は、代わりに文字列を参照渡しにします。

    [DllImport("MyLibrary")]
    private static extern void PIMethod(out string s);
    
  • 変更した文字列データを呼び出し元にマーシャリングする必要がない場合は、OutAttribute を削除するだけです。

    [DllImport("MyLibrary")]
    private static extern void PIMethod(string s);
    

    詳細については、CA1417 を参照してください。

  • コード分析を完全に無効にするには、プロジェクト ファイルで EnableNETAnalyzersfalse に設定します。 詳細については、「EnableNETAnalyzers」を参照してください。

影響を受ける API

API 分析では検出できません。