diff --git a/src/libraries/System.Data.Common/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Data.Common/src/ILLink/ILLink.Suppressions.xml
index aae5e3cc281c94..a0aae1367cb5f4 100644
--- a/src/libraries/System.Data.Common/src/ILLink/ILLink.Suppressions.xml
+++ b/src/libraries/System.Data.Common/src/ILLink/ILLink.Suppressions.xml
@@ -247,5 +247,77 @@
member
M:System.Data.XMLSchema.GetConverter(System.Type)
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.ObjectStorage.ConvertObjectToXml(System.Object)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.ObjectStorage.ConvertObjectToXml(System.Object,System.Xml.XmlWriter,System.Xml.Serialization.XmlRootAttribute)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.ObjectStorage.ConvertObjectToXml(System.Object,System.Xml.XmlReader,System.Xml.Serialization.XmlRootAttribute)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.ObjectStorage.ConvertXmlToObject(System.Xml.XmlReader,System.Xml.Serialization.XmlRootAttribute)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.SqlUdtStorage.ConvertObjectToXml(System.Object)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.ObjectStorage.ConvertXmlToObject(System.Object)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.ObjectStorage.ConvertXmlToObject(System.String)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.SqlUdtStorage.ConvertObjectToXml(System.Object,System.Xml.XmlWriter,System.Xml.Serialization.XmlRootAttribute)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.SqlUdtStorage.ConvertXmlToObject(System.String)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.SqlUdtStorage.ConvertXmlToObject(System.Xml.XmlReader,System.Xml.Serialization.XmlRootAttribute)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.ObjectStorage.GetXmlSerializer(System.Type)
+
+
+ ILLink
+ IL2026
+ member
+ M:System.Data.Common.ObjectStorage.GetXmlSerializer(System.Type,System.Xml.Serialization.XmlRootAttribute)
+
diff --git a/src/libraries/System.Private.Xml/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Private.Xml/src/ILLink/ILLink.Suppressions.xml
deleted file mode 100644
index 40dbf4ac889e2b..00000000000000
--- a/src/libraries/System.Private.Xml/src/ILLink/ILLink.Suppressions.xml
+++ /dev/null
@@ -1,317 +0,0 @@
-
-
-
-
- ILLink
- IL2026
- member
- M:System.Xml.Serialization.ReflectionAwareILGen.ILGenForCreateInstance(System.Xml.Serialization.CodeGenerator,System.Type,System.Type,System.Boolean)
-
-
- ILLink
- IL2026
- member
- M:System.Xml.Serialization.TempAssembly.GetTypeFromAssembly(System.Reflection.Assembly,System.String)
-
-
- ILLink
- IL2026
- member
- M:System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(System.Type,System.String,System.Xml.Serialization.XmlSerializerImplementation@)
-
-
- ILLink
- IL2026
- member
- M:System.Xml.Serialization.XmlAttributes.get_IgnoreAttribute
-
-
- ILLink
- IL2057
- member
- M:System.Xml.Serialization.XmlSerializationWriterCodeGen.WriteCheckDefault(System.Xml.Serialization.TypeMapping,System.String,System.Object,System.Boolean)
-
-
- ILLink
- IL2060
- member
- M:System.Xml.Serialization.ReflectionXmlSerializationReader.GetSetMemberValueDelegate(System.Object,System.String)
-
-
- ILLink
- IL2067
- member
- M:System.Xml.Serialization.ReflectionXmlSerializationReader.ReflectionCreateObject(System.Type)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.Compiler.AddImport(System.Type,System.Collections.Hashtable)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.ReflectionAwareCodeGen.WriteMappingInfo(System.Xml.Serialization.TypeMapping,System.String,System.Type)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.ReflectionAwareCodeGen.WriteMemberInfo(System.Type,System.String,System.String,System.String)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.ReflectionAwareILGen.ILGenForCreateInstance(System.Xml.Serialization.CodeGenerator,System.Type,System.Boolean,System.Boolean)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.ReflectionAwareILGen.ILGenForCreateInstance(System.Xml.Serialization.CodeGenerator,System.Type,System.Type,System.Boolean)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.ReflectionXmlSerializationHelper.GetMember(System.Type,System.String)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.ReflectionXmlSerializationReader.AddObjectsIntoTargetCollection(System.Object,System.Collections.Generic.List{System.Object},System.Type)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.ReflectionXmlSerializationReader.GetDefaultConstructor(System.Type)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.SourceInfo.ConvertNullableValue(System.Type,System.Type)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.TempAssembly.GetMethodFromType(System.Type,System.String)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.TypeExtensions.TryConvertTo(System.Type,System.Object,System.Object@)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.TypeScope.GetConstructorFlags(System.Type,System.Exception@)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.TypeScope.GetDefaultIndexer(System.Type,System.String)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.TypeScope.GetEnumeratorElementType(System.Type,System.Xml.Serialization.TypeFlags@)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.TypeScope.ShouldBeReplaced(System.Reflection.MemberInfo,System.Type,System.Reflection.MemberInfo@)
-
-
- ILLink
- IL2070
- member
- M:System.Xml.Serialization.XmlReflectionImporter.GetMethodFromSchemaProvider(System.Xml.Serialization.XmlSchemaProviderAttribute,System.Type)
-
-
- ILLink
- IL2072
- member
- M:System.Xml.Serialization.ReflectionXmlSerializationReader.WriteNullableMethod(System.Xml.Serialization.NullableMapping,System.Boolean,System.String)
-
-
- ILLink
- IL2072
- member
- M:System.Xml.Serialization.TempAssembly.get_Contract
-
-
- ILLink
- IL2072
- member
- M:System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(System.Type,System.String,System.Xml.Serialization.XmlSerializerImplementation@)
-
-
- ILLink
- IL2072
- member
- M:System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializer(System.String,System.String,System.Xml.Serialization.XmlMapping,System.Xml.Serialization.CodeIdentifiers,System.String,System.String,System.String)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.CodeGenerator.GetPropertyMethodFromBaseType(System.Reflection.PropertyInfo,System.Boolean)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.EnumModel.get_Constants
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.FieldModel.#ctor(System.Reflection.MemberInfo,System.Type,System.Xml.Serialization.TypeDesc)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.ReflectionAwareILGen.ILGenForCreateInstance(System.Xml.Serialization.CodeGenerator,System.Type,System.Type,System.Boolean)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.ReflectionAwareILGen.WriteLocalDecl(System.String,System.Xml.Serialization.SourceInfo)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.ReflectionXmlSerializationHelper.GetMember(System.Type,System.String)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.ReflectionXmlSerializationReader.WriteLiteralStructMethod(System.Xml.Serialization.StructMapping,System.Boolean,System.Boolean,System.String)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.ReflectionXmlSerializationWriter.WriteStructMethod(System.Xml.Serialization.StructMapping,System.String,System.String,System.Object,System.Boolean,System.Boolean)
-
-
- ILLink
- IL2075
- member
- T:System.Xml.Serialization.ReflectionXmlSerializationReader
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.SourceInfo.InternalLoad(System.Type,System.Boolean)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.StructModel.GetMemberInfos
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.TypeScope.GetEnumeratorElementType(System.Type,System.Xml.Serialization.TypeFlags@)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlReflectionImporter.GetChoiceIdentifierType(System.Xml.Serialization.XmlChoiceIdentifierAttribute,System.Xml.Serialization.StructModel,System.Boolean,System.String)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlSerializationILGen.GenerateBaseSerializer(System.String,System.String,System.String,System.Xml.Serialization.CodeIdentifiers)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlSerializationILGen.GenerateGetSerializer(System.Collections.Generic.Dictionary{System.String,System.String},System.Xml.Serialization.XmlMapping[],System.Reflection.Emit.TypeBuilder)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlSerializationILGen.GenerateSerializerContract(System.String,System.Xml.Serialization.XmlMapping[],System.Type[],System.String,System.String[],System.String,System.String[],System.Collections.Generic.Dictionary{System.String,System.String})
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializer(System.String,System.String,System.Xml.Serialization.XmlMapping,System.Xml.Serialization.CodeIdentifiers,System.String,System.String,System.String)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializers(System.Collections.Generic.Dictionary{System.String,System.String},System.Reflection.Emit.TypeBuilder)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlSerializationReaderILGen.WriteAttributes(System.Xml.Serialization.XmlSerializationReaderILGen.Member[],System.Xml.Serialization.XmlSerializationReaderILGen.Member,System.String,System.Reflection.Emit.LocalBuilder)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlSerializationReaderILGen.WriteSourceEnd(System.String,System.Type,System.Type)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlSerializationWriterILGen.WriteArrayItems(System.Xml.Serialization.ElementAccessor[],System.Xml.Serialization.TextAccessor,System.Xml.Serialization.ChoiceIdentifierAccessor,System.Xml.Serialization.TypeDesc,System.String,System.String)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlSerializationWriterILGen.WriteCheckDefault(System.Xml.Serialization.SourceInfo,System.Object,System.Boolean)
-
-
- ILLink
- IL2075
- member
- M:System.Xml.Serialization.XmlSerializationWriterILGen.WriteElement(System.Xml.Serialization.SourceInfo,System.Xml.Serialization.ElementAccessor,System.String,System.Boolean)
-
-
- ILLink
- IL2077
- member
- M:System.Xml.Serialization.SerializableMapping.RetrieveSerializableSchema
-
-
- ILLink
- IL2080
- member
- M:System.Xml.Serialization.XmlSerializationWriterILGen.WriteText(System.Xml.Serialization.SourceInfo,System.Xml.Serialization.TextAccessor)
-
-
-
diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchema.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchema.cs
index 309fb8ffa402ef..68e372c8901cf1 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchema.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchema.cs
@@ -10,6 +10,7 @@ namespace System.Xml.Schema
using System.Threading;
using System.Diagnostics;
using System.Collections.Generic;
+ using System.Diagnostics.CodeAnalysis;
[XmlRoot("schema", Namespace = XmlSchema.Namespace)]
public class XmlSchema : XmlSchemaObject
@@ -88,11 +89,13 @@ public XmlSchema() { }
return parser.XmlSchema;
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
public void Write(Stream stream)
{
Write(stream, null);
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
public void Write(Stream stream, XmlNamespaceManager? namespaceManager)
{
XmlTextWriter xmlWriter = new XmlTextWriter(stream, null);
@@ -100,11 +103,13 @@ public void Write(Stream stream, XmlNamespaceManager? namespaceManager)
Write(xmlWriter, namespaceManager);
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
public void Write(TextWriter writer)
{
Write(writer, null);
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
public void Write(TextWriter writer, XmlNamespaceManager? namespaceManager)
{
XmlTextWriter xmlWriter = new XmlTextWriter(writer);
@@ -112,11 +117,17 @@ public void Write(TextWriter writer, XmlNamespaceManager? namespaceManager)
Write(xmlWriter, namespaceManager);
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
public void Write(XmlWriter writer)
{
Write(writer, null);
}
+ [DynamicDependency(TrimmerConstants.PublicMembers, typeof(XmlSchema))]
+ // This method may be safe given the above Dynamic Dependency but it is not yet fully understood if just preserving
+ // all of XmlSchema public members is enough in order to be safe in all cases, so we have opted to keep the RequiresUnreferencedCode
+ // attribute for now. This can be removed in the future if it is determined that the above is enough for all scenarios to be trim-safe.
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
public void Write(XmlWriter writer, XmlNamespaceManager? namespaceManager)
{
XmlSerializer serializer = new XmlSerializer(typeof(XmlSchema));
diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs
index 3ae4442c85323e..c5be96f6005778 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs
@@ -475,6 +475,7 @@ private static bool IsStruct(Type objType)
return objType.IsValueType && !objType.IsPrimitive;
}
+ [RequiresUnreferencedCode("calls LoadMember")]
internal Type LoadMember(object obj, MemberInfo memberInfo)
{
if (GetVariableType(obj).IsValueType)
@@ -484,6 +485,7 @@ internal Type LoadMember(object obj, MemberInfo memberInfo)
return LoadMember(memberInfo);
}
+ [RequiresUnreferencedCode("GetProperty on PropertyInfo type's base type")]
private static MethodInfo? GetPropertyMethodFromBaseType(PropertyInfo propertyInfo, bool isGetter)
{
// we only invoke this when the propertyInfo does not have a GET or SET method on it
@@ -522,6 +524,7 @@ internal Type LoadMember(object obj, MemberInfo memberInfo)
return result;
}
+ [RequiresUnreferencedCode("calls GetPropertyMethodFromBaseType")]
internal Type LoadMember(MemberInfo memberInfo)
{
Type? memberType = null;
@@ -560,6 +563,7 @@ internal Type LoadMember(MemberInfo memberInfo)
return memberType;
}
+ [RequiresUnreferencedCode("calls GetPropertyMethodFromBaseType")]
internal Type LoadMemberAddress(MemberInfo memberInfo)
{
Type? memberType = null;
@@ -602,6 +606,7 @@ internal Type LoadMemberAddress(MemberInfo memberInfo)
return memberType;
}
+ [RequiresUnreferencedCode("calls GetPropertyMethodFromBaseType")]
internal void StoreMember(MemberInfo memberInfo)
{
if (memberInfo is FieldInfo)
diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compilation.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compilation.cs
index 1428e96571e246..a3b6334d08b5f0 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compilation.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compilation.cs
@@ -44,6 +44,7 @@ internal TempAssembly(XmlMapping[] xmlMappings, Assembly assembly, XmlSerializer
_contract = contract;
}
+ [RequiresUnreferencedCode("calls GenerateRefEmitAssembly")]
internal TempAssembly(XmlMapping[] xmlMappings, Type?[] types, string? defaultNamespace, string? location)
{
bool containsSoapMapping = false;
@@ -101,6 +102,7 @@ internal static bool UseLegacySerializerGeneration
internal XmlSerializerImplementation Contract
{
+ [RequiresUnreferencedCode("calls GetTypeFromAssembly")]
get
{
if (_contract == null)
@@ -137,6 +139,7 @@ internal void InitAssemblyMethods(XmlMapping[] xmlMappings)
///
// SxS: This method does not take any resource name and does not expose any resources to the caller.
// It's OK to suppress the SxS warning.
+ [RequiresUnreferencedCode("calls LoadFile")]
internal static Assembly? LoadGeneratedAssembly(Type type, string? defaultNamespace, out XmlSerializerImplementation? contract)
{
Assembly? serializer = null;
@@ -276,6 +279,7 @@ private static string GenerateAssemblyId(Type type)
return sb.ToString();
}
+ [RequiresUnreferencedCode("calls GenerateBegin")]
internal static bool GenerateSerializerToStream(XmlMapping[] xmlMappings, Type?[] types, string? defaultNamespace, Assembly? assembly, Hashtable assemblies, Stream stream)
{
var compiler = new Compiler();
@@ -420,6 +424,7 @@ internal static bool GenerateSerializerToStream(XmlMapping[] xmlMappings, Type?[
}
}
+ [RequiresUnreferencedCode("calls GenerateElement")]
internal static Assembly GenerateRefEmitAssembly(XmlMapping[] xmlMappings, Type?[]? types, string? defaultNamespace)
{
var scopeTable = new Dictionary();
@@ -497,7 +502,8 @@ internal static Assembly GenerateRefEmitAssembly(XmlMapping[] xmlMappings, Type?
return writerType.Assembly;
}
- private static MethodInfo GetMethodFromType(Type type, string methodName)
+ private static MethodInfo GetMethodFromType(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type type, string methodName)
{
MethodInfo? method = type.GetMethod(methodName);
if (method != null)
@@ -508,6 +514,7 @@ private static MethodInfo GetMethodFromType(Type type, string methodName)
throw missingMethod;
}
+ [RequiresUnreferencedCode("calls GetType")]
internal static Type GetTypeFromAssembly(Assembly assembly, string typeName)
{
typeName = GeneratedAssemblyNamespace + "." + typeName;
@@ -557,6 +564,7 @@ internal bool CanRead(XmlMapping mapping, XmlReader xmlReader)
return encodingStyle;
}
+ [RequiresUnreferencedCode("calls Contract")]
internal object? InvokeReader(XmlMapping mapping, XmlReader xmlReader, XmlDeserializationEvents events, string? encodingStyle)
{
XmlSerializationReader? reader = null;
@@ -591,6 +599,7 @@ internal bool CanRead(XmlMapping mapping, XmlReader xmlReader)
}
}
+ [RequiresUnreferencedCode("calls Contract")]
internal void InvokeWriter(XmlMapping mapping, XmlWriter xmlWriter, object? o, XmlSerializerNamespaces? namespaces, string? encodingStyle, string? id)
{
XmlSerializationWriter? writer = null;
diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compiler.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compiler.cs
index d2a710419ddb9d..20522dca69f2e9 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compiler.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Compiler.cs
@@ -7,6 +7,7 @@
using System.Diagnostics;
using System.Globalization;
using System.Runtime.CompilerServices;
+using System.Diagnostics.CodeAnalysis;
namespace System.Xml.Serialization
{
@@ -16,6 +17,7 @@ internal sealed class Compiler
// SxS: This method does not take any resource name and does not expose any resources to the caller.
// It's OK to suppress the SxS warning.
+ [RequiresUnreferencedCode("Reflects against input Type DeclaringType")]
internal void AddImport(Type? type, Hashtable types)
{
if (type == null)
diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ImportContext.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ImportContext.cs
index 4b746fccb6ab81..61acd28393cbdc 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ImportContext.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ImportContext.cs
@@ -11,6 +11,7 @@ namespace System.Xml.Serialization
using System.Collections;
using System.Collections.Specialized;
using System.Reflection;
+ using System.Diagnostics.CodeAnalysis;
public class ImportContext
{
@@ -214,6 +215,7 @@ private int CompositeHash(XmlSchemaObject o, int hash)
return (int)tmp;
}
+ [RequiresUnreferencedCode("creates SchemaGraph")]
internal void GenerateSchemaGraph(XmlSchemas schemas)
{
SchemaGraph graph = new SchemaGraph(Graph, schemas);
@@ -259,6 +261,7 @@ internal sealed class SchemaGraph
private readonly Hashtable _scope;
private readonly int _items;
+ [RequiresUnreferencedCode("Calls Compile")]
internal SchemaGraph(Hashtable scope, XmlSchemas schemas)
{
_scope = scope;
diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Mappings.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Mappings.cs
index 31018170306892..b6c770d672e3e3 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Mappings.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Mappings.cs
@@ -1057,6 +1057,7 @@ internal bool NamedAny
internal sealed class SerializableMapping : SpecialMapping
{
private XmlSchema? _schema;
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
private Type? _type;
private bool _needSchema = true;
@@ -1172,6 +1173,7 @@ internal SerializableMapping? Next
set { _next = value; }
}
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
internal Type? Type
{
get { return _type; }
diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Models.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Models.cs
index 4afb75ef820d1b..f81cf455a7b5e4 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Models.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/Models.cs
@@ -8,6 +8,7 @@ namespace System.Xml.Serialization
using System.Collections;
using System.Diagnostics;
using System.Collections.Generic;
+ using System.Diagnostics.CodeAnalysis;
// These classes define the abstract serialization model, e.g. the rules for WHAT is serialized.
// The answer of HOW the values are serialized is answered by a particular reflection importer
@@ -30,11 +31,13 @@ internal TypeScope TypeScope
get { return _typeScope; }
}
+ [RequiresUnreferencedCode("calls GetTypeModel")]
internal TypeModel GetTypeModel(Type type)
{
return GetTypeModel(type, true);
}
+ [RequiresUnreferencedCode("calls GetTypeDesc")]
internal TypeModel GetTypeModel(Type type, bool directReference)
{
TypeModel? model;
@@ -70,6 +73,7 @@ internal TypeModel GetTypeModel(Type type, bool directReference)
return model;
}
+ [RequiresUnreferencedCode("calls GetArrayTypeDesc")]
internal ArrayModel GetArrayModel(Type type)
{
TypeModel? model;
@@ -90,16 +94,21 @@ internal ArrayModel GetArrayModel(Type type)
internal abstract class TypeModel
{
private readonly TypeDesc _typeDesc;
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
private readonly Type _type;
private readonly ModelScope _scope;
- protected TypeModel(Type type, TypeDesc typeDesc, ModelScope scope)
+ protected TypeModel(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type,
+ TypeDesc typeDesc,
+ ModelScope scope)
{
_scope = scope;
_type = type;
_typeDesc = typeDesc;
}
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
internal Type Type
{
get { return _type; }
@@ -118,27 +127,34 @@ internal TypeDesc TypeDesc
internal sealed class ArrayModel : TypeModel
{
- internal ArrayModel(Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { }
+ internal ArrayModel(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { }
internal TypeModel Element
{
+ [RequiresUnreferencedCode("Calls GetTypeModel")]
get { return ModelScope.GetTypeModel(TypeScope.GetArrayElementType(Type, null)!); }
}
}
internal sealed class PrimitiveModel : TypeModel
{
- internal PrimitiveModel(Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { }
+ internal PrimitiveModel(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { }
}
internal sealed class SpecialModel : TypeModel
{
- internal SpecialModel(Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { }
+ internal SpecialModel(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type,
+ TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { }
}
internal sealed class StructModel : TypeModel
{
- internal StructModel(Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { }
+ internal StructModel(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type,
+ TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { }
internal MemberInfo[] GetMemberInfos()
{
@@ -168,6 +184,7 @@ internal MemberInfo[] GetMemberInfos()
return fieldsAndProps;
}
+ [RequiresUnreferencedCode("calls GetFieldModel")]
internal FieldModel? GetFieldModel(MemberInfo memberInfo)
{
FieldModel? model = null;
@@ -199,6 +216,7 @@ private void CheckSupportedMember(TypeDesc? typeDesc, MemberInfo member, Type ty
CheckSupportedMember(typeDesc.ArrayElementTypeDesc, member, type);
}
+ [RequiresUnreferencedCode("calls GetTypeDesc")]
private FieldModel? GetFieldModel(FieldInfo fieldInfo)
{
if (fieldInfo.IsStatic) return null;
@@ -212,6 +230,7 @@ private void CheckSupportedMember(TypeDesc? typeDesc, MemberInfo member, Type ty
return new FieldModel(fieldInfo, fieldInfo.FieldType, typeDesc);
}
+ [RequiresUnreferencedCode("calls GetTypeDesc")]
private FieldModel? GetPropertyModel(PropertyInfo propertyInfo)
{
if (propertyInfo.DeclaringType != Type) return null;
@@ -274,6 +293,7 @@ internal FieldModel(string name, Type fieldType, TypeDesc fieldTypeDesc, bool ch
_readOnly = readOnly;
}
+ [RequiresUnreferencedCode("Calls GetField on MemberInfo type")]
internal FieldModel(MemberInfo memberInfo, Type fieldType, TypeDesc fieldTypeDesc)
{
_name = memberInfo.Name;
@@ -400,7 +420,9 @@ internal sealed class EnumModel : TypeModel
{
private ConstantModel[]? _constants;
- internal EnumModel(Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { }
+ internal EnumModel(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
+ Type type, TypeDesc typeDesc, ModelScope scope) : base(type, typeDesc, scope) { }
internal ConstantModel[] Constants
{
diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/PrimitiveXmlSerializers.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/PrimitiveXmlSerializers.cs
index 018317a523cf2f..e06311de6d61c9 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/PrimitiveXmlSerializers.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/PrimitiveXmlSerializers.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.Diagnostics.CodeAnalysis;
namespace System.Xml.Serialization
{
@@ -224,6 +225,7 @@ internal void Write_QName(object? o)
WriteNullableQualifiedNameLiteral(@"QName", @"", ((global::System.Xml.XmlQualifiedName)o));
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
protected override void InitCallbacks()
{
}
@@ -708,6 +710,7 @@ internal sealed class XmlSerializationPrimitiveReader : System.Xml.Serialization
return (object?)o;
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
protected override void InitCallbacks()
{
}
diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs
index a1afa18babf09f..ab2daeeab7dde7 100644
--- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs
+++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationReader.cs
@@ -8,26 +8,37 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq.Expressions;
using System.Reflection;
+using System.Runtime.CompilerServices;
using System.Xml.Extensions;
using System.Xml.Schema;
+// UnconditionalSuppressMessage that specify a Target need to be at the assembly or module level for now. Also,
+// they won't consider Target unless you also specify Scope to be either "member" or "type"
+[assembly: UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:MakeGenericMethod",
+ Target = "M:System.Xml.Serialization.ReflectionXmlSerializationReader.#cctor",
+ Justification = "The reason why this warns is because the two static properties call GetTypeDesc() which internally will call " +
+ "ImportTypeDesc() when the passed in type is not considered a primitive type. That said, for both properties here we are passing in string " +
+ "and XmlQualifiedName which are considered primitive, so they are trim safe.",
+ Scope = "member")]
+
namespace System.Xml.Serialization
{
internal delegate void UnknownNodeAction(object? o);
internal sealed class ReflectionXmlSerializationReader : XmlSerializationReader
{
- private static TypeDesc StringTypeDesc { get; set; } = (new TypeScope()).GetTypeDesc(typeof(string));
- private static TypeDesc QnameTypeDesc { get; set; } = (new TypeScope()).GetTypeDesc(typeof(XmlQualifiedName));
-
private readonly XmlMapping _mapping;
+ internal static TypeDesc StringTypeDesc { get; set; } = (new TypeScope()).GetTypeDesc(typeof(string));
+ internal static TypeDesc QnameTypeDesc { get; set; } = (new TypeScope()).GetTypeDesc(typeof(XmlQualifiedName));
+
public ReflectionXmlSerializationReader(XmlMapping mapping, XmlReader xmlReader, XmlDeserializationEvents events, string? encodingStyle)
{
Init(xmlReader, events, encodingStyle, tempAssembly: null);
_mapping = mapping;
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
protected override void InitCallbacks()
{
TypeScope scope = _mapping.Scope!;
@@ -50,6 +61,7 @@ protected override void InitIDs()
{
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
public object? ReadObject()
{
XmlMapping xmlMapping = _mapping;
@@ -73,6 +85,7 @@ protected override void InitIDs()
}
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
private object GenerateMembersElement(XmlMembersMapping xmlMembersMapping)
{
if (xmlMembersMapping.Accessor.IsSoap)
@@ -85,6 +98,7 @@ private object GenerateMembersElement(XmlMembersMapping xmlMembersMapping)
}
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
private object GenerateLiteralMembersElement(XmlMembersMapping xmlMembersMapping)
{
ElementAccessor element = xmlMembersMapping.Accessor;
@@ -128,6 +142,7 @@ private object GenerateLiteralMembersElement(XmlMembersMapping xmlMembersMapping
return p;
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
private bool GenerateLiteralMembersElementInternal(MemberMapping[] mappings, bool hasWrapperElement, object?[] p)
{
Member? anyText = null;
@@ -312,6 +327,7 @@ private void InitializeValueTypes(object?[] p, MemberMapping[] mappings)
}
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
private object GenerateEncodedMembersElement(XmlMembersMapping xmlMembersMapping)
{
ElementAccessor element = xmlMembersMapping.Accessor;
@@ -399,17 +415,19 @@ private object GenerateEncodedMembersElement(XmlMembersMapping xmlMembersMapping
}
else
{
- unrecognizedElementSource = (_) =>
- {
- if (Reader.GetAttribute("id", null) != null)
- {
- ReadReferencedElement();
- }
- else
- {
- UnknownNode(p);
- };
- };
+ unrecognizedElementSource = Wrapper;
+ [RequiresUnreferencedCode("calls ReadReferencedElement")]
+ void Wrapper(object? _)
+ {
+ if (Reader.GetAttribute("id", null) != null)
+ {
+ ReadReferencedElement();
+ }
+ else
+ {
+ UnknownNode(p);
+ }
+ }
}
WriteMemberElements(members, unrecognizedElementSource, (_) => UnknownNode(p), null, null, fixup: fixup, checkTypeHrefsSource: checkTypeHrefSource);
@@ -452,6 +470,7 @@ private object GenerateEncodedMembersElement(XmlMembersMapping xmlMembersMapping
return p;
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
private object? GenerateTypeElement(XmlTypeMapping xmlTypeMapping)
{
ElementAccessor element = xmlTypeMapping.Accessor;
@@ -481,6 +500,7 @@ private object GenerateEncodedMembersElement(XmlMembersMapping xmlMembersMapping
return o;
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
private void WriteMemberElements(Member[] expectedMembers, UnknownNodeAction elementElseAction, UnknownNodeAction elseAction, Member? anyElement, Member? anyText, Fixup? fixup = null, List? checkTypeHrefsSource = null)
{
bool checkType = checkTypeHrefsSource != null;
@@ -510,6 +530,7 @@ private void WriteMemberElements(Member[] expectedMembers, UnknownNodeAction ele
}
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
private void WriteMemberElementsCheckType(List checkTypeHrefsSource)
{
object? RefElememnt = ReadReferencingElement(null, null, true, out string? refElemId);
@@ -533,6 +554,7 @@ private void ProcessUnknownNode(UnknownNodeAction action)
action?.Invoke(null);
}
+ [RequiresUnreferencedCode(XmlSerializer.TrimSerializationWarning)]
private void WriteMembers(ref object? o, Member[] members, UnknownNodeAction elementElseAction, UnknownNodeAction elseAction, Member? anyElement, Member? anyText)
{
Reader.MoveToContent();
@@ -544,7 +566,8 @@ private void WriteMembers(ref object? o, Member[] members, UnknownNodeAction ele
}
}
- private void SetCollectionObjectWithCollectionMember([NotNull] ref object? collection, CollectionMember collectionMember, Type collectionType)
+ private void SetCollectionObjectWithCollectionMember([NotNull] ref object? collection, CollectionMember collectionMember,
+ [DynamicallyAccessedMembers(TrimmerConstants.AllMethods)] Type collectionType)
{
if (collectionType.IsArray)
{
@@ -577,7 +600,8 @@ private void SetCollectionObjectWithCollectionMember([NotNull] ref object? colle
}
}
- private static void AddObjectsIntoTargetCollection(object targetCollection, List