diff --git a/eng/Subsets.props b/eng/Subsets.props
index 8ffcda01855039..37452b53a69b50 100644
--- a/eng/Subsets.props
+++ b/eng/Subsets.props
@@ -509,6 +509,7 @@
     
     
   
 
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.cs
index 85f4f954404536..80723c030051b4 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.cs
@@ -14,80 +14,82 @@ public abstract class ContractRegistry
     /// 
     /// Gets an instance of the Exception contract for the target.
     /// 
-    public abstract IException Exception { get; }
+    public virtual IException Exception => GetContract();
     /// 
     /// Gets an instance of the Loader contract for the target.
     /// 
-    public abstract ILoader Loader { get; }
+    public virtual ILoader Loader => GetContract();
     /// 
     /// Gets an instance of the EcmaMetadata contract for the target.
     /// 
-    public abstract IEcmaMetadata EcmaMetadata { get; }
+    public virtual IEcmaMetadata EcmaMetadata => GetContract();
     /// 
     /// Gets an instance of the Object contract for the target.
     /// 
-    public abstract IObject Object { get; }
+    public virtual IObject Object => GetContract();
     /// 
     /// Gets an instance of the Thread contract for the target.
     /// 
-    public abstract IThread Thread { get; }
+    public virtual IThread Thread => GetContract();
     /// 
     /// Gets an instance of the RuntimeTypeSystem contract for the target.
     /// 
-    public abstract IRuntimeTypeSystem RuntimeTypeSystem { get; }
+    public virtual IRuntimeTypeSystem RuntimeTypeSystem => GetContract();
     /// 
     /// Gets an instance of the DacStreams contract for the target.
     /// 
-    public abstract IDacStreams DacStreams { get; }
+    public virtual IDacStreams DacStreams => GetContract();
     /// 
     /// Gets an instance of the ExecutionManager contract for the target.
     /// 
-    public abstract IExecutionManager ExecutionManager { get; }
+    public virtual IExecutionManager ExecutionManager => GetContract();
     /// 
     /// Gets an instance of the CodeVersions contract for the target.
     /// 
-    public abstract ICodeVersions CodeVersions { get; }
+    public virtual ICodeVersions CodeVersions => GetContract();
     /// 
     /// Gets an instance of the PlatformMetadata contract for the target.
     /// 
-    public abstract IPlatformMetadata PlatformMetadata { get; }
+    public virtual IPlatformMetadata PlatformMetadata => GetContract();
     /// 
     /// Gets an instance of the PrecodeStubs contract for the target.
     /// 
-    public abstract IPrecodeStubs PrecodeStubs { get; }
+    public virtual IPrecodeStubs PrecodeStubs => GetContract();
     /// 
     /// Gets an instance of the ReJIT contract for the target.
     /// 
-    public abstract IReJIT ReJIT { get; }
+    public virtual IReJIT ReJIT => GetContract();
     /// 
     /// Gets an instance of the StackWalk contract for the target.
     /// 
-    public abstract IStackWalk StackWalk { get; }
+    public virtual IStackWalk StackWalk => GetContract();
     /// 
     /// Gets an instance of the RuntimeInfo contract for the target.
     /// 
-    public abstract IRuntimeInfo RuntimeInfo { get; }
+    public virtual IRuntimeInfo RuntimeInfo => GetContract();
     /// 
     /// Gets an instance of the ComWrappers contract for the target.
     /// 
-    public abstract IComWrappers ComWrappers { get; }
+    public virtual IComWrappers ComWrappers => GetContract();
     /// Gets an instance of the DebugInfo contract for the target.
     /// 
-    public abstract IDebugInfo DebugInfo { get; }
+    public virtual IDebugInfo DebugInfo => GetContract();
     /// 
     /// Gets an instance of the SHash contract for the target.
     /// 
-    public abstract ISHash SHash { get; }
+    public virtual ISHash SHash => GetContract();
     /// 
     /// Gets an instance of the GC contract for the target.
     /// 
-    public abstract IGC GC { get; }
+    public virtual IGC GC => GetContract();
     /// 
     /// Gets an instance of the Notifications contract for the target.
     /// 
-    public abstract INotifications Notifications { get; }
+    public virtual INotifications Notifications => GetContract();
     /// 
     /// Gets an instance of the SignatureDecoder contract for the target.
     /// 
-    public abstract ISignatureDecoder SignatureDecoder { get; }
+    public virtual ISignatureDecoder SignatureDecoder => GetContract();
+
+    public abstract TContract GetContract() where TContract : IContract;
 }
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/IContractFactory.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/IContractFactory.cs
index ca19d7ed3d05fb..2973c86784f554 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/IContractFactory.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/IContractFactory.cs
@@ -8,4 +8,5 @@ namespace Microsoft.Diagnostics.DataContractReader;
 public interface IContractFactory where TContract : Contracts.IContract
 {
     TContract CreateContract(Target target, int version);
+    Type ContractType => typeof(TContract);
 }
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataAddress.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAddress.cs
similarity index 92%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataAddress.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAddress.cs
index 4ad6a9186a9803..9d9055fe20c555 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataAddress.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAddress.cs
@@ -12,7 +12,7 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 /// When marshalled to native code, this type is represented as a 64-bit unsigned integer.
 /// 
 [NativeMarshalling(typeof(ClrDataAddressMarshaller))]
-internal struct ClrDataAddress : IEquatable
+public struct ClrDataAddress : IEquatable
 {
     public ulong Value;
 
@@ -29,7 +29,7 @@ internal struct ClrDataAddress : IEquatable
 }
 
 [CustomMarshaller(typeof(ClrDataAddress), MarshalMode.Default, typeof(ClrDataAddressMarshaller))]
