Dela via


CA1421: Metoden använder runtime-marshalling när DisableRuntimeMarshallingAttribute tillämpas

Property Värde
Regel-ID CA1421
Title Metoden använder runtime marshalling när DisableRuntimeMarshallingAttribute tillämpas
Kategori Samverkan
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 9 Som förslag

Orsak

En metod använder runtime-marshalling och runtime-marshalling är uttryckligen inaktiverad.

Regelbeskrivning

Om en metod använder runtime-marshalling när runtime-marshalling inaktiveras kan det orsaka oväntade beteendeskillnader vid körning på grund av olika förväntningar på en typs interna layout.

Så här åtgärdar du överträdelser

Aktivera runtime-marshalling eller använd funktioner som sizeof och pekare för att säkerställa korrekta resultat.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln.

Exempel

Följande kodfragment visar ett brott mot 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

Åtgärda överträdelsen genom att DisableRuntimeMarshallingAttribute ta bort attributet för sammansättningen.