From 93e43a558e0ec44f0d7e32d998e51ef1ca4f24cb Mon Sep 17 00:00:00 2001 From: Chris Pulman Date: Fri, 1 Aug 2025 01:23:15 +0100 Subject: [PATCH 1/2] Add AOT reflection warnings for .NET 6+ methods Added [RequiresDynamicCode] and [RequiresUnreferencedCode] attributes to methods and interfaces that use reflection and are not compatible with AOT environments in .NET 6 or greater. This change improves compatibility and provides clearer warnings for developers targeting AOT scenarios. --- src/ReactiveUI/Expression/Reflection.cs | 4 + .../Interfaces/ISuspensionDriver.cs | 4 + src/ReactiveUI/Mixins/AutoPersistHelper.cs | 28 ++++- .../android/BundleSuspensionDriver.cs | 8 +- .../Platforms/android/ControlFetcherMixin.cs | 24 ++++- .../android/PlatformRegistrations.cs | 4 - .../AppSupportJsonSuspensionDriver.cs | 8 +- .../Platforms/mac/PlatformRegistrations.cs | 4 - .../Platforms/net/PlatformRegistrations.cs | 4 - .../uikit-common/PlatformRegistrations.cs | 4 - .../ReactiveCommand/ReactiveCommand.cs | 100 ++++++++++++++++-- src/ReactiveUI/Registration/Registrations.cs | 4 - src/ReactiveUI/RxApp.cs | 3 + src/ReactiveUI/View/DefaultViewLocator.cs | 15 ++- 14 files changed, 167 insertions(+), 47 deletions(-) diff --git a/src/ReactiveUI/Expression/Reflection.cs b/src/ReactiveUI/Expression/Reflection.cs index 012cffb623..df7aac436f 100644 --- a/src/ReactiveUI/Expression/Reflection.cs +++ b/src/ReactiveUI/Expression/Reflection.cs @@ -395,6 +395,10 @@ public static bool IsStatic(this PropertyInfo item) // TODO: Create Test return method.IsStatic; } +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif internal static IObservable ViewModelWhenAnyValue(TViewModel? viewModel, TView view, Expression? expression) where TView : class, IViewFor where TViewModel : class => diff --git a/src/ReactiveUI/Interfaces/ISuspensionDriver.cs b/src/ReactiveUI/Interfaces/ISuspensionDriver.cs index 30704e7157..fc49763657 100644 --- a/src/ReactiveUI/Interfaces/ISuspensionDriver.cs +++ b/src/ReactiveUI/Interfaces/ISuspensionDriver.cs @@ -37,5 +37,9 @@ public interface ISuspensionDriver /// Invalidates the application state (i.e. deletes it from disk). /// /// A completed observable. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif IObservable InvalidateState(); } diff --git a/src/ReactiveUI/Mixins/AutoPersistHelper.cs b/src/ReactiveUI/Mixins/AutoPersistHelper.cs index f1cd3cb630..a65a2d929e 100644 --- a/src/ReactiveUI/Mixins/AutoPersistHelper.cs +++ b/src/ReactiveUI/Mixins/AutoPersistHelper.cs @@ -22,8 +22,8 @@ public static class AutoPersistHelper { private static readonly MemoizingMRUCache> _persistablePropertiesCache = new( static (type, _) => type.GetTypeInfo().DeclaredProperties - .Where(x => x.CustomAttributes.Any(y => typeof(DataMemberAttribute).GetTypeInfo().IsAssignableFrom(y.AttributeType.GetTypeInfo()))) - .ToDictionary(k => k.Name, _ => true), + .Where(x => x.CustomAttributes.Any(y => typeof(DataMemberAttribute).GetTypeInfo().IsAssignableFrom(y.AttributeType.GetTypeInfo()))) + .ToDictionary(k => k.Name, _ => true), RxApp.SmallCacheLimit); private static readonly MemoizingMRUCache _dataContractCheckCache = new( @@ -49,6 +49,10 @@ public static class AutoPersistHelper /// it is possible that it will never be saved. /// /// A Disposable to disable automatic persistence. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static IDisposable AutoPersist(this T @this, Func> doPersist, TimeSpan? interval = null) where T : IReactiveObject => @this.AutoPersist(doPersist, Observable.Never, interval); @@ -76,6 +80,10 @@ public static IDisposable AutoPersist(this T @this, Func /// it is possible that it will never be saved. /// /// A Disposable to disable automatic persistence. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static IDisposable AutoPersist(this T @this, Func> doPersist, IObservable manualSaveSignal, TimeSpan? interval = null) where T : IReactiveObject { @@ -127,6 +135,10 @@ public static IDisposable AutoPersist(this T @this, Func /// A Disposable to disable automatic persistence. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static IDisposable AutoPersistCollection(this ObservableCollection @this, Func> doPersist, TimeSpan? interval = null) // TODO: Create Test where TItem : IReactiveObject => AutoPersistCollection(@this, doPersist, Observable.Never, interval); @@ -151,6 +163,10 @@ public static IDisposable AutoPersistCollection(this ObservableCollection /// it is possible that it will never be saved. /// /// A Disposable to disable automatic persistence. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static IDisposable AutoPersistCollection(this ObservableCollection @this, Func> doPersist, IObservable manualSaveSignal, TimeSpan? interval = null) where TItem : IReactiveObject => AutoPersistCollection, TDontCare>(@this, doPersist, manualSaveSignal, interval); @@ -175,6 +191,10 @@ public static IDisposable AutoPersistCollection(this Observabl /// it is possible that it will never be saved. /// /// A Disposable to disable automatic persistence. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static IDisposable AutoPersistCollection(this ReadOnlyObservableCollection @this, Func> doPersist, IObservable manualSaveSignal, TimeSpan? interval = null) // TODO: Create Test where TItem : IReactiveObject => AutoPersistCollection, TDontCare>(@this, doPersist, manualSaveSignal, interval); @@ -200,6 +220,10 @@ public static IDisposable AutoPersistCollection(this ReadOnlyO /// it is possible that it will never be saved. /// /// A Disposable to disable automatic persistence. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static IDisposable AutoPersistCollection(this TCollection @this, Func> doPersist, IObservable manualSaveSignal, TimeSpan? interval = null) // TODO: Create Test where TItem : IReactiveObject where TCollection : INotifyCollectionChanged, IEnumerable diff --git a/src/ReactiveUI/Platforms/android/BundleSuspensionDriver.cs b/src/ReactiveUI/Platforms/android/BundleSuspensionDriver.cs index 56a5ed0197..416d063250 100644 --- a/src/ReactiveUI/Platforms/android/BundleSuspensionDriver.cs +++ b/src/ReactiveUI/Platforms/android/BundleSuspensionDriver.cs @@ -11,10 +11,6 @@ namespace ReactiveUI; /// /// Loads and saves state to persistent storage. /// -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public class BundleSuspensionDriver : ISuspensionDriver { /// @@ -71,6 +67,10 @@ public IObservable SaveState(object state) // TODO: Create Test } /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public IObservable InvalidateState() // TODO: Create Test { try diff --git a/src/ReactiveUI/Platforms/android/ControlFetcherMixin.cs b/src/ReactiveUI/Platforms/android/ControlFetcherMixin.cs index e910fab6da..e71a5c5a1d 100644 --- a/src/ReactiveUI/Platforms/android/ControlFetcherMixin.cs +++ b/src/ReactiveUI/Platforms/android/ControlFetcherMixin.cs @@ -17,10 +17,6 @@ namespace ReactiveUI; /// Fragments via property names, similar to Butter Knife, as well as allows /// you to fetch controls manually. /// -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public static partial class ControlFetcherMixin { private static readonly ConcurrentDictionary> _controlIds = new(); @@ -47,6 +43,10 @@ public static partial class ControlFetcherMixin /// The assembly containing the user-defined view. /// The property. /// The return view. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static View? GetControl(this View view, Assembly assembly, [CallerMemberName] string? propertyName = null) // TODO: Create Test => GetCachedControl(propertyName, view, () => view.FindViewById(GetControlIdByName(assembly, propertyName))); @@ -55,6 +55,10 @@ public static partial class ControlFetcherMixin /// /// The layout view host. /// The resolve members. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static void WireUpControls(this ILayoutViewHost layoutHost, ResolveStrategy resolveMembers = ResolveStrategy.Implicit) // TODO: Create Test { ArgumentNullException.ThrowIfNull(layoutHost); @@ -80,6 +84,10 @@ public static void WireUpControls(this ILayoutViewHost layoutHost, ResolveStrate /// /// The view. /// The resolve members. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static void WireUpControls(this View view, ResolveStrategy resolveMembers = ResolveStrategy.Implicit) // TODO: Create Test { ArgumentNullException.ThrowIfNull(view); @@ -111,6 +119,10 @@ public static void WireUpControls(this View view, ResolveStrategy resolveMembers /// The fragment. /// The inflated view. /// The resolve members. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static void WireUpControls(this Fragment fragment, View inflatedView, ResolveStrategy resolveMembers = ResolveStrategy.Implicit) // TODO: Create Test { ArgumentNullException.ThrowIfNull(fragment); @@ -140,6 +152,10 @@ public static void WireUpControls(this Fragment fragment, View inflatedView, Res /// /// The Activity. /// The resolve members. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static void WireUpControls(this Activity activity, ResolveStrategy resolveMembers = ResolveStrategy.Implicit) // TODO: Create Test { ArgumentNullException.ThrowIfNull(activity); diff --git a/src/ReactiveUI/Platforms/android/PlatformRegistrations.cs b/src/ReactiveUI/Platforms/android/PlatformRegistrations.cs index de2f3a89bb..a574113bc9 100644 --- a/src/ReactiveUI/Platforms/android/PlatformRegistrations.cs +++ b/src/ReactiveUI/Platforms/android/PlatformRegistrations.cs @@ -9,10 +9,6 @@ namespace ReactiveUI; /// Android platform registrations. /// /// -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public class PlatformRegistrations : IWantsToRegisterStuff { /// diff --git a/src/ReactiveUI/Platforms/apple-common/AppSupportJsonSuspensionDriver.cs b/src/ReactiveUI/Platforms/apple-common/AppSupportJsonSuspensionDriver.cs index 2e1661353f..6b4cb9bab5 100644 --- a/src/ReactiveUI/Platforms/apple-common/AppSupportJsonSuspensionDriver.cs +++ b/src/ReactiveUI/Platforms/apple-common/AppSupportJsonSuspensionDriver.cs @@ -12,10 +12,6 @@ namespace ReactiveUI; /// /// Loads and saves state to persistent storage. /// -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public class AppSupportJsonSuspensionDriver : ISuspensionDriver { /// @@ -68,6 +64,10 @@ public IObservable SaveState(object state) } /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public IObservable InvalidateState() { try diff --git a/src/ReactiveUI/Platforms/mac/PlatformRegistrations.cs b/src/ReactiveUI/Platforms/mac/PlatformRegistrations.cs index 7288df16ef..cb060e3a5b 100644 --- a/src/ReactiveUI/Platforms/mac/PlatformRegistrations.cs +++ b/src/ReactiveUI/Platforms/mac/PlatformRegistrations.cs @@ -9,10 +9,6 @@ namespace ReactiveUI; /// Mac platform registrations. /// /// -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public class PlatformRegistrations : IWantsToRegisterStuff { /// diff --git a/src/ReactiveUI/Platforms/net/PlatformRegistrations.cs b/src/ReactiveUI/Platforms/net/PlatformRegistrations.cs index d5b5ea6720..ef4cf90f65 100644 --- a/src/ReactiveUI/Platforms/net/PlatformRegistrations.cs +++ b/src/ReactiveUI/Platforms/net/PlatformRegistrations.cs @@ -10,10 +10,6 @@ namespace ReactiveUI; /// .NET Framework platform registrations. /// /// -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public class PlatformRegistrations : IWantsToRegisterStuff { /// diff --git a/src/ReactiveUI/Platforms/uikit-common/PlatformRegistrations.cs b/src/ReactiveUI/Platforms/uikit-common/PlatformRegistrations.cs index 7686a8217e..7a6505603c 100644 --- a/src/ReactiveUI/Platforms/uikit-common/PlatformRegistrations.cs +++ b/src/ReactiveUI/Platforms/uikit-common/PlatformRegistrations.cs @@ -9,10 +9,6 @@ namespace ReactiveUI; /// UIKit platform registrations. /// /// -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public class PlatformRegistrations : IWantsToRegisterStuff { /// diff --git a/src/ReactiveUI/ReactiveCommand/ReactiveCommand.cs b/src/ReactiveUI/ReactiveCommand/ReactiveCommand.cs index eb1c828f78..45b2d3b9bc 100644 --- a/src/ReactiveUI/ReactiveCommand/ReactiveCommand.cs +++ b/src/ReactiveUI/ReactiveCommand/ReactiveCommand.cs @@ -59,10 +59,6 @@ namespace ReactiveUI; /// /// /// -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public static class ReactiveCommand { /// @@ -75,6 +71,10 @@ public static class ReactiveCommand /// The ReactiveCommand instance. /// /// execute. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand Create( Action execute, IObservable? canExecute = null, @@ -106,6 +106,10 @@ public static ReactiveCommand Create( /// The ReactiveCommand instance. /// /// execute. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateRunInBackground( Action execute, IObservable? canExecute = null, @@ -129,6 +133,10 @@ public static ReactiveCommand CreateRunInBackground( /// The ReactiveCommand instance. /// /// execute. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand Create( Func execute, IObservable? canExecute = null, @@ -161,6 +169,10 @@ public static ReactiveCommand Create( /// The ReactiveCommand instance. /// /// execute. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateRunInBackground( Func execute, IObservable? canExecute = null, @@ -183,6 +195,10 @@ public static ReactiveCommand CreateRunInBackground( /// The ReactiveCommand instance. /// /// execute. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand Create( Action execute, IObservable? canExecute = null, @@ -215,6 +231,10 @@ public static ReactiveCommand Create( /// The ReactiveCommand instance. /// /// execute. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateRunInBackground( Action execute, IObservable? canExecute = null, @@ -239,6 +259,10 @@ public static ReactiveCommand CreateRunInBackground( /// The ReactiveCommand instance. /// /// execute. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand Create( Func execute, IObservable? canExecute = null, @@ -272,6 +296,10 @@ public static ReactiveCommand Create( /// The ReactiveCommand instance. /// /// execute. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateRunInBackground( Func execute, IObservable? canExecute = null, @@ -305,6 +333,10 @@ public static ReactiveCommand CreateRunInBackground /// The type of the command's result. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static CombinedReactiveCommand CreateCombined( IEnumerable> childCommands, IObservable? canExecute = null, @@ -333,6 +365,10 @@ public static CombinedReactiveCommand CreateCombined /// The type of the command's result. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateFromObservable( Func> execute, IObservable? canExecute = null, @@ -367,6 +403,10 @@ public static ReactiveCommand CreateFromObservable( /// /// The type of the command's result. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateFromObservable( Func> execute, IObservable? canExecute = null, @@ -398,6 +438,10 @@ public static ReactiveCommand CreateFromObservable /// The type of the command's result. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateFromTask( Func> execute, IObservable? canExecute = null, @@ -426,6 +470,10 @@ public static ReactiveCommand CreateFromTask( /// /// The type of the command's result. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateFromTask( Func> execute, IObservable? canExecute = null, @@ -451,6 +499,10 @@ public static ReactiveCommand CreateFromTask( /// /// The ReactiveCommand instance. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateFromTask( Func execute, IObservable? canExecute = null, @@ -476,6 +528,10 @@ public static ReactiveCommand CreateFromTask( /// /// The ReactiveCommand instance. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateFromTask( Func execute, IObservable? canExecute = null, @@ -507,6 +563,10 @@ public static ReactiveCommand CreateFromTask( /// /// The type of the command's result. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateFromTask( Func> execute, IObservable? canExecute = null, @@ -541,6 +601,10 @@ public static ReactiveCommand CreateFromTask( /// /// The type of the command's result. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateFromTask( Func> execute, IObservable? canExecute = null, @@ -572,6 +636,10 @@ public static ReactiveCommand CreateFromTask( /// /// The type of the parameter passed through to command execution. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateFromTask( Func execute, IObservable? canExecute = null, @@ -603,6 +671,10 @@ public static ReactiveCommand CreateFromTask( /// /// The type of the parameter passed through to command execution. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif public static ReactiveCommand CreateFromTask( Func execute, IObservable? canExecute = null, @@ -628,6 +700,10 @@ public static ReactiveCommand CreateFromTask( /// The ReactiveCommand instance. /// /// execute. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif internal static ReactiveCommand CreateFromObservableCancellable( Func Result, Action Cancel)>> execute, IObservable? canExecute = null, @@ -662,6 +738,10 @@ internal static ReactiveCommand CreateFromObservableCancellable /// /// The type of the command's result. /// +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif internal static ReactiveCommand CreateFromObservableCancellable( Func Result, Action Cancel)>> execute, IObservable? canExecute = null, @@ -696,10 +776,6 @@ internal static ReactiveCommand CreateFromObservableCancellable "StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleType", Justification = "Same class just generic.")] -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public class ReactiveCommand : ReactiveCommandBase { private readonly IObservable _canExecute; @@ -726,6 +802,10 @@ public class ReactiveCommand : ReactiveCommandBase /// Thrown if any dependent parameters are null. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif protected internal ReactiveCommand( Func Result, Action Cancel)>> execute, IObservable? canExecute, @@ -780,6 +860,10 @@ protected internal ReactiveCommand( /// execute. /// /// Thrown if any dependent parameters are null. +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif protected internal ReactiveCommand( Func> execute, IObservable? canExecute, diff --git a/src/ReactiveUI/Registration/Registrations.cs b/src/ReactiveUI/Registration/Registrations.cs index 852031b49c..60bc987c5a 100644 --- a/src/ReactiveUI/Registration/Registrations.cs +++ b/src/ReactiveUI/Registration/Registrations.cs @@ -13,10 +13,6 @@ namespace ReactiveUI; /// To get these registrations after the main ReactiveUI Initialization use the /// DependencyResolverMixins.InitializeReactiveUI() extension method. /// -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public class Registrations : IWantsToRegisterStuff { /// diff --git a/src/ReactiveUI/RxApp.cs b/src/ReactiveUI/RxApp.cs index 2b0b0481a8..5244261053 100644 --- a/src/ReactiveUI/RxApp.cs +++ b/src/ReactiveUI/RxApp.cs @@ -239,6 +239,9 @@ private static IScheduler UnitTestMainThreadScheduler set => _unitTestMainThreadScheduler = value; } + /// + /// Set up default initializations. + /// [MethodImpl(MethodImplOptions.NoOptimization)] internal static void EnsureInitialized() { diff --git a/src/ReactiveUI/View/DefaultViewLocator.cs b/src/ReactiveUI/View/DefaultViewLocator.cs index 388d9ad304..16fa5d39fc 100644 --- a/src/ReactiveUI/View/DefaultViewLocator.cs +++ b/src/ReactiveUI/View/DefaultViewLocator.cs @@ -12,10 +12,6 @@ namespace ReactiveUI; /// Default implementation for . The default /// behavior is to replace instances of "View" with "ViewMode" in the Fully Qualified Name of the ViewModel type. /// -#if NET6_0_OR_GREATER -[RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] -[RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] -#endif public sealed class DefaultViewLocator : IViewLocator { /// @@ -131,6 +127,10 @@ internal DefaultViewLocator(Func? viewModelToViewFunc = null) => return null; } +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif private static Type? ToggleViewModelType(Type viewModelType) { var viewModelTypeName = viewModelType.AssemblyQualifiedName; @@ -180,7 +180,8 @@ private static string InterfaceifyTypeName(string typeName) } #if NET6_0_OR_GREATER - [RequiresDynamicCode("The method is used to resolve views for view models.")] + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] #endif private IViewFor? AttemptViewResolutionFor(Type? viewModelType, string? contract) { @@ -208,6 +209,10 @@ private static string InterfaceifyTypeName(string typeName) return AttemptViewResolution(proposedViewTypeName, contract); } +#if NET6_0_OR_GREATER + [RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] +#endif private IViewFor? AttemptViewResolution(string? viewTypeName, string? contract) { try From 916b3500ac6e607388182104265b2787b87b6392 Mon Sep 17 00:00:00 2001 From: Chris Pulman Date: Fri, 1 Aug 2025 01:46:46 +0100 Subject: [PATCH 2/2] Update API Tests --- ...valTests.ReactiveUI.DotNet8_0.verified.txt | 68 ++++++++++++++++--- ...valTests.ReactiveUI.DotNet9_0.verified.txt | 68 ++++++++++++++++--- 2 files changed, 114 insertions(+), 22 deletions(-) diff --git a/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.DotNet8_0.verified.txt b/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.DotNet8_0.verified.txt index 69fd7a6738..76e299cd53 100644 --- a/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.DotNet8_0.verified.txt +++ b/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.DotNet8_0.verified.txt @@ -26,16 +26,28 @@ namespace ReactiveUI public static System.IDisposable ActOnEveryObject(this TCollection collection, System.Action onAdd, System.Action onRemove) where TItem : ReactiveUI.IReactiveObject where TCollection : System.Collections.Specialized.INotifyCollectionChanged, System.Collections.Generic.IEnumerable { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersist(this T @this, System.Func> doPersist, System.TimeSpan? interval = default) where T : ReactiveUI.IReactiveObject { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersist(this T @this, System.Func> doPersist, System.IObservable manualSaveSignal, System.TimeSpan? interval = default) where T : ReactiveUI.IReactiveObject { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersistCollection(this System.Collections.ObjectModel.ObservableCollection @this, System.Func> doPersist, System.TimeSpan? interval = default) where TItem : ReactiveUI.IReactiveObject { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersistCollection(this System.Collections.ObjectModel.ObservableCollection @this, System.Func> doPersist, System.IObservable manualSaveSignal, System.TimeSpan? interval = default) where TItem : ReactiveUI.IReactiveObject { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersistCollection(this System.Collections.ObjectModel.ReadOnlyObservableCollection @this, System.Func> doPersist, System.IObservable manualSaveSignal, System.TimeSpan? interval = default) where TItem : ReactiveUI.IReactiveObject { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersistCollection(this TCollection @this, System.Func> doPersist, System.IObservable manualSaveSignal, System.TimeSpan? interval = default) where TItem : ReactiveUI.IReactiveObject where TCollection : System.Collections.Specialized.INotifyCollectionChanged, System.Collections.Generic.IEnumerable { } @@ -160,8 +172,6 @@ namespace ReactiveUI public int GetAffinityForObjects(System.Type fromType, System.Type toType) { } public bool TryConvert(object? from, System.Type toType, object? conversionHint, out object result) { } } - [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public sealed class DefaultViewLocator : ReactiveUI.IViewLocator, Splat.IEnableLogger { public System.Func ViewModelToViewFunc { get; set; } @@ -414,6 +424,8 @@ namespace ReactiveUI } public interface ISuspensionDriver { + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] System.IObservable InvalidateState(); [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] @@ -652,8 +664,6 @@ namespace ReactiveUI { public static void SetRegistrationNamespaces(params ReactiveUI.RegistrationNamespace[] namespaces) { } } - [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public class PlatformRegistrations { public PlatformRegistrations() { } @@ -724,28 +734,64 @@ namespace ReactiveUI where TViewModel : class where TView : class, ReactiveUI.IViewFor { } } - [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static class ReactiveCommand { + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand Create(System.Action execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand Create(System.Action execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand Create(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand Create(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.CombinedReactiveCommand CreateCombined(System.Collections.Generic.IEnumerable> childCommands, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromObservable(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromObservable(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateRunInBackground(System.Action execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? backgroundScheduler = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateRunInBackground(System.Action execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? backgroundScheduler = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateRunInBackground(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? backgroundScheduler = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateRunInBackground(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? backgroundScheduler = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } } public abstract class ReactiveCommandBase : ReactiveUI.IHandleObservableErrors, ReactiveUI.IReactiveCommand, ReactiveUI.IReactiveCommand, System.IDisposable, System.IObservable, System.Windows.Input.ICommand @@ -774,13 +820,15 @@ namespace ReactiveUI public static System.IDisposable InvokeCommand(this System.IObservable item, TTarget? target, System.Linq.Expressions.Expression?>> commandProperty) where TTarget : class { } } - [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public class ReactiveCommand : ReactiveUI.ReactiveCommandBase { + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] protected ReactiveCommand([System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "Result", "Cancel"})] System.Func, System.Action>>> execute, System.IObservable? canExecute, System.Reactive.Concurrency.IScheduler? outputScheduler) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] protected ReactiveCommand(System.Func> execute, System.IObservable? canExecute, System.Reactive.Concurrency.IScheduler? outputScheduler) { } public override System.IObservable CanExecute { get; } public override System.IObservable IsExecuting { get; } @@ -946,8 +994,6 @@ namespace ReactiveUI Uwp = 10, WinUI = 11, } - [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public class Registrations { public Registrations() { } @@ -1254,4 +1300,4 @@ namespace ReactiveUI public static System.IObservable WhenAnyObservable(this TSender? sender, System.Linq.Expressions.Expression?>> obs1, System.Linq.Expressions.Expression?>> obs2, System.Linq.Expressions.Expression?>> obs3, System.Linq.Expressions.Expression?>> obs4, System.Linq.Expressions.Expression?>> obs5, System.Linq.Expressions.Expression?>> obs6, System.Linq.Expressions.Expression?>> obs7, System.Linq.Expressions.Expression?>> obs8, System.Linq.Expressions.Expression?>> obs9, System.Linq.Expressions.Expression?>> obs10, System.Linq.Expressions.Expression?>> obs11, System.Linq.Expressions.Expression?>> obs12, System.Func selector) where TSender : class { } } -} +} \ No newline at end of file diff --git a/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.DotNet9_0.verified.txt b/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.DotNet9_0.verified.txt index 987b5c033a..381eaada2d 100644 --- a/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.DotNet9_0.verified.txt +++ b/src/ReactiveUI.Tests/API/ApiApprovalTests.ReactiveUI.DotNet9_0.verified.txt @@ -26,16 +26,28 @@ namespace ReactiveUI public static System.IDisposable ActOnEveryObject(this TCollection collection, System.Action onAdd, System.Action onRemove) where TItem : ReactiveUI.IReactiveObject where TCollection : System.Collections.Specialized.INotifyCollectionChanged, System.Collections.Generic.IEnumerable { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersist(this T @this, System.Func> doPersist, System.TimeSpan? interval = default) where T : ReactiveUI.IReactiveObject { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersist(this T @this, System.Func> doPersist, System.IObservable manualSaveSignal, System.TimeSpan? interval = default) where T : ReactiveUI.IReactiveObject { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersistCollection(this System.Collections.ObjectModel.ObservableCollection @this, System.Func> doPersist, System.TimeSpan? interval = default) where TItem : ReactiveUI.IReactiveObject { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersistCollection(this System.Collections.ObjectModel.ObservableCollection @this, System.Func> doPersist, System.IObservable manualSaveSignal, System.TimeSpan? interval = default) where TItem : ReactiveUI.IReactiveObject { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersistCollection(this System.Collections.ObjectModel.ReadOnlyObservableCollection @this, System.Func> doPersist, System.IObservable manualSaveSignal, System.TimeSpan? interval = default) where TItem : ReactiveUI.IReactiveObject { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static System.IDisposable AutoPersistCollection(this TCollection @this, System.Func> doPersist, System.IObservable manualSaveSignal, System.TimeSpan? interval = default) where TItem : ReactiveUI.IReactiveObject where TCollection : System.Collections.Specialized.INotifyCollectionChanged, System.Collections.Generic.IEnumerable { } @@ -160,8 +172,6 @@ namespace ReactiveUI public int GetAffinityForObjects(System.Type fromType, System.Type toType) { } public bool TryConvert(object? from, System.Type toType, object? conversionHint, out object result) { } } - [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public sealed class DefaultViewLocator : ReactiveUI.IViewLocator, Splat.IEnableLogger { public System.Func ViewModelToViewFunc { get; set; } @@ -414,6 +424,8 @@ namespace ReactiveUI } public interface ISuspensionDriver { + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] System.IObservable InvalidateState(); [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] @@ -652,8 +664,6 @@ namespace ReactiveUI { public static void SetRegistrationNamespaces(params ReactiveUI.RegistrationNamespace[] namespaces) { } } - [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public class PlatformRegistrations { public PlatformRegistrations() { } @@ -724,28 +734,64 @@ namespace ReactiveUI where TViewModel : class where TView : class, ReactiveUI.IViewFor { } } - [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static class ReactiveCommand { + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand Create(System.Action execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand Create(System.Action execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand Create(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand Create(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.CombinedReactiveCommand CreateCombined(System.Collections.Generic.IEnumerable> childCommands, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromObservable(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromObservable(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateFromTask(System.Func> execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateRunInBackground(System.Action execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? backgroundScheduler = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateRunInBackground(System.Action execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? backgroundScheduler = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateRunInBackground(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? backgroundScheduler = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public static ReactiveUI.ReactiveCommand CreateRunInBackground(System.Func execute, System.IObservable? canExecute = null, System.Reactive.Concurrency.IScheduler? backgroundScheduler = null, System.Reactive.Concurrency.IScheduler? outputScheduler = null) { } } public abstract class ReactiveCommandBase : ReactiveUI.IHandleObservableErrors, ReactiveUI.IReactiveCommand, ReactiveUI.IReactiveCommand, System.IDisposable, System.IObservable, System.Windows.Input.ICommand @@ -774,13 +820,15 @@ namespace ReactiveUI public static System.IDisposable InvokeCommand(this System.IObservable item, TTarget? target, System.Linq.Expressions.Expression?>> commandProperty) where TTarget : class { } } - [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public class ReactiveCommand : ReactiveUI.ReactiveCommandBase { + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] protected ReactiveCommand([System.Runtime.CompilerServices.TupleElementNames(new string?[]?[] { "Result", "Cancel"})] System.Func, System.Action>>> execute, System.IObservable? canExecute, System.Reactive.Concurrency.IScheduler? outputScheduler) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] protected ReactiveCommand(System.Func> execute, System.IObservable? canExecute, System.Reactive.Concurrency.IScheduler? outputScheduler) { } public override System.IObservable CanExecute { get; } public override System.IObservable IsExecuting { get; } @@ -946,8 +994,6 @@ namespace ReactiveUI Uwp = 10, WinUI = 11, } - [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The method uses reflection and will not work in AOT environments.")] - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The method uses reflection and will not work in AOT environments.")] public class Registrations { public Registrations() { } @@ -1254,4 +1300,4 @@ namespace ReactiveUI public static System.IObservable WhenAnyObservable(this TSender? sender, System.Linq.Expressions.Expression?>> obs1, System.Linq.Expressions.Expression?>> obs2, System.Linq.Expressions.Expression?>> obs3, System.Linq.Expressions.Expression?>> obs4, System.Linq.Expressions.Expression?>> obs5, System.Linq.Expressions.Expression?>> obs6, System.Linq.Expressions.Expression?>> obs7, System.Linq.Expressions.Expression?>> obs8, System.Linq.Expressions.Expression?>> obs9, System.Linq.Expressions.Expression?>> obs10, System.Linq.Expressions.Expression?>> obs11, System.Linq.Expressions.Expression?>> obs12, System.Func selector) where TSender : class { } } -} +} \ No newline at end of file