CA1421: Method uses runtime marshalling when DisableRuntimeMarshallingAttribute is applied
Property | Value |
---|---|
Rule ID | CA1421 |
Title | Method uses runtime marshalling when DisableRuntimeMarshallingAttribute is applied |
Category | Interoperability |
Fix is breaking or non-breaking | Non-breaking |
Enabled by default in .NET 9 | As suggestion |
Cause
A method uses runtime marshalling, and runtime marshalling is explicitly disabled.
Rule description
If a method uses runtime marshalling when runtime marshalling is disabled, it can cause unexpected behavior differences at run time due to different expectations of a type's native layout.
How to fix violations
Enable runtime marshalling or use features like sizeof
and pointers to ensure accurate results.
When to suppress warnings
Don't suppress a warning from this rule.
Example
The following code snippet shows a violation of 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
To fix the violation, remove the DisableRuntimeMarshallingAttribute attribute on the assembly.
Tee yhteistyötä kanssamme GitHubissa
Tämän sisällön lähde on GitHubissa, jossa voit myös luoda ja tarkastella ongelmia ja pull-pyyntöjä. Katso lisätietoja osallistujan oppaasta.