Freigeben über


CA1421: Methode verwendet Laufzeit-Marshalling, wenn „DisableRuntimeMarshallingAttribute“ angewendet wird

Eigenschaft Wert
Regel-ID CA1421
Titel Methode verwendet Runtimemarshalling, wenn „DisableRuntimeMarshallingAttribute“ angewendet wird
Kategorie Interoperabilität
Fix führt zu Unterbrechungen oder bleibt funktionsfähig Untrennbar
Standardmäßig in .NET 10 aktiviert Als Vorschlag
Anwendbare Sprachen C# und Visual Basic

Ursache

Eine Methode verwendet das Runtimemarshalling, und das Runtimemarshalling ist explizit deaktiviert.

Regelbeschreibung

Wenn eine Methode Laufzeit-Marshalling verwendet, wenn die Laufzeit-Marshalling deaktiviert ist, kann dies zu unerwarteten Verhaltensunterschieden zur Laufzeit führen, da unterschiedliche Erwartungen an das systemeigene Layout eines Typs bestehen.

So beheben Sie Verstöße

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

Um den Verstoß zu beheben, entfernen Sie das DisableRuntimeMarshallingAttribute-Attribut in der Assembly.