diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs index dd861df2f2d531..3f126b71224747 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs @@ -212,8 +212,12 @@ private static void AssertPrimitiveType(Target.FieldInfo field, string fieldN [Conditional("DEBUG")] private static void AssertPointerType(Target.FieldInfo field, string fieldName) { + // Managed field signatures report IntPtr/UIntPtr as native ints, which the contract descriptor maps to + // "nint"/"nuint" (as distinct from raw pointer element types which map to "pointer"). + // Accept those in addition to "pointer" so pointer-valued fields on managed types can be + // read via ReadPointer, which reads the value unsigned at full pointer width. Debug.Assert( - field.TypeName is null or "" or "pointer", + field.TypeName is null or "" or "pointer" or "nint" or "nuint", $"Type mismatch reading field '{fieldName}': declared as '{field.TypeName}', expected pointer"); } diff --git a/src/native/managed/cdac/tests/UnitTests/ObjectiveCMarshalTests.cs b/src/native/managed/cdac/tests/UnitTests/ObjectiveCMarshalTests.cs index 47c8a826a3eecd..5b73dc2e2a3330 100644 --- a/src/native/managed/cdac/tests/UnitTests/ObjectiveCMarshalTests.cs +++ b/src/native/managed/cdac/tests/UnitTests/ObjectiveCMarshalTests.cs @@ -71,12 +71,14 @@ private static TestPlaceholderTarget CreateObjectiveCMarshalTargetWithCWT( }; // Register ObjcTrackingInformation type with a single pointer-sized _memory field at offset 0. + // The managed _memory field is an IntPtr, so the contract descriptor reports its type as "nint"; + // model that here so the pointer read path is validated against the real descriptor type. var trackingInfoType = new Target.TypeInfo { Size = (uint)helpers.PointerSize, Fields = new Dictionary { - ["_memory"] = new Target.FieldInfo { Offset = 0 } + ["_memory"] = new Target.FieldInfo { Offset = 0, TypeName = "nint" } } };