CA1421: Methode verwendet Runtimemarshalling, wenn „DisableRuntimeMarshallingAttribute“ angewendet wird

Eigenschaft Wert
Regel-ID CA1421
Titel Methode verwendet Runtimemarshalling, wenn „DisableRuntimeMarshallingAttribute“ angewendet wird
Kategorie Interoperabilität
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Als Vorschlag

Ursache

Eine Methode verwendet das Runtimemarshalling, obwohl dieses explizit deaktiviert ist.

Regelbeschreibung

Wenn eine Methode Runtimemarshalling auch dann verwendet, wenn das Runtimemarshalling deaktiviert ist, kann dies aufgrund unterschiedlicher Erwartungen an das native Layout eines Typs zu unerwarteten Verhaltensunterschieden zur Runtime führen.

Behandeln von Verstößen

Aktivieren Sie das Runtimemarshalling, oder verwenden Sie Features wie sizeof und Zeiger, um genaue Ergebnisse sicherzustellen.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie Warnungen dieser Regel nicht.

Beispiel

Der folgende Codeschnipsel zeigt eine Verletzung von CA1421:

using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: DisableRuntimeMarshalling]

class C
{
    public void Test()
    {
        nint offset = Marshal.OffsetOf(typeof(ValueType), "field");
    }
}

struct ValueType
{
    int field;
}

Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices

<Assembly: DisableRuntimeMarshalling>

Class C
    Shared Sub S1()
        Dim offset As IntPtr = Marshal.OffsetOf(GetType(ValueType), "field")
    End Sub
End Class

Structure ValueType
    Dim field As Integer
End Structure

Entfernen Sie das DisableRuntimeMarshallingAttribute-Attribut in der Assembly, um die Verletzung zu beheben.