diff --git a/YamlDotNet.Core7AoTCompileTest/YamlDotNet.Core7AoTCompileTest.csproj b/YamlDotNet.Core7AoTCompileTest/YamlDotNet.Core7AoTCompileTest.csproj index 9d42ee9a6..ee4b4bf2c 100644 --- a/YamlDotNet.Core7AoTCompileTest/YamlDotNet.Core7AoTCompileTest.csproj +++ b/YamlDotNet.Core7AoTCompileTest/YamlDotNet.Core7AoTCompileTest.csproj @@ -2,7 +2,7 @@ Exe - net70 + net80 true true enable diff --git a/YamlDotNet/Core/CharacterAnalyzer.cs b/YamlDotNet/Core/CharacterAnalyzer.cs index de95568b8..1f483b6f0 100644 --- a/YamlDotNet/Core/CharacterAnalyzer.cs +++ b/YamlDotNet/Core/CharacterAnalyzer.cs @@ -57,11 +57,6 @@ public bool IsAlphaNumericDashOrUnderscore(int offset = 0) character == '-'; } - public bool IsAscii(int offset = 0) - { - return Buffer.Peek(offset) <= '\x7F'; - } - public bool IsPrintable(int offset = 0) { var character = Buffer.Peek(offset); diff --git a/YamlDotNet/Helpers/ReadOnlyCollectionExtensions.cs b/YamlDotNet/Helpers/ReadOnlyCollectionExtensions.cs deleted file mode 100644 index 3c00dca61..000000000 --- a/YamlDotNet/Helpers/ReadOnlyCollectionExtensions.cs +++ /dev/null @@ -1,38 +0,0 @@ -// This file is part of YamlDotNet - A .NET library for YAML. -// Copyright (c) Antoine Aubry and contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -using System.Collections.Generic; - -namespace YamlDotNet.Helpers -{ - internal static class ReadOnlyCollectionExtensions - { - public static IReadOnlyList AsReadonlyList(this List list) - { - return list; - } - - public static IReadOnlyDictionary AsReadonlyDictionary(this Dictionary dictionary) where TKey : notnull - { - return dictionary; - } - } -} diff --git a/YamlDotNet/ReflectionExtensions.cs b/YamlDotNet/ReflectionExtensions.cs index 25b836569..b257a8abe 100644 --- a/YamlDotNet/ReflectionExtensions.cs +++ b/YamlDotNet/ReflectionExtensions.cs @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; @@ -43,11 +44,6 @@ public static bool IsGenericType(this Type type) return type.GetTypeInfo().IsGenericType; } - public static bool IsGenericTypeDefinition(this Type type) - { - return type.GetTypeInfo().IsGenericTypeDefinition; - } - public static bool IsInterface(this Type type) { return type.GetTypeInfo().IsInterface; @@ -66,7 +62,11 @@ public static bool IsEnum(this Type type) /// /// true if the type has a default constructor; otherwise, false. /// - public static bool HasDefaultConstructor(this Type type, bool allowPrivateConstructors) + public static bool HasDefaultConstructor( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] +#endif + this Type type, bool allowPrivateConstructors) { var bindingFlags = BindingFlags.Instance | BindingFlags.Public; @@ -78,16 +78,6 @@ public static bool HasDefaultConstructor(this Type type, bool allowPrivateConstr return type.IsValueType || type.GetConstructor(bindingFlags, null, Type.EmptyTypes, null) != null; } - public static bool IsAssignableFrom(this Type type, Type source) - { - return type.IsAssignableFrom(source.GetTypeInfo()); - } - - public static bool IsAssignableFrom(this Type type, TypeInfo source) - { - return type.GetTypeInfo().IsAssignableFrom(source); - } - public static TypeCode GetTypeCode(this Type type) { var isEnum = type.IsEnum(); @@ -164,60 +154,65 @@ public static TypeCode GetTypeCode(this Type type) public static bool IsDbNull(this object value) { - return value?.GetType()?.FullName == "System.DBNull"; - } - - public static Type[] GetGenericArguments(this Type type) - { - return type.GetTypeInfo().GenericTypeArguments; + return value.GetType().FullName == "System.DBNull"; } - public static PropertyInfo? GetPublicProperty(this Type type, string name) - { - return type.GetRuntimeProperty(name); - } - - public static FieldInfo? GetPublicStaticField(this Type type, string name) - { - return type.GetRuntimeField(name); - } - - private static readonly Func IsInstance = (PropertyInfo property) => !(property.GetMethod ?? property.SetMethod).IsStatic; private static readonly Func IsInstancePublic = (PropertyInfo property) => IsInstance(property) && (property.GetMethod ?? property.SetMethod).IsPublic; - public static IEnumerable GetProperties(this Type type, bool includeNonPublic) + public static IEnumerable GetProperties( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces | + DynamicallyAccessedMemberTypes.PublicProperties | + DynamicallyAccessedMemberTypes.NonPublicProperties)] +#endif + this Type type, bool includeNonPublic) { var predicate = includeNonPublic ? IsInstance : IsInstancePublic; return type.IsInterface() ? (new Type[] { type }) .Concat(type.GetInterfaces()) - .SelectMany(i => i.GetRuntimeProperties().Where(predicate)) + .SelectMany(( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] +#endif + i) => i.GetRuntimeProperties().Where(predicate)) : type.GetRuntimeProperties().Where(predicate); } - public static IEnumerable GetPublicProperties(this Type type) => GetProperties(type, false); + public static IEnumerable GetPublicProperties( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces | + DynamicallyAccessedMemberTypes.PublicProperties | + DynamicallyAccessedMemberTypes.NonPublicProperties)] +#endif + this Type type) => GetProperties(type, false); - public static IEnumerable GetPublicFields(this Type type) + public static IEnumerable GetPublicFields( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields |DynamicallyAccessedMemberTypes.NonPublicFields)] +#endif + this Type type) { return type.GetRuntimeFields().Where(f => !f.IsStatic && f.IsPublic); } - public static IEnumerable GetPublicStaticMethods(this Type type) + public static IEnumerable GetPublicStaticMethods( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] +#endif + this Type type) { return type.GetRuntimeMethods() .Where(m => m.IsPublic && m.IsStatic); } - public static MethodInfo GetPrivateStaticMethod(this Type type, string name) - { - return type.GetRuntimeMethods() - .FirstOrDefault(m => !m.IsPublic && m.IsStatic && m.Name.Equals(name)) - ?? throw new MissingMethodException($"Expected to find a method named '{name}' in '{type.FullName}'."); - } - - public static MethodInfo? GetPublicStaticMethod(this Type type, string name, params Type[] parameterTypes) + public static MethodInfo? GetPublicStaticMethod( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] +#endif + this Type type, string name, params Type[] parameterTypes) { return type.GetRuntimeMethods() .FirstOrDefault(m => @@ -232,54 +227,9 @@ public static MethodInfo GetPrivateStaticMethod(this Type type, string name) }); } - public static MethodInfo? GetPublicInstanceMethod(this Type type, string name) - { - return type.GetRuntimeMethods() - .FirstOrDefault(m => m.IsPublic && !m.IsStatic && m.Name.Equals(name)); - } - - public static MethodInfo? GetGetMethod(this PropertyInfo property, bool nonPublic) - { - var getter = property.GetMethod; - if (!nonPublic && !getter.IsPublic) - { - getter = null; - } - return getter; - } - - public static MethodInfo? GetSetMethod(this PropertyInfo property) - { - return property.SetMethod; - } - - public static IEnumerable GetInterfaces(this Type type) - { - return type.GetTypeInfo().ImplementedInterfaces; - } - - public static bool IsInstanceOf(this Type type, object o) - { - return o.GetType() == type || o.GetType().GetTypeInfo().IsSubclassOf(type); - } - public static Attribute[] GetAllCustomAttributes(this PropertyInfo member) { - // IMemberInfo.GetCustomAttributes ignores it's "inherit" parameter for properties, - // and the suggested replacement (Attribute.GetCustomAttributes) is not available - // on netstandard1.3 - var result = new List(); - var type = member.DeclaringType; - - while (type != null) - { - type.GetPublicProperty(member.Name); - result.AddRange(member.GetCustomAttributes(typeof(TAttribute))); - - type = type.BaseType(); - } - - return result.ToArray(); + return Attribute.GetCustomAttributes(member, typeof(TAttribute), true); } } } diff --git a/YamlDotNet/Serialization/NodeDeserializers/ArrayNodeDeserializer.cs b/YamlDotNet/Serialization/NodeDeserializers/ArrayNodeDeserializer.cs index 48099b244..2d9009329 100644 --- a/YamlDotNet/Serialization/NodeDeserializers/ArrayNodeDeserializer.cs +++ b/YamlDotNet/Serialization/NodeDeserializers/ArrayNodeDeserializer.cs @@ -22,7 +22,6 @@ using System; using System.Collections; using YamlDotNet.Core; -using YamlDotNet.Serialization.ObjectFactories; namespace YamlDotNet.Serialization.NodeDeserializers { diff --git a/YamlDotNet/Serialization/NodeDeserializers/CollectionNodeDeserializer.cs b/YamlDotNet/Serialization/NodeDeserializers/CollectionNodeDeserializer.cs index 772f379b9..a090b33e7 100644 --- a/YamlDotNet/Serialization/NodeDeserializers/CollectionNodeDeserializer.cs +++ b/YamlDotNet/Serialization/NodeDeserializers/CollectionNodeDeserializer.cs @@ -22,6 +22,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Helpers; @@ -79,6 +80,9 @@ public bool Deserialize(IParser parser, Type expectedType, Func")] +#endif internal static void DeserializeHelper(Type tItem, IParser parser, Func nestedObjectDeserializer, IList result, bool canUpdate, INamingConvention enumNamingConvention) { parser.Consume(); diff --git a/YamlDotNet/Serialization/NodeDeserializers/DictionaryNodeDeserializer.cs b/YamlDotNet/Serialization/NodeDeserializers/DictionaryNodeDeserializer.cs index ddc706b32..2ddcce537 100644 --- a/YamlDotNet/Serialization/NodeDeserializers/DictionaryNodeDeserializer.cs +++ b/YamlDotNet/Serialization/NodeDeserializers/DictionaryNodeDeserializer.cs @@ -23,7 +23,6 @@ using System.Collections; using System.Collections.Generic; using YamlDotNet.Core; -using YamlDotNet.Core.Events; using YamlDotNet.Helpers; using YamlDotNet.Serialization.Utilities; diff --git a/YamlDotNet/Serialization/ObjectFactories/DefaultObjectFactory.cs b/YamlDotNet/Serialization/ObjectFactories/DefaultObjectFactory.cs index 9ab2adaff..80c4ab5b3 100644 --- a/YamlDotNet/Serialization/ObjectFactories/DefaultObjectFactory.cs +++ b/YamlDotNet/Serialization/ObjectFactories/DefaultObjectFactory.cs @@ -22,6 +22,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using YamlDotNet.Serialization.Callbacks; @@ -143,7 +144,11 @@ private void ExecuteState(Type attributeType, object value) } } - private MethodInfo[] GetStateMethods(Type attributeType, Type valueType) + private MethodInfo[] GetStateMethods(Type attributeType, +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods)] +#endif + Type valueType) { var stateDictionary = _stateMethods[attributeType]; diff --git a/YamlDotNet/Serialization/ObjectGraphVisitors/DefaultExclusiveObjectGraphVisitor.cs b/YamlDotNet/Serialization/ObjectGraphVisitors/DefaultExclusiveObjectGraphVisitor.cs index 91acd03f0..863bc870b 100644 --- a/YamlDotNet/Serialization/ObjectGraphVisitors/DefaultExclusiveObjectGraphVisitor.cs +++ b/YamlDotNet/Serialization/ObjectGraphVisitors/DefaultExclusiveObjectGraphVisitor.cs @@ -21,6 +21,7 @@ using System; using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; using YamlDotNet.Core; namespace YamlDotNet.Serialization.ObjectGraphVisitors @@ -33,7 +34,11 @@ public DefaultExclusiveObjectGraphVisitor(IObjectGraphVisitor nextVisi { } - private static object? GetDefault(Type type) + private static object? GetDefault( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] +#endif + Type type) { return type.IsValueType() ? Activator.CreateInstance(type) : null; } diff --git a/YamlDotNet/Serialization/Utilities/ObjectAnchorCollection.cs b/YamlDotNet/Serialization/Utilities/ObjectAnchorCollection.cs deleted file mode 100644 index 1762bc50f..000000000 --- a/YamlDotNet/Serialization/Utilities/ObjectAnchorCollection.cs +++ /dev/null @@ -1,75 +0,0 @@ -// This file is part of YamlDotNet - A .NET library for YAML. -// Copyright (c) Antoine Aubry and contributors -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using YamlDotNet.Core; - -namespace YamlDotNet.Serialization.Utilities -{ - internal sealed class ObjectAnchorCollection - { - private readonly IDictionary objectsByAnchor = new Dictionary(); - private readonly IDictionary anchorsByObject = new Dictionary(); - - /// - /// Adds the specified anchor. - /// - /// The anchor. - /// The @object. - public void Add(string anchor, object @object) - { - objectsByAnchor.Add(anchor, @object); - if (@object != null) - { - anchorsByObject.Add(@object, anchor); - } - } - - /// - /// Gets the anchor for the specified object. - /// - /// The object. - /// The anchor. - /// - public bool TryGetAnchor(object @object, [MaybeNullWhen(false)] out string? anchor) - { - return anchorsByObject.TryGetValue(@object, out anchor); - } - - /// - /// Gets the with the specified anchor. - /// - /// - public object this[string anchor] - { - get - { - if (objectsByAnchor.TryGetValue(anchor, out var value)) - { - return value; - } - - throw new AnchorNotFoundException($"The anchor '{anchor}' does not exists"); - } - } - } -} diff --git a/YamlDotNet/Serialization/Utilities/ReflectionUtility.cs b/YamlDotNet/Serialization/Utilities/ReflectionUtility.cs index d993e0bba..8a0e6efcf 100644 --- a/YamlDotNet/Serialization/Utilities/ReflectionUtility.cs +++ b/YamlDotNet/Serialization/Utilities/ReflectionUtility.cs @@ -21,12 +21,17 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; namespace YamlDotNet.Serialization.Utilities { internal static class ReflectionUtility { - public static Type? GetImplementedGenericInterface(Type type, Type genericInterfaceType) + public static Type? GetImplementedGenericInterface( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] +#endif + Type type, Type genericInterfaceType) { foreach (var interfacetype in GetImplementedInterfaces(type)) { @@ -38,7 +43,11 @@ internal static class ReflectionUtility return null; } - public static IEnumerable GetImplementedInterfaces(Type type) + public static IEnumerable GetImplementedInterfaces( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] +#endif + Type type) { if (type.IsInterface()) { diff --git a/YamlDotNet/Serialization/Utilities/TypeConverter.cs b/YamlDotNet/Serialization/Utilities/TypeConverter.cs index 7bd79065c..958cb6af9 100644 --- a/YamlDotNet/Serialization/Utilities/TypeConverter.cs +++ b/YamlDotNet/Serialization/Utilities/TypeConverter.cs @@ -27,6 +27,7 @@ using System.Globalization; using System.Reflection; using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; namespace YamlDotNet.Serialization.Utilities { @@ -42,6 +43,9 @@ public static partial class TypeConverter /// The value to convert. /// Naming convention to apply to enums. /// +#if NET6_0_OR_GREATER + [RequiresUnreferencedCode("")] +#endif public static T ChangeType(object? value, INamingConvention enumNamingConvention) { return (T)ChangeType(value, typeof(T), enumNamingConvention)!; // This cast should always be valid @@ -55,6 +59,9 @@ public static T ChangeType(object? value, INamingConvention enumNamingConvent /// The provider. /// Naming convention to apply to enums. /// +#if NET6_0_OR_GREATER + [RequiresUnreferencedCode("")] +#endif public static T ChangeType(object? value, IFormatProvider provider, INamingConvention enumNamingConvention) { return (T)ChangeType(value, typeof(T), provider, enumNamingConvention)!; // This cast should always be valid @@ -68,6 +75,9 @@ public static T ChangeType(object? value, IFormatProvider provider, INamingCo /// The culture. /// Naming convention to apply to enums. /// +#if NET6_0_OR_GREATER + [RequiresUnreferencedCode("")] +#endif public static T ChangeType(object? value, CultureInfo culture, INamingConvention enumNamingConvention) { return (T)ChangeType(value, typeof(T), culture, enumNamingConvention)!; // This cast should always be valid @@ -80,6 +90,9 @@ public static T ChangeType(object? value, CultureInfo culture, INamingConvent /// The type to which the value is to be converted. /// Naming convention to apply to enums. /// +#if NET6_0_OR_GREATER + [RequiresUnreferencedCode("")] +#endif public static object? ChangeType(object? value, Type destinationType, INamingConvention enumNamingConvention) { return ChangeType(value, destinationType, CultureInfo.InvariantCulture, enumNamingConvention); @@ -93,6 +106,9 @@ public static T ChangeType(object? value, CultureInfo culture, INamingConvent /// The format provider. /// Naming convention to apply to enums. /// +#if NET6_0_OR_GREATER + [RequiresUnreferencedCode("")] +#endif public static object? ChangeType(object? value, Type destinationType, IFormatProvider provider, INamingConvention enumNamingConvention) { return ChangeType(value, destinationType, new CultureInfoAdapter(CultureInfo.CurrentCulture, provider), enumNamingConvention); @@ -106,6 +122,9 @@ public static T ChangeType(object? value, CultureInfo culture, INamingConvent /// The culture. /// Naming convention to apply to enums. /// +#if NET6_0_OR_GREATER + [RequiresUnreferencedCode("")] +#endif public static object? ChangeType(object? value, Type destinationType, CultureInfo culture, INamingConvention enumNamingConvention) { // Handle null and DBNull @@ -262,8 +281,16 @@ partial class TypeConverter #if NET20 || NET35 || NET45 [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.LinkDemand, Name = "FullTrust")] #endif - public static void RegisterTypeConverter() - where TConverter : System.ComponentModel.TypeConverter + public static void RegisterTypeConverter< +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] +#endif + TConvertible, +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] +#endif + TConverter>() + where TConverter : System.ComponentModel.TypeConverter { var alreadyRegistered = TypeDescriptor.GetAttributes(typeof(TConvertible)) .OfType() diff --git a/YamlDotNet/Serialization/YamlAttributeOverrides.cs b/YamlDotNet/Serialization/YamlAttributeOverrides.cs index efd82a15c..0ba38d564 100644 --- a/YamlDotNet/Serialization/YamlAttributeOverrides.cs +++ b/YamlDotNet/Serialization/YamlAttributeOverrides.cs @@ -83,7 +83,11 @@ public override int GetHashCode() /// Checks whether this mapping matches the specified type, and returns a value indicating the match priority. /// /// The priority of the match. Higher values have more priority. Zero indicates no match. - public int Matches(Type matchType) + public int Matches( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] +#endif + Type matchType) { var currentPriority = 0; var currentType = matchType; @@ -109,7 +113,11 @@ public int Matches(Type matchType) private readonly Dictionary> overrides = new Dictionary>(); [return: MaybeNull] - public T GetAttribute(Type type, string member) where T : Attribute + public T GetAttribute( +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] +#endif + Type type, string member) where T : Attribute { if (overrides.TryGetValue(new AttributeKey(typeof(T), member), out var mappings)) { diff --git a/YamlDotNet/YamlDotNet.csproj b/YamlDotNet/YamlDotNet.csproj index 482c5fb2b..8937dc0f5 100644 --- a/YamlDotNet/YamlDotNet.csproj +++ b/YamlDotNet/YamlDotNet.csproj @@ -18,6 +18,7 @@ 8.0 enable + true false $(TargetFramework) @@ -38,14 +39,17 @@ true + 10.0 true + 10.0 true + 10.0