diff --git a/src/native/managed/cdac/Directory.Build.props b/src/native/managed/cdac/Directory.Build.props
index b8fb4646ebd854..52c3827b9fe205 100644
--- a/src/native/managed/cdac/Directory.Build.props
+++ b/src/native/managed/cdac/Directory.Build.props
@@ -3,11 +3,21 @@
false
- false
- true
+
+ $(NetCoreAppToolCurrent);net10.0;net9.0;net8.0
-
+
+
<_Parameter1>NETCDAC0001
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Microsoft.Diagnostics.DataContractReader.Abstractions.csproj b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Microsoft.Diagnostics.DataContractReader.Abstractions.csproj
index efb88ae68f76a2..90e2ca650acbe8 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Microsoft.Diagnostics.DataContractReader.Abstractions.csproj
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Microsoft.Diagnostics.DataContractReader.Abstractions.csproj
@@ -1,7 +1,7 @@
- $(NetCoreAppToolCurrent)
+ $(CdacPackageTargetFrameworks)
Microsoft.Diagnostics.DataContractReader
enable
true
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/Context/X86/X86Unwinder.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/Context/X86/X86Unwinder.cs
index e7a4c4505ca95d..9aae49fdf49c48 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/Context/X86/X86Unwinder.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/Context/X86/X86Unwinder.cs
@@ -3,7 +3,6 @@
using System;
using System.Diagnostics;
-using System.Linq;
using Microsoft.Diagnostics.DataContractReader.Contracts.Extensions;
using static Microsoft.Diagnostics.DataContractReader.Contracts.StackWalkHelpers.X86Context;
@@ -487,8 +486,9 @@ private bool UnwindEbpDoubleAlignFrame(
if (gcInfo.Header.DoubleAlign && (curEbp & 0x04) != 0)
pSavedRegs -= _pointerSize;
- foreach (RegMask regMask in registerOrder.Reverse())
+ for (int i = registerOrder.Length - 1; i >= 0; i--)
{
+ RegMask regMask = registerOrder[i];
if (regMask == RegMask.EBP) continue;
if (!gcInfo.SavedRegsMask.HasFlag(regMask)) continue;
@@ -570,8 +570,9 @@ we need to know our exact location to determine the callee-saved registers */
/* Increment "offset" in steps to see which callee-saved
registers have been pushed already */
- foreach (RegMask regMask in registerOrder.Reverse())
+ for (int i = registerOrder.Length - 1; i >= 0; i--)
{
+ RegMask regMask = registerOrder[i];
if (regMask == RegMask.EBP) continue;
if (!gcInfo.SavedRegsMask.HasFlag(regMask)) continue;
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Microsoft.Diagnostics.DataContractReader.Contracts.csproj b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Microsoft.Diagnostics.DataContractReader.Contracts.csproj
index bf80c13bbf6212..331df3e011f567 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Microsoft.Diagnostics.DataContractReader.Contracts.csproj
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Microsoft.Diagnostics.DataContractReader.Contracts.csproj
@@ -1,7 +1,7 @@
- $(NetCoreAppToolCurrent)
+ $(CdacPackageTargetFrameworks)
Microsoft.Diagnostics.DataContractReader
enable
true
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs
index 8fc9d53e7df765..eaadc3eb6a73b2 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs
@@ -91,7 +91,9 @@ CustomQueryInterfaceResult ICustomQueryInterface.GetInterface(ref Guid iid, out
try
{
Guid iidMetaDataImport = typeof(IMetaDataImport).GUID;
- if (_legacyModulePointer != 0 && Marshal.QueryInterface(_legacyModulePointer, iidMetaDataImport, out nint ppMdi) >= 0)
+#pragma warning disable CS9191 // 'ref' is equivalent to 'in' for net9+; net8 requires 'ref'
+ if (_legacyModulePointer != 0 && Marshal.QueryInterface(_legacyModulePointer, ref iidMetaDataImport, out nint ppMdi) >= 0)
+#pragma warning restore CS9191
{
legacyImport = ComInterfaceMarshaller.ConvertToManaged((void*)ppMdi);
Marshal.Release(ppMdi);
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs
index 06c887b7ffd89b..c61df788c17371 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs
@@ -758,7 +758,7 @@ public unsafe partial interface ISOSDacInterface
// Frames
[PreserveSig]
- int GetFrameName(ClrDataAddress vtable, uint count, char* frameName, uint* pNeeded);
+ int GetFrameName(ClrDataAddress vtableAddr, uint count, char* frameName, uint* pNeeded);
// PEFiles
[PreserveSig]
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Microsoft.Diagnostics.DataContractReader.Legacy.csproj b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Microsoft.Diagnostics.DataContractReader.Legacy.csproj
index 3424ce84e341c6..835e3f78ff8ce0 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Microsoft.Diagnostics.DataContractReader.Legacy.csproj
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Microsoft.Diagnostics.DataContractReader.Legacy.csproj
@@ -1,7 +1,7 @@
- $(NetCoreAppToolCurrent)
+ $(CdacPackageTargetFrameworks)
Microsoft.Diagnostics.DataContractReader.Legacy
enable
true
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs
index 2007bb81728a1e..ef5e487d9a53cf 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs
@@ -1199,15 +1199,15 @@ int ISOSDacInterface.GetFieldDescData(ClrDataAddress fieldDesc, DacpFieldDescDat
return hr;
}
- int ISOSDacInterface.GetFrameName(ClrDataAddress vtable, uint count, char* frameName, uint* pNeeded)
+ int ISOSDacInterface.GetFrameName(ClrDataAddress vtableAddr, uint count, char* frameName, uint* pNeeded)
{
int hr = HResults.S_OK;
try
{
- if (vtable == 0)
+ if (vtableAddr == 0)
throw new ArgumentException();
IStackWalk stackWalk = _target.Contracts.StackWalk;
- string name = stackWalk.GetFrameName(new(vtable));
+ string name = stackWalk.GetFrameName(new(vtableAddr));
if (string.IsNullOrEmpty(name))
throw new ArgumentException();
@@ -1234,7 +1234,7 @@ int ISOSDacInterface.GetFrameName(ClrDataAddress vtable, uint count, char* frame
int hrLocal;
fixed (char* ptr = nameLocal)
{
- hrLocal = _legacyImpl.GetFrameName(vtable, count, ptr, &neededLocal);
+ hrLocal = _legacyImpl.GetFrameName(vtableAddr, count, ptr, &neededLocal);
}
Debug.ValidateHResult(hr, hrLocal);
if (hr == HResults.S_OK)
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/Microsoft.Diagnostics.DataContractReader.csproj b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/Microsoft.Diagnostics.DataContractReader.csproj
index 57a380547b7ae3..82cd4e86bf3694 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/Microsoft.Diagnostics.DataContractReader.csproj
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/Microsoft.Diagnostics.DataContractReader.csproj
@@ -1,7 +1,7 @@
- $(NetCoreAppToolCurrent)
+ $(CdacPackageTargetFrameworks)
Microsoft.Diagnostics.DataContractReader
enable
true
diff --git a/src/native/managed/cdac/gen/Emitter.cs b/src/native/managed/cdac/gen/Emitter.cs
index 162d75d2ddcce4..db2994b7e4a434 100644
--- a/src/native/managed/cdac/gen/Emitter.cs
+++ b/src/native/managed/cdac/gen/Emitter.cs
@@ -262,7 +262,7 @@ private static string ReadExpression(MemberModel member, string baseVar, string
};
private static string NameArgs(MemberModel member)
- => string.Join(", ", Enumerate(member.Names).Select(n => $"\"{n}\""));
+ => "[" + string.Join(", ", Enumerate(member.Names).Select(n => $"\"{n}\"")) + "]";
private static IEnumerable Enumerate(EquatableArray array)
{
diff --git a/src/native/managed/cdac/gen/LayoutSetSource.cs b/src/native/managed/cdac/gen/LayoutSetSource.cs
index d7e7ac962a1997..4d5d450881a01f 100644
--- a/src/native/managed/cdac/gen/LayoutSetSource.cs
+++ b/src/native/managed/cdac/gen/LayoutSetSource.cs
@@ -55,7 +55,7 @@ public ulong InstanceSize
}
}
- public bool TrySelect(TargetPointer address, out Target.TypeInfo type, out TargetPointer baseAddr, out string name, params ReadOnlySpan names)
+ public bool TrySelect(TargetPointer address, out Target.TypeInfo type, out TargetPointer baseAddr, out string name, ReadOnlySpan names)
{
foreach (LazyLayout layout in _layouts)
{
@@ -73,7 +73,7 @@ public bool TrySelect(TargetPointer address, out Target.TypeInfo type, out Targe
return false;
}
- public void Select(TargetPointer address, out Target.TypeInfo type, out TargetPointer baseAddr, out string name, params ReadOnlySpan names)
+ public void Select(TargetPointer address, out Target.TypeInfo type, out TargetPointer baseAddr, out string name, ReadOnlySpan names)
{
if (!TrySelect(address, out type, out baseAddr, out name, names))
{
diff --git a/src/native/managed/cdac/tests/TestInfrastructure/DumpInfo.cs b/src/native/managed/cdac/tests/TestInfrastructure/DumpInfo.cs
index baf791c5677936..ac47ca5652cd6d 100644
--- a/src/native/managed/cdac/tests/TestInfrastructure/DumpInfo.cs
+++ b/src/native/managed/cdac/tests/TestInfrastructure/DumpInfo.cs
@@ -95,8 +95,10 @@ public static DumpInfo ForCurrentMachine()
System.Runtime.InteropServices.Architecture.X86 => "x86",
System.Runtime.InteropServices.Architecture.Arm64 => "arm64",
System.Runtime.InteropServices.Architecture.Arm => "arm",
+#if NET9_0_OR_GREATER
System.Runtime.InteropServices.Architecture.RiscV64 => "riscv64",
System.Runtime.InteropServices.Architecture.LoongArch64 => "loongarch64",
+#endif
_ => "unknown",
};
diff --git a/src/native/managed/cdac/tests/TestInfrastructure/Microsoft.Diagnostics.DataContractReader.TestInfrastructure.csproj b/src/native/managed/cdac/tests/TestInfrastructure/Microsoft.Diagnostics.DataContractReader.TestInfrastructure.csproj
index 69fbd92b07c39d..f0df3e5ad651a4 100644
--- a/src/native/managed/cdac/tests/TestInfrastructure/Microsoft.Diagnostics.DataContractReader.TestInfrastructure.csproj
+++ b/src/native/managed/cdac/tests/TestInfrastructure/Microsoft.Diagnostics.DataContractReader.TestInfrastructure.csproj
@@ -1,7 +1,7 @@
- $(NetCoreAppToolCurrent)
+ $(CdacPackageTargetFrameworks)
Microsoft.Diagnostics.DataContractReader
enable
true
diff --git a/src/native/managed/cdac/tests/UnitTests/MetaDataImportImplTests.cs b/src/native/managed/cdac/tests/UnitTests/MetaDataImportImplTests.cs
index c951d6b7e4b84e..3f204363eb3f05 100644
--- a/src/native/managed/cdac/tests/UnitTests/MetaDataImportImplTests.cs
+++ b/src/native/managed/cdac/tests/UnitTests/MetaDataImportImplTests.cs
@@ -983,7 +983,9 @@ public void QueryInterfaceForIMetaDataImport_ReturnsIMetaDataImport2VtableWithEx
{
// Simulate ClrMD: QI for IMetaDataImport
Guid iidImport = typeof(IMetaDataImport).GUID;
- int hr = Marshal.QueryInterface(pUnk, in iidImport, out nint pImport);
+#pragma warning disable CS9191 // 'ref' is equivalent to 'in' for net9+; net8 requires 'ref'
+ int hr = Marshal.QueryInterface(pUnk, ref iidImport, out nint pImport);
+#pragma warning restore CS9191
Assert.Equal(0, hr);
Assert.NotEqual(nint.Zero, pImport);
@@ -994,7 +996,9 @@ public void QueryInterfaceForIMetaDataImport_ReturnsIMetaDataImport2VtableWithEx
// redirect, this would return the shorter IMetaDataImport vtable (65 slots) and accessing
// slot 65 (EnumGenericParams) would AV.
Guid iidImportAgain = typeof(IMetaDataImport).GUID;
- hr = Marshal.QueryInterface(pImport, in iidImportAgain, out nint pImportAgain);
+#pragma warning disable CS9191 // 'ref' is equivalent to 'in' for net9+; net8 requires 'ref'
+ hr = Marshal.QueryInterface(pImport, ref iidImportAgain, out nint pImportAgain);
+#pragma warning restore CS9191
Assert.Equal(0, hr);
Assert.NotEqual(nint.Zero, pImportAgain);
@@ -1003,7 +1007,9 @@ public void QueryInterfaceForIMetaDataImport_ReturnsIMetaDataImport2VtableWithEx
// Verify the returned pointer has IMetaDataImport2 slots accessible.
// QI the result for IMetaDataImport2 to verify COM identity is correct.
Guid iidImport2 = typeof(IMetaDataImport2).GUID;
- hr = Marshal.QueryInterface(pImportAgain, in iidImport2, out nint pImport2);
+#pragma warning disable CS9191 // 'ref' is equivalent to 'in' for net9+; net8 requires 'ref'
+ hr = Marshal.QueryInterface(pImportAgain, ref iidImport2, out nint pImport2);
+#pragma warning restore CS9191
Assert.Equal(0, hr);
Assert.NotEqual(nint.Zero, pImport2);
Marshal.Release(pImport2);
diff --git a/src/native/managed/cdac/tests/UnitTests/Microsoft.Diagnostics.DataContractReader.Tests.csproj b/src/native/managed/cdac/tests/UnitTests/Microsoft.Diagnostics.DataContractReader.Tests.csproj
index 32fe6fa499a95a..7c2dab88bccd78 100644
--- a/src/native/managed/cdac/tests/UnitTests/Microsoft.Diagnostics.DataContractReader.Tests.csproj
+++ b/src/native/managed/cdac/tests/UnitTests/Microsoft.Diagnostics.DataContractReader.Tests.csproj
@@ -1,14 +1,24 @@
true
- $(NetCoreAppToolCurrent)
+ $(CdacPackageTargetFrameworks)
false
-
+
+
+
+