diff --git a/build/TrimmingEnable.props b/build/TrimmingEnable.props
index 6bb5579b24..1fa14cb022 100644
--- a/build/TrimmingEnable.props
+++ b/build/TrimmingEnable.props
@@ -11,8 +11,7 @@
true
-
-
+
true
$(WarningsAsErrors);IL2000;IL2001;IL2002;IL2003;IL2004;IL2005;IL2006;IL2007;IL2008;IL2009;IL2010;IL2011;IL2012;IL2013;IL2014;IL2015;IL2016;IL2017;IL2018;IL2019;IL2020;IL2021;IL2022;IL2023;IL2024;IL2025;IL2026;IL2027;IL2028;IL2029;IL2030;IL2031;IL2032;IL2033;IL2034;IL2035;IL2036;IL2037;IL2038;IL2039;IL2040;IL2041;IL2042;IL2043;IL2044;IL2045;IL2046;IL2047;IL2048;IL2049;IL2050;IL2051;IL2052;IL2053;IL2054;IL2055;IL2056;IL2057;IL2058;IL2059;IL2060;IL2061;IL2062;IL2063;IL2064;IL2065;IL2066;IL2067;IL2068;IL2069;IL2070;IL2071;IL2072;IL2073;IL2074;IL2075;IL2076;IL2077;IL2078;IL2079;IL2080;IL2081;IL2082;IL2083;IL2084;IL2085;IL2086;IL2087;IL2088;IL2089;IL2090;IL2091;IL2092;IL2093;IL2094;IL2095;IL2096;IL2097;IL2098;IL2099;IL2100;IL2101;IL2102;IL2103;IL2104;IL2105;IL2106;IL2107;IL2108;IL2109;IL2110;IL2111;IL2112;IL2113;IL2114;IL2115;IL2116;IL2117;IL2118;IL2119;IL2120;IL2121;IL2122;IL2123;IL2124;IL2125;IL2126;IL2127;IL2128;IL2129;IL2130;IL2131;IL2132;IL2133;IL2134;IL2135;IL2136;IL2137;IL2138;IL2139;IL2140;IL2141;IL2142;IL2143;IL2144;IL2145;IL2146;IL2147;IL2148;IL2149;IL2150;IL2151;IL2152;IL2153;IL2154;IL2155;IL2156;IL2157
diff --git a/src/Avalonia.Base/Data/Core/Plugins/BindingPlugins.cs b/src/Avalonia.Base/Data/Core/Plugins/BindingPlugins.cs
index 6164d8ec33..5c2d9aaddf 100644
--- a/src/Avalonia.Base/Data/Core/Plugins/BindingPlugins.cs
+++ b/src/Avalonia.Base/Data/Core/Plugins/BindingPlugins.cs
@@ -12,7 +12,6 @@ namespace Avalonia.Data.Core.Plugins
internal static readonly List s_propertyAccessors = new()
{
new AvaloniaPropertyAccessorPlugin(),
- new ReflectionMethodAccessorPlugin(),
new InpcPropertyAccessorPlugin(),
};
@@ -29,6 +28,20 @@ namespace Avalonia.Data.Core.Plugins
new ObservableStreamPlugin(),
};
+ static BindingPlugins()
+ {
+ // When building with AOT, don't create ReflectionMethodAccessorPlugin instance.
+ // This branch can be eliminated in compile time with AOT.
+#if NET6_0_OR_GREATER
+ if (System.Runtime.CompilerServices.RuntimeFeature.IsDynamicCodeSupported)
+#else
+ if (true)
+#endif
+ {
+ s_propertyAccessors.Insert(1, new ReflectionMethodAccessorPlugin());
+ }
+ }
+
///
/// An ordered collection of property accessor plugins that can be used to customize
/// the reading and subscription of property values on a type.
diff --git a/src/Avalonia.Base/Data/Core/TargetTypeConverter.cs b/src/Avalonia.Base/Data/Core/TargetTypeConverter.cs
index 57018bff55..7f934c4e41 100644
--- a/src/Avalonia.Base/Data/Core/TargetTypeConverter.cs
+++ b/src/Avalonia.Base/Data/Core/TargetTypeConverter.cs
@@ -23,6 +23,11 @@ internal abstract class TargetTypeConverter
private class DefaultConverter : TargetTypeConverter
{
+ // TypeDescriptor.GetConverter might require unreferenced code for some generic types.
+ // But it's normally not the case in Avalonia. Additionally, compiled bindings will preserve referenced types.
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.TypeConversionSupressWarningMessage)]
+ [UnconditionalSuppressMessage("Trimming", "IL2067", Justification = TrimmingMessages.TypeConversionSupressWarningMessage)]
+ [UnconditionalSuppressMessage("Trimming", "IL2072", Justification = TrimmingMessages.TypeConversionSupressWarningMessage)]
public override bool TryConvert(object? value, Type type, CultureInfo culture, out object? result)
{
if (value?.GetType() == type)
@@ -66,9 +71,6 @@ internal abstract class TargetTypeConverter
return true;
}
-#pragma warning disable IL2026
-#pragma warning disable IL2067
-#pragma warning disable IL2072
// TODO: TypeConverters are not trimming friendly in some edge cases, we probably need
// to make compiled bindings emit conversion code at compile-time.
var toTypeConverter = TypeDescriptor.GetConverter(t);
@@ -122,8 +124,6 @@ internal abstract class TargetTypeConverter
return false;
}
}
-#pragma warning restore IL2067
-#pragma warning restore IL2026
if (value is IConvertible convertible)
{
diff --git a/src/Avalonia.Base/Diagnostics/TrimmingMessages.cs b/src/Avalonia.Base/Diagnostics/TrimmingMessages.cs
index 37c2831a50..ce9c9e187b 100644
--- a/src/Avalonia.Base/Diagnostics/TrimmingMessages.cs
+++ b/src/Avalonia.Base/Diagnostics/TrimmingMessages.cs
@@ -27,4 +27,5 @@ internal static class TrimmingMessages
public const string XamlTypeResolvedRequiresUnreferenceCodeMessage = "XamlTypeResolver might require unreferenced code.";
public const string IgnoreNativeAotSupressWarningMessage = "This method is not supported by NativeAOT.";
+ public const string DesignTimeSupressWarningMessage = "This method is design time only.";
}
diff --git a/src/Avalonia.Base/Rendering/Composition/Expressions/Expression.cs b/src/Avalonia.Base/Rendering/Composition/Expressions/Expression.cs
index 11a0b9e227..d9f39d0ce0 100644
--- a/src/Avalonia.Base/Rendering/Composition/Expressions/Expression.cs
+++ b/src/Avalonia.Base/Rendering/Composition/Expressions/Expression.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Reflection;
using Avalonia.Rendering.Composition.Server;
@@ -27,6 +28,7 @@ namespace Avalonia.Rendering.Composition.Expressions
protected abstract string Print();
public override string ToString() => Print();
+ [UnconditionalSuppressMessage("Trimming", "IL3050", Justification = TrimmingMessages.DesignTimeSupressWarningMessage)]
internal static string OperatorName(ExpressionType t)
{
var attr = typeof(ExpressionType).GetMember(t.ToString())[0]
diff --git a/src/Browser/Avalonia.Browser/Rendering/RenderWorker.cs b/src/Browser/Avalonia.Browser/Rendering/RenderWorker.cs
index 4ddd1b9088..6fe8d2ee73 100644
--- a/src/Browser/Avalonia.Browser/Rendering/RenderWorker.cs
+++ b/src/Browser/Avalonia.Browser/Rendering/RenderWorker.cs
@@ -58,12 +58,10 @@ public partial class RenderWorker
"System.Runtime.InteropServices.JavaScript")]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, "System.Runtime.InteropServices.JavaScript.JSHostImplementation",
"System.Runtime.InteropServices.JavaScript")]
- [UnconditionalSuppressMessage("Trimming",
- "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code",
- Justification = "Private runtime API")]
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Private runtime API")]
+ [UnconditionalSuppressMessage("Trimming", "IL2075", Justification = "Private runtime API")]
static JSWebWorkerClone()
{
-#pragma warning disable IL2075
var syncContext = typeof(System.Runtime.InteropServices.JavaScript.JSHost)
.Assembly!.GetType("System.Runtime.InteropServices.JavaScript.JSSynchronizationContext")!;
var hostImpl = typeof(System.Runtime.InteropServices.JavaScript.JSHost)
@@ -71,7 +69,6 @@ public partial class RenderWorker
_setExtLoop = hostImpl.GetMethod("SetHasExternalEventLoop")!;
_intallInterop = syncContext.GetMethod("InstallWebWorkerInterop")!;
-#pragma warning restore IL2075
}
public static Task RunAsync(Func run)
diff --git a/src/Windows/Avalonia.Win32/WinRT/WinRTInspectable.cs b/src/Windows/Avalonia.Win32/WinRT/WinRTInspectable.cs
index aabf148e75..602375758e 100644
--- a/src/Windows/Avalonia.Win32/WinRT/WinRTInspectable.cs
+++ b/src/Windows/Avalonia.Win32/WinRT/WinRTInspectable.cs
@@ -1,4 +1,5 @@
using System;
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@@ -6,6 +7,7 @@ using MicroCom.Runtime;
namespace Avalonia.Win32.WinRT
{
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)]
internal class WinRTInspectable : IInspectable, IMicroComShadowContainer
{
public virtual void Dispose()