CA1421:应用 DisableRuntimeMarshallingAttribute 时,方法使用运行时封送

属性
规则 ID 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 属性。