-internal static class ClrDataAddressMarshaller
+public static class ClrDataAddressMarshaller
 {
     public static ClrDataAddress ConvertToManaged(ulong address) => new ClrDataAddress(address);
     public static ulong ConvertToUnmanaged(ClrDataAddress address) => address.Value;
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataFrame.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs
similarity index 99%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataFrame.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs
index d174d416034642..a47ab74739da47 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataFrame.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs
@@ -12,7 +12,7 @@
 namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 
 [GeneratedComClass]
-internal sealed unsafe partial class ClrDataFrame : IXCLRDataFrame, IXCLRDataFrame2
+public sealed unsafe partial class ClrDataFrame : IXCLRDataFrame, IXCLRDataFrame2
 {
     private readonly Target _target;
     private readonly IXCLRDataFrame? _legacyImpl;
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataMethodInstance.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.cs
similarity index 99%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataMethodInstance.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.cs
index ad2930e770093a..4e24967f6226e4 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataMethodInstance.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.cs
@@ -15,7 +15,7 @@
 namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 
 [GeneratedComClass]
-internal sealed unsafe partial class ClrDataMethodInstance : IXCLRDataMethodInstance
+public sealed unsafe partial class ClrDataMethodInstance : IXCLRDataMethodInstance
 {
     private readonly Target _target;
     private readonly MethodDescHandle _methodDesc;
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataModule.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs
similarity index 99%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataModule.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs
index c38cba1b3e023c..f8f08dc5c3e762 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataModule.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 
 using System;
@@ -11,7 +11,7 @@
 namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 
 [GeneratedComClass]
-internal sealed unsafe partial class ClrDataModule : ICustomQueryInterface, IXCLRDataModule, IXCLRDataModule2
+public sealed unsafe partial class ClrDataModule : ICustomQueryInterface, IXCLRDataModule, IXCLRDataModule2
 {
     private readonly TargetPointer _address;
     private readonly Target _target;
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataStackWalk.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.cs
similarity index 97%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataStackWalk.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.cs
index 0448ec77295953..b2e29676afea0a 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataStackWalk.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 
 using System;
@@ -12,7 +12,7 @@
 namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 
 [GeneratedComClass]
-internal sealed unsafe partial class ClrDataStackWalk : IXCLRDataStackWalk
+public sealed unsafe partial class ClrDataStackWalk : IXCLRDataStackWalk
 {
     private readonly TargetPointer _threadAddr;
     private readonly uint _flags;
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataTask.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs
similarity index 95%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataTask.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs
index 3c189701e57fd5..64b70646e5f675 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ClrDataTask.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs
@@ -1,13 +1,14 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 
 using System;
 using System.Runtime.InteropServices.Marshalling;
+using Microsoft.Diagnostics.DataContractReader.Contracts;
 
 namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 
 [GeneratedComClass]
-internal sealed unsafe partial class ClrDataTask : IXCLRDataTask
+public sealed unsafe partial class ClrDataTask : IXCLRDataTask
 {
     private readonly TargetPointer _address;
     private readonly Target _target;
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ConversionExtensions.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ConversionExtensions.cs
similarity index 96%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/ConversionExtensions.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ConversionExtensions.cs
index 63d1a7354991dc..c95e0188e92cd1 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ConversionExtensions.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ConversionExtensions.cs
@@ -7,7 +7,7 @@
 
 namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 
-internal static class ConversionExtensions
+public static class ConversionExtensions
 {
     private const uint Arm32ThumbBit = 1;
 
@@ -86,7 +86,7 @@ public static TargetCodePointer ToTargetCodePointer(this ClrDataAddress address,
     /// 
     /// Converts a TargetCodePointer to an address TargetPointer, removing any platform-specific bits such as the ARM32 Thumb bit or ARM64 pointer authentication.
     /// 
-    internal static TargetPointer ToAddress(this TargetCodePointer code, Target target)
+    public static TargetPointer ToAddress(this TargetCodePointer code, Target target)
     {
         IPlatformMetadata metadata = target.Contracts.PlatformMetadata;
         CodePointerFlags flags = metadata.GetCodePointerFlags();
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/HeaderReaderHelpers.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/HeaderReaderHelpers.cs
similarity index 100%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/HeaderReaderHelpers.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/HeaderReaderHelpers.cs
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ICLRData.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ICLRData.cs
similarity index 92%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/ICLRData.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ICLRData.cs
index 56748a4f08f89d..eb7fa9918af177 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ICLRData.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ICLRData.cs
@@ -12,7 +12,7 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 
 [GeneratedComInterface]
 [Guid("471c35b4-7c2f-4ef0-a945-00f8c38056f1")]
-internal unsafe partial interface ICLRDataEnumMemoryRegions
+public unsafe partial interface ICLRDataEnumMemoryRegions
 {
     [PreserveSig]
     int EnumMemoryRegions(/*ICLRDataEnumMemoryRegionsCallback*/ void* callback, uint miniDumpFlags, /*CLRDataEnumMemoryFlags*/ int clrFlags);
@@ -20,7 +20,7 @@ internal unsafe partial interface ICLRDataEnumMemoryRegions
 
 [GeneratedComInterface]
 [Guid("3e11ccee-d08b-43e5-af01-32717a64da03")]
-internal unsafe partial interface ICLRDataTarget
+public unsafe partial interface ICLRDataTarget
 {
     [PreserveSig]
     int GetMachineType(uint* machineType);
@@ -58,7 +58,7 @@ internal unsafe partial interface ICLRDataTarget
 
 [GeneratedComInterface]
 [Guid("17d5b8c6-34a9-407f-af4f-a930201d4e02")]
-internal unsafe partial interface ICLRContractLocator
+public unsafe partial interface ICLRContractLocator
 {
     [PreserveSig]
     int GetContractDescriptor(ulong* contractAddress);
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs
similarity index 93%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs
index 0426e0cce705fd..a43959d81f63dc 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs
@@ -12,7 +12,7 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 // See src/coreclr/inc/sospriv.idl
 
 #pragma warning disable CS0649 // Field is never assigned to, and will always have its default value
-internal enum CLRDataOtherNotifyFlag
+public enum CLRDataOtherNotifyFlag
 {
     CLRDATA_NOTIFY_ON_MODULE_LOAD = 0x1,
     CLRDATA_NOTIFY_ON_MODULE_UNLOAD = 0x2,
@@ -20,7 +20,7 @@ internal enum CLRDataOtherNotifyFlag
     CLRDATA_NOTIFY_ON_EXCEPTION_CATCH_ENTER = 0x8
 }
 
-internal struct DacpThreadStoreData
+public struct DacpThreadStoreData
 {
     public int threadCount;
     public int unstartedThreadCount;
@@ -33,7 +33,7 @@ internal struct DacpThreadStoreData
     public int fHostConfig; // Uses hosting flags defined above
 };
 
-internal enum DacpAppDomainDataStage : uint
+public enum DacpAppDomainDataStage : uint
 {
     STAGE_CREATING,
     STAGE_READYFORMANAGEDCODE,
@@ -50,7 +50,7 @@ internal enum DacpAppDomainDataStage : uint
     STAGE_CLOSED
 };
 
-internal struct DacpAppDomainData
+public struct DacpAppDomainData
 {
     // The pointer to the AppDomain or SystemDomain.
     // It's useful to keep this around in the structure
@@ -68,14 +68,14 @@ internal struct DacpAppDomainData
     public DacpAppDomainDataStage appDomainStage;
 };
 
-internal struct DacpAppDomainStoreData
+public struct DacpAppDomainStoreData
 {
     public ClrDataAddress sharedDomain;
     public ClrDataAddress systemDomain;
     public int DomainCount;
 };
 
-internal struct DacpAssemblyData
+public struct DacpAssemblyData
 {
     public ClrDataAddress AssemblyPtr;
     public ClrDataAddress ClassLoader;
@@ -89,7 +89,7 @@ internal struct DacpAssemblyData
     public uint dwLocationFlags;
 }
 
-internal struct DacpThreadData
+public struct DacpThreadData
 {
     public int corThreadId;
     public int osThreadId;
@@ -108,7 +108,7 @@ internal struct DacpThreadData
     public ClrDataAddress nextThread;
 }
 
-internal struct DacpModuleData
+public struct DacpModuleData
 {
     public ClrDataAddress Address;
     public ClrDataAddress PEAssembly; // Actually the module address in .NET 9+
@@ -138,13 +138,13 @@ internal struct DacpModuleData
     public ulong dwModuleIndex; // Always 0 - .NET no longer has this
 }
 
-internal enum ModuleMapType
+public enum ModuleMapType
 {
     TYPEDEFTOMETHODTABLE = 0x0,
     TYPEREFTOMETHODTABLE = 0x1
 }
 
-internal struct DacpMethodTableData
+public struct DacpMethodTableData
 {
     public int bIsFree; // everything else is NULL if this is true.
     public ClrDataAddress module;
@@ -163,7 +163,7 @@ internal struct DacpMethodTableData
     public int bContainsGCPointers;
 }
 
-internal enum DacpObjectType
+public enum DacpObjectType
 {
     OBJ_STRING = 0,
     OBJ_FREE,
@@ -172,7 +172,7 @@ internal enum DacpObjectType
     OBJ_OTHER
 };
 
-internal struct DacpObjectData
+public struct DacpObjectData
 {
     public ClrDataAddress MethodTable;
     public DacpObjectType ObjectType;
@@ -189,7 +189,7 @@ internal struct DacpObjectData
     public ulong CCW;
 }
 
-internal struct DacpUsefulGlobalsData
+public struct DacpUsefulGlobalsData
 {
     public ClrDataAddress ArrayMethodTable;
     public ClrDataAddress StringMethodTable;
@@ -199,7 +199,7 @@ internal struct DacpUsefulGlobalsData
 }
 #pragma warning restore CS0649 // Field is never assigned to, and will always have its default value
 
-internal struct DacpMethodTableFieldData
+public struct DacpMethodTableFieldData
 {
     public ushort wNumInstanceFields;
     public ushort wNumStaticFields;
@@ -209,13 +209,13 @@ internal struct DacpMethodTableFieldData
     public ushort wContextStaticsSize;
 };
 
-internal enum MethodTableInitializationFlags
+public enum MethodTableInitializationFlags
 {
     MethodTableInitialized = 1,
     MethodTableInitializationFailed = 2
 };
 
-internal struct DacpReJitData
+public struct DacpReJitData
 {
     // FIXME[cdac]: the C++ definition enum doesn't have an explicit underlying type or constant values for the flags
     public enum Flags : uint
@@ -231,7 +231,7 @@ public enum Flags : uint
     public ClrDataAddress NativeCodeAddr;
 };
 
-internal struct DacpMethodDescData
+public struct DacpMethodDescData
 {
     public int bHasNativeCode;
     public int bIsDynamic;
@@ -264,21 +264,21 @@ internal struct DacpMethodDescData
 
 }
 
-internal struct DacpMethodDescTransparencyData
+public struct DacpMethodDescTransparencyData
 {
     public int bHasCriticalTransparentInfo;
     public int bIsCritical;
     public int bIsTreatAsSafe;
 }
 
-internal struct DacpMethodTableTransparencyData
+public struct DacpMethodTableTransparencyData
 {
     public int bHasCriticalTransparentInfo;
     public int bIsCritical;
     public int bIsTreatAsSafe;
 }
 
-internal static class GCConstants
+public static class GCConstants
 {
     public const int DAC_NUMBERGENERATIONS = 4;
 
@@ -289,7 +289,7 @@ internal static class GCConstants
     public const int DAC_MAX_GLOBAL_GC_MECHANISMS_COUNT = 6;
 }
 
-internal struct DacpGcHeapData
+public struct DacpGcHeapData
 {
     public int bServerMode;
     public int bGcStructuresValid;
@@ -297,7 +297,7 @@ internal struct DacpGcHeapData
     public uint g_max_generation;
 }
 
-internal struct DacpGenerationData
+public struct DacpGenerationData
 {
     public ClrDataAddress start_segment;
     public ClrDataAddress allocation_start;
@@ -307,7 +307,7 @@ internal struct DacpGenerationData
     public ClrDataAddress allocContextLimit;
 }
 
-internal struct DacpGcHeapDetails
+public struct DacpGcHeapDetails
 {
     public ClrDataAddress heapAddr; // Only filled in server mode, otherwise NULL
     public ClrDataAddress alloc_allocated;
@@ -341,7 +341,7 @@ public struct FinalizationDataArray
     public ClrDataAddress card_table;
 }
 
-internal struct DacpHeapSegmentData
+public struct DacpHeapSegmentData
 {
     public ClrDataAddress segmentAddr;
     public ClrDataAddress allocated;
@@ -357,7 +357,7 @@ internal struct DacpHeapSegmentData
     public ClrDataAddress background_allocated;
 }
 
-internal struct DacpOomData
+public struct DacpOomData
 {
     public int reason;
     public ulong alloc_size;
@@ -368,7 +368,7 @@ internal struct DacpOomData
     public int loh_p; // BOOL
 }
 
-internal struct DacpGcHeapAnalyzeData
+public struct DacpGcHeapAnalyzeData
 {
     public ClrDataAddress heapAddr;
     public ClrDataAddress internal_root_array;
@@ -378,7 +378,7 @@ internal struct DacpGcHeapAnalyzeData
 
 [GeneratedComInterface]
 [Guid("286CA186-E763-4F61-9760-487D43AE4341")]
-internal unsafe partial interface ISOSEnum
+public unsafe partial interface ISOSEnum
 {
     [PreserveSig]
     int Skip(uint count);
@@ -390,7 +390,7 @@ internal unsafe partial interface ISOSEnum
     int GetCount(uint* pCount);
 }
 
-internal struct DacpFieldDescData
+public struct DacpFieldDescData
 {
     public CorElementType Type;
     public CorElementType sigType;     // ELEMENT_TYPE_XXX from signature. We need this to display pretty name for String in minidump's case
@@ -408,7 +408,7 @@ internal struct DacpFieldDescData
 
 [GeneratedComInterface]
 [Guid("436f00f2-b42a-4b9f-870c-e73db66ae930")]
-internal unsafe partial interface ISOSDacInterface
+public unsafe partial interface ISOSDacInterface
 {
     // All functions are explicitly PreserveSig so that we can just return E_NOTIMPL instead of throwing
     // as the cDAC slowly replaces parts of the DAC.
@@ -648,7 +648,7 @@ internal unsafe partial interface ISOSDacInterface
 };
 
 #pragma warning disable CS0649 // Field is never assigned to, and will always have its default value
-internal struct DacpExceptionObjectData
+public struct DacpExceptionObjectData
 {
     public ClrDataAddress Message;
     public ClrDataAddress InnerException;
@@ -663,7 +663,7 @@ internal struct DacpExceptionObjectData
 
 [GeneratedComInterface]
 [Guid("A16026EC-96F4-40BA-87FB-5575986FB7AF")]
-internal unsafe partial interface ISOSDacInterface2
+public unsafe partial interface ISOSDacInterface2
 {
     [PreserveSig]
     int GetObjectExceptionData(ClrDataAddress objectAddress, DacpExceptionObjectData* data);
@@ -671,7 +671,7 @@ internal unsafe partial interface ISOSDacInterface2
     int IsRCWDCOMProxy(ClrDataAddress rcwAddress, int* inDCOMProxy);
 }
 
-internal struct DacpGCInterestingInfoData
+public struct DacpGCInterestingInfoData
 {
     [System.Runtime.CompilerServices.InlineArray(GCConstants.DAC_NUM_GC_DATA_POINTS)]
     public struct InterestingDataPointsArray
@@ -712,7 +712,7 @@ public struct GlobalMechanismsArray
 
 [GeneratedComInterface]
 [Guid("B08C5CDC-FD8A-49C5-AB38-5FEEF35235B4")]
-internal unsafe partial interface ISOSDacInterface3
+public unsafe partial interface ISOSDacInterface3
 {
     [PreserveSig]
     int GetGCInterestingInfoData(ClrDataAddress interestingInfoAddr, DacpGCInterestingInfoData* data);
@@ -724,7 +724,7 @@ internal unsafe partial interface ISOSDacInterface3
 
 [GeneratedComInterface]
 [Guid("74B9D34C-A612-4B07-93DD-5462178FCE11")]
-internal unsafe partial interface ISOSDacInterface4
+public unsafe partial interface ISOSDacInterface4
 {
     [PreserveSig]
     int GetClrNotification([In, Out, MarshalUsing(CountElementName = nameof(count))] ClrDataAddress[] arguments, int count, int* pNeeded);
@@ -732,13 +732,13 @@ internal unsafe partial interface ISOSDacInterface4
 
 [GeneratedComInterface]
 [Guid("127d6abe-6c86-4e48-8e7b-220781c58101")]
-internal unsafe partial interface ISOSDacInterface5
+public unsafe partial interface ISOSDacInterface5
 {
     [PreserveSig]
     int GetTieredVersions(ClrDataAddress methodDesc, int rejitId, /*struct DacpTieredVersionData*/void* nativeCodeAddrs, int cNativeCodeAddrs, int* pcNativeCodeAddrs);
 };
 
-internal struct DacpMethodTableCollectibleData
+public struct DacpMethodTableCollectibleData
 {
     public ClrDataAddress LoaderAllocatorObjectHandle;
     public int bCollectible;
@@ -746,13 +746,13 @@ internal struct DacpMethodTableCollectibleData
 
 [GeneratedComInterface]
 [Guid("11206399-4B66-4EDB-98EA-85654E59AD45")]
-internal unsafe partial interface ISOSDacInterface6
+public unsafe partial interface ISOSDacInterface6
 {
     [PreserveSig]
     int GetMethodTableCollectibleData(ClrDataAddress mt, DacpMethodTableCollectibleData* data);
 };
 
-internal struct DacpReJitData2
+public struct DacpReJitData2
 {
     public enum Flags : uint
     {
@@ -768,7 +768,7 @@ public enum Flags : uint
     public ClrDataAddress ilCodeVersionNodePtr;
 }
 
-internal struct DacpProfilerILData
+public struct DacpProfilerILData
 {
     public enum ModificationType
     {
@@ -784,7 +784,7 @@ public enum ModificationType
 
 [GeneratedComInterface]
 [Guid("c1020dde-fe98-4536-a53b-f35a74c327eb")]
-internal unsafe partial interface ISOSDacInterface7
+public unsafe partial interface ISOSDacInterface7
 {
     [PreserveSig]
     int GetPendingReJITID(ClrDataAddress methodDesc, int* pRejitId);
@@ -798,7 +798,7 @@ internal unsafe partial interface ISOSDacInterface7
 
 [GeneratedComInterface]
 [Guid("c12f35a9-e55c-4520-a894-b3dc5165dfce")]
-internal unsafe partial interface ISOSDacInterface8
+public unsafe partial interface ISOSDacInterface8
 {
     [PreserveSig]
     int GetNumberGenerations(uint* pGenerations);
@@ -821,14 +821,14 @@ internal unsafe partial interface ISOSDacInterface8
 
 [GeneratedComInterface]
 [Guid("4eca42d8-7e7b-4c8a-a116-7bfbf6929267")]
-internal partial interface ISOSDacInterface9
+public partial interface ISOSDacInterface9
 {
     int GetBreakingChangeVersion();
 }
 
 [GeneratedComInterface]
 [Guid("90B8FCC3-7251-4B0A-AE3D-5C13A67EC9AA")]
-internal unsafe partial interface ISOSDacInterface10
+public unsafe partial interface ISOSDacInterface10
 {
     [PreserveSig]
     int GetObjectComWrappersData(ClrDataAddress objAddr, ClrDataAddress* rcw, uint count, ClrDataAddress* mowList, uint* pNeeded);
@@ -844,7 +844,7 @@ internal unsafe partial interface ISOSDacInterface10
 
 [GeneratedComInterface]
 [Guid("96BA1DB9-14CD-4492-8065-1CAAECF6E5CF")]
-internal unsafe partial interface ISOSDacInterface11
+public unsafe partial interface ISOSDacInterface11
 {
     [PreserveSig]
     int IsTrackedType(ClrDataAddress objAddr, Interop.BOOL* isTrackedType, Interop.BOOL* hasTaggedMemory);
@@ -854,7 +854,7 @@ internal unsafe partial interface ISOSDacInterface11
 
 [GeneratedComInterface]
 [Guid("1b93bacc-8ca4-432d-943a-3e6e7ec0b0a3")]
-internal unsafe partial interface ISOSDacInterface12
+public unsafe partial interface ISOSDacInterface12
 {
     [PreserveSig]
     int GetGlobalAllocationContext(ClrDataAddress* allocPtr, ClrDataAddress* allocLimit);
@@ -862,7 +862,7 @@ internal unsafe partial interface ISOSDacInterface12
 
 [GeneratedComInterface]
 [Guid("3176a8ed-597b-4f54-a71f-83695c6a8c5e")]
-internal unsafe partial interface ISOSDacInterface13
+public unsafe partial interface ISOSDacInterface13
 {
     [PreserveSig]
     int TraverseLoaderHeap(ClrDataAddress loaderHeapAddr, /*LoaderHeapKind*/ int kind, /*VISITHEAP*/ delegate* unmanaged pCallback);
@@ -884,7 +884,7 @@ internal unsafe partial interface ISOSDacInterface13
 
 [GeneratedComInterface]
 [Guid("9aa22aca-6dc6-4a0c-b4e0-70d2416b9837")]
-internal unsafe partial interface ISOSDacInterface14
+public unsafe partial interface ISOSDacInterface14
 {
     [PreserveSig]
     int GetStaticBaseAddress(ClrDataAddress methodTable, ClrDataAddress* nonGCStaticsAddress, ClrDataAddress* GCStaticsAddress);
@@ -894,7 +894,7 @@ internal unsafe partial interface ISOSDacInterface14
     int GetMethodTableInitializationFlags(ClrDataAddress methodTable, MethodTableInitializationFlags* initializationStatus);
 }
 
-internal struct SOSMethodData
+public struct SOSMethodData
 {
     public ClrDataAddress MethodDesc;
     public ClrDataAddress Entrypoint;
@@ -906,7 +906,7 @@ internal struct SOSMethodData
 
 [GeneratedComInterface]
 [Guid("3c0fe725-c324-4a4f-8100-d399588a662e")]
-internal unsafe partial interface ISOSMethodEnum : ISOSEnum
+public unsafe partial interface ISOSMethodEnum : ISOSEnum
 {
     [PreserveSig]
     int Next(uint count, [In, Out, MarshalUsing(CountElementName = nameof(count))] SOSMethodData[] values, uint* pNeeded);
@@ -914,7 +914,7 @@ internal unsafe partial interface ISOSMethodEnum : ISOSEnum
 
 [GeneratedComInterface]
 [Guid("7ed81261-52a9-4a23-a358-c3313dea30a8")]
-internal unsafe partial interface ISOSDacInterface15
+public unsafe partial interface ISOSDacInterface15
 {
     [PreserveSig]
     int GetMethodTableSlotEnumerator(ClrDataAddress mt, out ISOSMethodEnum? enumerator);
@@ -922,7 +922,7 @@ internal unsafe partial interface ISOSDacInterface15
 
 [GeneratedComInterface]
 [Guid("4ba12ff8-daac-4e43-ac56-98cf8d5c595d")]
-internal unsafe partial interface ISOSDacInterface16
+public unsafe partial interface ISOSDacInterface16
 {
     [PreserveSig]
     int GetGCDynamicAdaptationMode(int* pDynamicAdaptationMode);
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/IXCLRData.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs
similarity index 96%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/IXCLRData.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs
index 6b391907634fc7..9e181eeab46671 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/IXCLRData.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs
@@ -10,14 +10,14 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 // This file contains managed declarations for the IXCLRData interfaces.
 // See src/coreclr/inc/xclrdata.idl
 
-internal struct CLRDataModuleExtent
+public struct CLRDataModuleExtent
 {
     public ClrDataAddress baseAddress;
     public uint length;
     public uint /* CLRDataModuleExtentType */ type;
 }
 
-internal struct DacpGetModuleData
+public struct DacpGetModuleData
 {
     public uint IsDynamic;
     public uint IsInMemory;
@@ -31,7 +31,7 @@ internal struct DacpGetModuleData
 
 [GeneratedComInterface]
 [Guid("88E32849-0A0A-4cb0-9022-7CD2E9E139E2")]
-internal unsafe partial interface IXCLRDataModule
+public unsafe partial interface IXCLRDataModule
 {
     [PreserveSig]
     int StartEnumAssemblies(ulong* handle);
@@ -129,7 +129,7 @@ internal unsafe partial interface IXCLRDataModule
 
 [GeneratedComInterface]
 [Guid("34625881-7EB3-4524-817B-8DB9D064C760")]
-internal unsafe partial interface IXCLRDataModule2
+public unsafe partial interface IXCLRDataModule2
 {
     [PreserveSig]
     int SetJITCompilerFlags(uint flags);
@@ -137,7 +137,7 @@ internal unsafe partial interface IXCLRDataModule2
 
 [GeneratedComInterface]
 [Guid("5c552ab6-fc09-4cb3-8e36-22fa03c798b7")]
-internal unsafe partial interface IXCLRDataProcess
+public unsafe partial interface IXCLRDataProcess
 {
     [PreserveSig]
     int Flush();
@@ -313,9 +313,9 @@ int DumpNativeImage(
         /*IXCLRDisassemblySupport*/ void* dis);
 }
 
-internal struct GcEvtArgs
+public struct GcEvtArgs
 {
-    internal enum GcEvt_t
+    public enum GcEvt_t
     {
         GC_MARK_END = 1,
         GC_EVENT_TYPE_MAX = GC_MARK_END + 1
@@ -326,7 +326,7 @@ internal enum GcEvt_t
 
 [GeneratedComInterface]
 [Guid("5c552ab6-fc09-4cb3-8e36-22fa03c798b8")]
-internal unsafe partial interface IXCLRDataProcess2 : IXCLRDataProcess
+public unsafe partial interface IXCLRDataProcess2 : IXCLRDataProcess
 {
     [PreserveSig]
     int GetGcNotification(GcEvtArgs* gcEvtArgs);
@@ -336,7 +336,7 @@ internal unsafe partial interface IXCLRDataProcess2 : IXCLRDataProcess
 
 [GeneratedComInterface]
 [Guid("E59D8D22-ADA7-49a2-89B5-A415AFCFC95F")]
-internal unsafe partial interface IXCLRDataStackWalk
+public unsafe partial interface IXCLRDataStackWalk
 {
     [PreserveSig]
     int GetContext(
@@ -369,7 +369,7 @@ int GetContext(
 
 [GeneratedComInterface]
 [Guid("271498C2-4085-4766-BC3A-7F8ED188A173")]
-internal unsafe partial interface IXCLRDataFrame
+public unsafe partial interface IXCLRDataFrame
 {
     [PreserveSig]
     int GetFrameType(uint* simpleType, uint* detailedType);
@@ -433,7 +433,7 @@ int Request(
 
 [GeneratedComInterface]
 [Guid("1C4D9A4B-702D-4CF6-B290-1DB6F43050D0")]
-internal unsafe partial interface IXCLRDataFrame2
+public unsafe partial interface IXCLRDataFrame2
 {
     [PreserveSig]
     int GetExactGenericArgsToken(/*IXCLRDataValue*/ void** genericToken);
@@ -441,7 +441,7 @@ internal unsafe partial interface IXCLRDataFrame2
 
 [GeneratedComInterface]
 [Guid("A5B0BEEA-EC62-4618-8012-A24FFC23934C")]
-internal unsafe partial interface IXCLRDataTask
+public unsafe partial interface IXCLRDataTask
 {
     [PreserveSig]
     int GetProcess(/*IXCLRDataProcess*/ void** process);
@@ -492,13 +492,13 @@ internal unsafe partial interface IXCLRDataTask
     int GetLastExceptionState(/*IXCLRDataExceptionState*/ void** exception);
 }
 
-internal enum ClrDataSourceType : uint
+public enum ClrDataSourceType : uint
 {
     CLRDATA_SOURCE_TYPE_INVALID = 0,
 }
 
 // CLRDATA_IL_ADDRESS_MAP
-internal struct ClrDataILAddressMap
+public struct ClrDataILAddressMap
 {
     public uint ilOffset;
     public ClrDataAddress startAddress;
@@ -508,7 +508,7 @@ internal struct ClrDataILAddressMap
 
 [GeneratedComInterface]
 [Guid("ECD73800-22CA-4b0d-AB55-E9BA7E6318A5")]
-internal unsafe partial interface IXCLRDataMethodInstance
+public unsafe partial interface IXCLRDataMethodInstance
 {
     [PreserveSig]
     int GetTypeInstance(/*IXCLRDataTypeInstance*/ void** typeInstance);
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Interop.BOOL.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Interop.BOOL.cs
new file mode 100644
index 00000000000000..f70aded7565cb2
--- /dev/null
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Interop.BOOL.cs
@@ -0,0 +1,20 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+namespace Microsoft.Diagnostics.DataContractReader.Legacy;
+public static partial class Interop
+{
+    /// 
+    /// Blittable version of Windows BOOL type. It is convenient in situations where
+    /// manual marshalling is required, or to avoid overhead of regular bool marshalling.
+    /// 
+    /// 
+    /// Some Windows APIs return arbitrary integer values although the return type is defined
+    /// as BOOL. It is best to never compare BOOL to TRUE. Always use bResult != BOOL.FALSE
+    /// or bResult == BOOL.FALSE .
+    /// 
+    public enum BOOL : int
+    {
+        FALSE = 0,
+        TRUE = 1,
+    }
+}
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
new file mode 100644
index 00000000000000..4eb5f58cc529dc
--- /dev/null
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Microsoft.Diagnostics.DataContractReader.Legacy.csproj
@@ -0,0 +1,21 @@
+
+
+  
+    $(NetCoreAppToolCurrent)
+    Microsoft.Diagnostics.DataContractReader.Legacy
+    enable
+    true
+    false
+    true
+    true
+    false
+  
+
+  
+    
+  
+
+  
+    
+  
+
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/OutputBufferHelpers.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/OutputBufferHelpers.cs
similarity index 95%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/OutputBufferHelpers.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/OutputBufferHelpers.cs
index 1f6d00716e3768..51ae00d6d1b962 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/OutputBufferHelpers.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/OutputBufferHelpers.cs
@@ -5,7 +5,7 @@
 
 namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 
-internal static class OutputBufferHelpers
+public static class OutputBufferHelpers
 {
     public static unsafe void CopyStringToBuffer(char* stringBuf, uint bufferSize, uint* neededBufferSize, string str)
     {
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.ICLRDataEnumMemoryRegions.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.ICLRDataEnumMemoryRegions.cs
similarity index 89%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.ICLRDataEnumMemoryRegions.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.ICLRDataEnumMemoryRegions.cs
index c0a327e21f969b..4c5be79950a737 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.ICLRDataEnumMemoryRegions.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.ICLRDataEnumMemoryRegions.cs
@@ -9,7 +9,7 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 /// Implementation of ICLRDataEnumMemoryRegions interface intended to be passed out to consumers
 /// interacting with the DAC via those COM interfaces.
 /// 
-internal sealed unsafe partial class SOSDacImpl : ICLRDataEnumMemoryRegions
+public sealed unsafe partial class SOSDacImpl : ICLRDataEnumMemoryRegions
 {
     int ICLRDataEnumMemoryRegions.EnumMemoryRegions(void* callback, uint miniDumpFlags, int clrFlags)
         => _legacyEnumMemory is not null ? _legacyEnumMemory.EnumMemoryRegions(callback, miniDumpFlags, clrFlags) : HResults.E_NOTIMPL;
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.IXCLRDataProcess.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs
similarity index 99%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.IXCLRDataProcess.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs
index 72bb5b717bf0df..6fa6cbe173ec1a 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.IXCLRDataProcess.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs
@@ -16,7 +16,7 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 /// Implementation of IXCLRDataProcess* interfaces intended to be passed out to consumers
 /// interacting with the DAC via those COM interfaces.
 /// 
-internal sealed unsafe partial class SOSDacImpl : IXCLRDataProcess, IXCLRDataProcess2
+public sealed unsafe partial class SOSDacImpl : IXCLRDataProcess, IXCLRDataProcess2
 {
     int IXCLRDataProcess.Flush()
     {
@@ -136,7 +136,7 @@ int IXCLRDataProcess.EndEnumModules(ulong handle)
     int IXCLRDataProcess.GetModuleByAddress(ClrDataAddress address, /*IXCLRDataModule*/ void** mod)
         => _legacyProcess is not null ? _legacyProcess.GetModuleByAddress(address, mod) : HResults.E_NOTIMPL;
 
-    internal class EnumMethodInstances
+    internal sealed class EnumMethodInstances
     {
         private readonly Target _target;
         private readonly TargetPointer _mainMethodDesc;
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs
similarity index 99%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs
index 9061601fd126c6..dd385161312b2d 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs
@@ -28,7 +28,7 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 /// corresponding error code.
 /// 
 [GeneratedComClass]
-internal sealed unsafe partial class SOSDacImpl
+public sealed unsafe partial class SOSDacImpl
     : ISOSDacInterface, ISOSDacInterface2, ISOSDacInterface3, ISOSDacInterface4, ISOSDacInterface5,
       ISOSDacInterface6, ISOSDacInterface7, ISOSDacInterface8, ISOSDacInterface9, ISOSDacInterface10,
       ISOSDacInterface11, ISOSDacInterface12, ISOSDacInterface13, ISOSDacInterface14, ISOSDacInterface15,
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SigFormat.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SigFormat.cs
similarity index 100%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/SigFormat.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SigFormat.cs
diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/TypeNameBuilder.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/TypeNameBuilder.cs
similarity index 99%
rename from src/native/managed/cdac/mscordaccore_universal/Legacy/TypeNameBuilder.cs
rename to src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/TypeNameBuilder.cs
index d05f14803d5baa..15f5bc8778eb20 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Legacy/TypeNameBuilder.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/TypeNameBuilder.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 
 using System;
@@ -11,7 +11,7 @@
 namespace Microsoft.Diagnostics.DataContractReader.Legacy;
 
 [Flags]
-internal enum TypeNameFormat
+public enum TypeNameFormat
 {
     FormatNamespace = 1,
     FormatFullInst = 2,
@@ -21,7 +21,7 @@ internal enum TypeNameFormat
     FormatSignature = 32,
 }
 
-internal struct TypeNameBuilder
+public struct TypeNameBuilder
 {
     [Flags]
     private enum ParseState
@@ -112,7 +112,7 @@ public static void AppendMethodImpl(Target target, StringBuilder stringBuilder,
                     arrayName = ".ctor";
                     break;
                 default:
-                    throw new ArgumentException(nameof(method));
+                    throw new ArgumentException($"Unkown ArrayFunctionType: {functionType}.", nameof(method));
             }
 
             stringBuilder.Append(arrayName);
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.cs
index 0afe774efde541..629a2d66e58cd4 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.cs
@@ -20,7 +20,7 @@ internal sealed class CachingContractRegistry : ContractRegistry
     private readonly Target _target;
     private readonly TryGetContractVersionDelegate _tryGetContractVersion;
 
-    public CachingContractRegistry(Target target, TryGetContractVersionDelegate tryGetContractVersion, Action>>? configureFactories = null)
+    public CachingContractRegistry(Target target, TryGetContractVersionDelegate tryGetContractVersion, IEnumerable> additionalFactories, Action>>? configureFactories = null)
     {
         _target = target;
         _tryGetContractVersion = tryGetContractVersion;
@@ -47,31 +47,15 @@ public CachingContractRegistry(Target target, TryGetContractVersionDelegate tryG
             [typeof(INotifications)] = new NotificationsFactory(),
             [typeof(ISignatureDecoder)] = new SignatureDecoderFactory(),
         };
+
+        foreach (IContractFactory factory in additionalFactories)
+        {
+            _factories[factory.ContractType] = factory;
+        }
         configureFactories?.Invoke(_factories);
     }
 
-    public override IException Exception => GetContract();
-    public override ILoader Loader => GetContract();
-    public override IEcmaMetadata EcmaMetadata => GetContract();
-    public override IObject Object => GetContract();
-    public override IThread Thread => GetContract();
-    public override IRuntimeTypeSystem RuntimeTypeSystem => GetContract();
-    public override IDacStreams DacStreams => GetContract();
-    public override IExecutionManager ExecutionManager => GetContract();
-    public override ICodeVersions CodeVersions => GetContract();
-    public override IPlatformMetadata PlatformMetadata => GetContract();
-    public override IPrecodeStubs PrecodeStubs => GetContract();
-    public override IReJIT ReJIT => GetContract();
-    public override IStackWalk StackWalk => GetContract();
-    public override IRuntimeInfo RuntimeInfo => GetContract();
-    public override IComWrappers ComWrappers => GetContract();
-    public override IDebugInfo DebugInfo => GetContract();
-    public override ISHash SHash => GetContract();
-    public override IGC GC => GetContract();
-    public override INotifications Notifications => GetContract();
-    public override ISignatureDecoder SignatureDecoder => GetContract();
-
-    private TContract GetContract() where TContract : IContract
+    public override TContract GetContract()
     {
         if (_contracts.TryGetValue(typeof(TContract), out IContract? contractMaybe))
             return (TContract)contractMaybe;
diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.cs
index bec5c1cb7dc3f1..50d138a7c507df 100644
--- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.cs
+++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.cs
@@ -9,6 +9,7 @@
 using System.Runtime.CompilerServices;
 using System.Text;
 using Microsoft.Diagnostics.DataContractReader.Data;
+using Microsoft.Diagnostics.DataContractReader.Contracts;
 
 namespace Microsoft.Diagnostics.DataContractReader;
 
@@ -59,6 +60,7 @@ public static bool TryCreate(
         ReadFromTargetDelegate readFromTarget,
         WriteToTargetDelegate writeToTarget,
         GetTargetThreadContextDelegate getThreadContext,
+        IEnumerable> additionalFactories,
         [NotNullWhen(true)] out ContractDescriptorTarget? target)
     {
         DataTargetDelegates dataTargetDelegates = new DataTargetDelegates(readFromTarget, writeToTarget, getThreadContext);
@@ -67,7 +69,7 @@ public static bool TryCreate(
             dataTargetDelegates,
             out Descriptor[] descriptors))
         {
-            target = new ContractDescriptorTarget(descriptors, dataTargetDelegates);
+            target = new ContractDescriptorTarget(descriptors, dataTargetDelegates, additionalFactories);
             return true;
         }
 
@@ -92,7 +94,8 @@ public static ContractDescriptorTarget Create(
         WriteToTargetDelegate writeToTarget,
         GetTargetThreadContextDelegate getThreadContext,
         bool isLittleEndian,
-        int pointerSize)
+        int pointerSize,
+        IEnumerable> additionalFactories)
     {
         return new ContractDescriptorTarget(
             [
@@ -103,12 +106,13 @@ public static ContractDescriptorTarget Create(
                     PointerData = globalPointerValues
                 }
             ],
-            new DataTargetDelegates(readFromTarget, writeToTarget, getThreadContext));
+            new DataTargetDelegates(readFromTarget, writeToTarget, getThreadContext),
+            additionalFactories);
     }
 
-    private ContractDescriptorTarget(Descriptor[] descriptors, DataTargetDelegates dataTargetDelegates)
+    private ContractDescriptorTarget(Descriptor[] descriptors, DataTargetDelegates dataTargetDelegates, IEnumerable> additionalFactories)
     {
-        Contracts = new CachingContractRegistry(this, this.TryGetContractVersion);
+        Contracts = new CachingContractRegistry(this, this.TryGetContractVersion, additionalFactories);
         ProcessedData = new DataCache(this);
         _config = descriptors[0].Config;
         _dataTargetDelegates = dataTargetDelegates;
diff --git a/src/native/managed/cdac/mscordaccore_universal/Entrypoints.cs b/src/native/managed/cdac/mscordaccore_universal/Entrypoints.cs
index d0db95a1e58ccb..acc5dec4a18775 100644
--- a/src/native/managed/cdac/mscordaccore_universal/Entrypoints.cs
+++ b/src/native/managed/cdac/mscordaccore_universal/Entrypoints.cs
@@ -45,6 +45,7 @@ private static unsafe int Init(
                     return readThreadContext(threadId, contextFlags, (uint)buffer.Length, bufferPtr, delegateContext);
                 }
             },
+            [],
             out ContractDescriptorTarget? target))
             return -1;
 
@@ -147,6 +148,7 @@ private static unsafe int CLRDataCreateInstanceImpl(Guid* pIID, IntPtr /*ICLRDat
                     return dataTarget.GetThreadContext(threadId, contextFlags, (uint)bufferToFill.Length, bufferPtr);
                 }
             },
+            [],
             out ContractDescriptorTarget? target))
         {
             return -1;
diff --git a/src/native/managed/cdac/mscordaccore_universal/mscordaccore_universal.csproj b/src/native/managed/cdac/mscordaccore_universal/mscordaccore_universal.csproj
index e0674b33864f71..dd127583c1592b 100644
--- a/src/native/managed/cdac/mscordaccore_universal/mscordaccore_universal.csproj
+++ b/src/native/managed/cdac/mscordaccore_universal/mscordaccore_universal.csproj
@@ -17,9 +17,6 @@
   
 
   
-    
-      Common\Interop\Windows\Interop.BOOL.cs
-    
     
   
   
@@ -32,7 +29,7 @@
   
 
   
-    
+    
   
 
 
diff --git a/src/native/managed/cdac/tests/ContractDescriptor/ContractDescriptorBuilder.cs b/src/native/managed/cdac/tests/ContractDescriptor/ContractDescriptorBuilder.cs
index 19e0db7c404314..c7961216806527 100644
--- a/src/native/managed/cdac/tests/ContractDescriptor/ContractDescriptorBuilder.cs
+++ b/src/native/managed/cdac/tests/ContractDescriptor/ContractDescriptorBuilder.cs
@@ -205,6 +205,6 @@ public bool TryCreateTarget(DescriptorBuilder descriptor, [NotNullWhen(true)] ou
         _created = true;
         ulong contractDescriptorAddress = descriptor.CreateSubDescriptor(ContractDescriptorAddr, JsonDescriptorAddr, ContractPointerDataAddr);
         MockMemorySpace.MemoryContext memoryContext = GetMemoryContext();
-        return ContractDescriptorTarget.TryCreate(contractDescriptorAddress, memoryContext.ReadFromTarget, memoryContext.WriteToTarget, null, out target);
+        return ContractDescriptorTarget.TryCreate(contractDescriptorAddress, memoryContext.ReadFromTarget, memoryContext.WriteToTarget, null, [], out target);
     }
 }
diff --git a/src/tools/StressLogAnalyzer/src/Program.cs b/src/tools/StressLogAnalyzer/src/Program.cs
index 4012f137e97673..f1f10ea3ae4cd4 100644
--- a/src/tools/StressLogAnalyzer/src/Program.cs
+++ b/src/tools/StressLogAnalyzer/src/Program.cs
@@ -496,7 +496,8 @@ ContractDescriptorTarget CreateTarget() => ContractDescriptorTarget.Create(
             (address, buffer) => throw new NotImplementedException("StressLogAnalyzer does not provide WriteToTarget implementation"),
             (threadId, contextFlags, bufferToFill) => throw new NotImplementedException("StressLogAnalyzer does not provide GetTargetThreadContext implementation"),
             true,
-            nuint.Size);
+            nuint.Size,
+            []);
     }
 
     private static unsafe TimeTracker CreateTimeTracker(SafeMemoryMappedViewHandle handle, Options options)