Поделиться через


CA1421: метод использует маршаллирование среды выполнения при применении DisableRuntimeMarshallingAttribute

Свойство Значение
Идентификатор правила CA1421
Заголовок Метод использует маршаллирование среды выполнения при применении DisableRuntimeMarshallingAttribute
Категория Совместимость
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Метод использует маршаллирование среды выполнения, а маршаллирование среды выполнения явно отключено.

Описание правила

Если метод использует маршаллирование среды выполнения при отключении маршалинг среды выполнения, он может вызвать непредвиденные различия в поведении во время выполнения из-за различных ожиданий собственного макета типа.

Устранение нарушений

Включите маршаллирование среды выполнения или используйте такие функции, как sizeof и указатели, чтобы обеспечить точные результаты.

Когда лучше отключить предупреждения

Не подавляйте предупреждение из этого правила.

Пример

В следующем фрагменте кода показано нарушение 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

Чтобы устранить нарушение, удалите DisableRuntimeMarshallingAttribute атрибут в сборке.