From 6f8b3e880dddec8241e4aa9cffa046bfe7410d1a Mon Sep 17 00:00:00 2001 From: Ivan Povazan Date: Mon, 14 Aug 2023 13:59:00 +0200 Subject: [PATCH 1/5] Prevent static constructor from referencing DynamicDelegateLightup private API in scenarios without app linking --- .../System/Dynamic/Utils/DelegateHelpers.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs index a56b5f813adec8..56126811aef4b7 100644 --- a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs +++ b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs @@ -19,8 +19,23 @@ internal static class DelegateHelpers // with the Reflection.Emit statics below. private static class DynamicDelegateLightup { - public static Func, Delegate> CreateObjectArrayDelegate { get; } - = CreateObjectArrayDelegateInternal(); + public static Func, Delegate> CreateObjectArrayDelegate + { + get + { + // CreateObjectArrayDelegateInternal is only supported with NativeAOT which always expects CanEmitObjectArrayDelegate to be false. + // Additionally, this check guards static constructor of trying to resolve 'Internal.Runtime.Augments.DynamicDelegateAugments' + // on runtimes which do not support this private API, which would otherwise cause TypeInitializationException. + if (!CanEmitObjectArrayDelegate) + { + return CreateObjectArrayDelegateInternal(); + } + else + { + throw new System.NotImplementedException(); + } + } + } private static Func, Delegate> CreateObjectArrayDelegateInternal() => Type.GetType("Internal.Runtime.Augments.DynamicDelegateAugments")! From 5483d77dc7339d91eef21a438025965785e9137b Mon Sep 17 00:00:00 2001 From: Ivan Povazan Date: Mon, 14 Aug 2023 16:13:15 +0200 Subject: [PATCH 2/5] Revert "Prevent static constructor from referencing DynamicDelegateLightup private API in scenarios without app linking" This reverts commit 6f8b3e880dddec8241e4aa9cffa046bfe7410d1a. --- .../System/Dynamic/Utils/DelegateHelpers.cs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs index 56126811aef4b7..a56b5f813adec8 100644 --- a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs +++ b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs @@ -19,23 +19,8 @@ internal static class DelegateHelpers // with the Reflection.Emit statics below. private static class DynamicDelegateLightup { - public static Func, Delegate> CreateObjectArrayDelegate - { - get - { - // CreateObjectArrayDelegateInternal is only supported with NativeAOT which always expects CanEmitObjectArrayDelegate to be false. - // Additionally, this check guards static constructor of trying to resolve 'Internal.Runtime.Augments.DynamicDelegateAugments' - // on runtimes which do not support this private API, which would otherwise cause TypeInitializationException. - if (!CanEmitObjectArrayDelegate) - { - return CreateObjectArrayDelegateInternal(); - } - else - { - throw new System.NotImplementedException(); - } - } - } + public static Func, Delegate> CreateObjectArrayDelegate { get; } + = CreateObjectArrayDelegateInternal(); private static Func, Delegate> CreateObjectArrayDelegateInternal() => Type.GetType("Internal.Runtime.Augments.DynamicDelegateAugments")! From a3fa39d923e1d0a08e2f2f3f462ab0e83ec4b55f Mon Sep 17 00:00:00 2001 From: Ivan Povazan Date: Mon, 14 Aug 2023 18:32:09 +0200 Subject: [PATCH 3/5] PR feedback --- .../System/Dynamic/Utils/DelegateHelpers.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs index a56b5f813adec8..d66f726d4d3be3 100644 --- a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs +++ b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs @@ -23,9 +23,21 @@ private static class DynamicDelegateLightup = CreateObjectArrayDelegateInternal(); private static Func, Delegate> CreateObjectArrayDelegateInternal() - => Type.GetType("Internal.Runtime.Augments.DynamicDelegateAugments")! - .GetMethod("CreateObjectArrayDelegate")! - .CreateDelegate, Delegate>>(); + { + // This is only supported by NativeAOT which always expects CanEmitObjectArrayDelegate to be false. + // This check guards static constructor of trying to resolve 'Internal.Runtime.Augments.DynamicDelegateAugments' + // on runtimes which do not support this private API. + if (!CanEmitObjectArrayDelegate) + { + return Type.GetType("Internal.Runtime.Augments.DynamicDelegateAugments")! + .GetMethod("CreateObjectArrayDelegate")! + .CreateDelegate, Delegate>>(); + } + else + { + return new Func, Delegate>((_x, _y) => throw new NotImplementedException()); + } + } } private static class ForceAllowDynamicCodeLightup From 1868f73eb27a332315054404ab7f2dab681e5e64 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 14 Aug 2023 09:49:59 -0700 Subject: [PATCH 4/5] Update src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs --- .../src/System/Dynamic/Utils/DelegateHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs index d66f726d4d3be3..9e53538c69c66f 100644 --- a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs +++ b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs @@ -29,7 +29,7 @@ private static class DynamicDelegateLightup // on runtimes which do not support this private API. if (!CanEmitObjectArrayDelegate) { - return Type.GetType("Internal.Runtime.Augments.DynamicDelegateAugments")! + return Type.GetType("Internal.Runtime.Augments.DynamicDelegateAugments, System.Private.CoreLib")! .GetMethod("CreateObjectArrayDelegate")! .CreateDelegate, Delegate>>(); } From 95ea573283f0a8c70f55db5f7f0dae8e8118fddc Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 14 Aug 2023 09:52:03 -0700 Subject: [PATCH 5/5] Update src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs --- .../src/System/Dynamic/Utils/DelegateHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs index 9e53538c69c66f..011322a2454ad2 100644 --- a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs +++ b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/DelegateHelpers.cs @@ -29,7 +29,7 @@ private static class DynamicDelegateLightup // on runtimes which do not support this private API. if (!CanEmitObjectArrayDelegate) { - return Type.GetType("Internal.Runtime.Augments.DynamicDelegateAugments, System.Private.CoreLib")! + return Type.GetType("Internal.Runtime.Augments.DynamicDelegateAugments, System.Private.CoreLib", throwOnError: true)! .GetMethod("CreateObjectArrayDelegate")! .CreateDelegate, Delegate>>(); }