From 0e4b6ebd6452441f5e6186bf7f6aa2c609d2d511 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Mon, 7 Oct 2024 14:35:08 -0500 Subject: [PATCH 01/24] Replace OpCodes.NewObj with GetUninitializedObject() --- src/coreclr/vm/reflectioninvocation.cpp | 49 ++---------- .../System/Reflection/ConstructorInvoker.cs | 28 ++++--- .../src/System/Reflection/InvokerEmitUtil.cs | 74 +++++++++---------- .../MethodBaseInvoker.Constructor.cs | 10 +-- .../Reflection/RuntimeConstructorInfo.cs | 52 +++++++++++-- 5 files changed, 104 insertions(+), 109 deletions(-) diff --git a/src/coreclr/vm/reflectioninvocation.cpp b/src/coreclr/vm/reflectioninvocation.cpp index 59e07e4e1e49d8..b546bf2790e252 100644 --- a/src/coreclr/vm/reflectioninvocation.cpp +++ b/src/coreclr/vm/reflectioninvocation.cpp @@ -392,25 +392,6 @@ FCIMPL4(Object*, RuntimeMethodHandle::InvokeMethod, BOOL fCtorOfVariableSizedObject = FALSE; - if (FC_ACCESS_BOOL(fConstructor)) - { - // If we are invoking a constructor on an array then we must - // handle this specially. - if (ownerType.IsArray()) { - gc.retVal = InvokeArrayConstructor(ownerType, - args, - gc.pSig->NumFixedArgs()); - goto Done; - } - - // Variable sized objects, like String instances, allocate themselves - // so they are a special case. - MethodTable * pMT = ownerType.AsMethodTable(); - fCtorOfVariableSizedObject = pMT->HasComponentSize(); - if (!fCtorOfVariableSizedObject) - gc.retVal = pMT->Allocate(); - } - { ArgIteratorForMethodInvoke argit(&gc.pSig, fCtorOfVariableSizedObject); @@ -499,17 +480,7 @@ FCIMPL4(Object*, RuntimeMethodHandle::InvokeMethod, if (!pMeth->IsStatic() && !fCtorOfVariableSizedObject) { PVOID pThisPtr; - if (FC_ACCESS_BOOL(fConstructor)) - { - // Copy "this" pointer: only unbox if type is value type and method is not unboxing stub - if (ownerType.IsValueType() && !pMeth->IsUnboxingStub()) { - // Note that we create a true boxed nullabe and then convert it to a T below - pThisPtr = gc.retVal->GetData(); - } - else - pThisPtr = OBJECTREFToObject(gc.retVal); - } - else if (!pMeth->GetMethodTable()->IsValueType()) + if (!pMeth->GetMethodTable()->IsValueType()) pThisPtr = OBJECTREFToObject(gc.target); else { if (pMeth->IsUnboxingStub()) @@ -621,19 +592,6 @@ FCIMPL4(Object*, RuntimeMethodHandle::InvokeMethod, CallDescrWorkerWithHandler(&callDescrData); // It is still illegal to do a GC here. The return type might have/contain GC pointers. - if (FC_ACCESS_BOOL(fConstructor)) - { - // We have a special case for Strings...The object is returned... - if (fCtorOfVariableSizedObject) { - PVOID pReturnValue = &callDescrData.returnValue; - gc.retVal = *(OBJECTREF *)pReturnValue; - } - - // If it is a Nullable, box it using Nullable conventions. - // TODO: this double allocates on constructions which is wasteful - gc.retVal = Nullable::NormalizeBox(gc.retVal); - } - else if (hasValueTypeReturn || hasRefReturnAndNeedsBoxing) { _ASSERTE(gc.retVal != NULL); @@ -683,6 +641,10 @@ FCIMPL4(Object*, RuntimeMethodHandle::InvokeMethod, gc.retVal = InvokeUtil::CreateObjectAfterInvoke(refReturnTargetTH, pReturnedReference); } + else if (fConstructor) + { + gc.retVal = ObjectToOBJECTREF(target); + } else { gc.retVal = InvokeUtil::CreateObjectAfterInvoke(retTH, &callDescrData.returnValue); @@ -693,7 +655,6 @@ FCIMPL4(Object*, RuntimeMethodHandle::InvokeMethod, } -Done: ; HELPER_METHOD_FRAME_END(); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index 47766e9428f44b..90a3554e9392b9 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -176,10 +176,12 @@ private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4 break; } + object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + // Check fast path first. if (_invokeFunc_Obj4Args is not null) { - return _invokeFunc_Obj4Args(obj: null, arg1, arg2, arg3, arg4)!; + return _invokeFunc_Obj4Args(obj, arg1, arg2, arg3, arg4)!; } if ((_strategy & InvokerStrategy.StrategyDetermined_Obj4Args) == 0) @@ -187,7 +189,7 @@ private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4 DetermineStrategy_Obj4Args(ref _strategy, ref _invokeFunc_Obj4Args, _method, _needsByRefStrategy, backwardsCompat: false); if (_invokeFunc_Obj4Args is not null) { - return _invokeFunc_Obj4Args(obj: null, arg1, arg2, arg3, arg4)!; + return _invokeFunc_Obj4Args(obj, arg1, arg2, arg3, arg4)!; } } @@ -255,10 +257,12 @@ internal object InvokeWithFewArgs(Span arguments) copyOfArgs[i] = arg; } + object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + // Check fast path first. if (_invokeFunc_ObjSpanArgs is not null) { - return _invokeFunc_ObjSpanArgs(obj: null, copyOfArgs)!; + return _invokeFunc_ObjSpanArgs(obj, copyOfArgs)!; // No need to call CopyBack here since there are no ref values. } @@ -267,13 +271,13 @@ internal object InvokeWithFewArgs(Span arguments) DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy, backwardsCompat: false); if (_invokeFunc_ObjSpanArgs is not null) { - return _invokeFunc_ObjSpanArgs(obj: null, copyOfArgs)!; + return _invokeFunc_ObjSpanArgs(obj, copyOfArgs)!; } } - object ret = InvokeDirectByRefWithFewArgs(copyOfArgs); + InvokeDirectByRefWithFewArgs(copyOfArgs); CopyBack(arguments, copyOfArgs, shouldCopyBack); - return ret; + return obj; } internal object InvokeDirectByRef(object? arg1 = null, object? arg2 = null, object? arg3 = null, object? arg4 = null) @@ -299,20 +303,22 @@ internal unsafe object InvokeDirectByRefWithFewArgs(Span copyOfArgs) ByReference.Create(ref copyOfArgs[i]); } - return _invokeFunc_RefArgs!(obj: null, pByRefFixedStorage)!; + object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + return _invokeFunc_RefArgs!(obj, pByRefFixedStorage)!; } internal unsafe object InvokeWithManyArgs(Span arguments) { Span copyOfArgs; GCFrameRegistration regArgStorage; - object ret; if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) { DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy, backwardsCompat: false); } + object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + if (_invokeFunc_ObjSpanArgs is not null) { IntPtr* pArgStorage = stackalloc IntPtr[_argCount]; @@ -331,7 +337,7 @@ internal unsafe object InvokeWithManyArgs(Span arguments) copyOfArgs[i] = arg; } - ret = _invokeFunc_ObjSpanArgs(obj: null, copyOfArgs)!; + _invokeFunc_ObjSpanArgs(obj, copyOfArgs); // No need to call CopyBack here since there are no ref values. } finally @@ -371,7 +377,7 @@ internal unsafe object InvokeWithManyArgs(Span arguments) ByReference.Create(ref Unsafe.AsRef(pStorage + i)); } - ret = _invokeFunc_RefArgs!(obj: null, pByRefStorage)!; + _invokeFunc_RefArgs!(obj, pByRefStorage); CopyBack(arguments, copyOfArgs, shouldCopyBack); } finally @@ -381,7 +387,7 @@ internal unsafe object InvokeWithManyArgs(Span arguments) } } - return ret; + return obj; } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index 45853ff96a5a59..96ed03179a41f4 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -20,9 +20,6 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBas { Debug.Assert(!method.ContainsGenericParameters); - bool emitNew = method is RuntimeConstructorInfo; - bool hasThis = !emitNew && !method.IsStatic; - Type[] delegateParameters = [typeof(object), typeof(object), typeof(object), typeof(object), typeof(object)]; string declaringTypeName = method.DeclaringType != null ? method.DeclaringType.Name + "." : string.Empty; @@ -36,7 +33,7 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBas ILGenerator il = dm.GetILGenerator(); // Handle instance methods. - if (hasThis) + if (!method.IsStatic) { il.Emit(OpCodes.Ldarg_0); if (method.DeclaringType!.IsValueType) @@ -77,7 +74,7 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBas } } - EmitCallAndReturnHandling(il, method, emitNew, backwardsCompat); + EmitCallAndReturnHandling(il, method, backwardsCompat); // Create the delegate; it is also compiled at this point due to restrictedSkipVisibility=true. return (InvokeFunc_Obj4Args)dm.CreateDelegate(typeof(InvokeFunc_Obj4Args), target: null); @@ -87,10 +84,6 @@ public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Met { Debug.Assert(!method.ContainsGenericParameters); - bool emitNew = method is RuntimeConstructorInfo; - bool hasThis = !emitNew && !method.IsStatic; - - // The first parameter is unused but supports treating the DynamicMethod as an instance method which is slightly faster than a static. Type[] delegateParameters = [typeof(object), typeof(Span)]; string declaringTypeName = method.DeclaringType != null ? method.DeclaringType.Name + "." : string.Empty; @@ -104,7 +97,7 @@ public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Met ILGenerator il = dm.GetILGenerator(); // Handle instance methods. - if (hasThis) + if (!method.IsStatic) { il.Emit(OpCodes.Ldarg_0); if (method.DeclaringType!.IsValueType) @@ -134,7 +127,7 @@ public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Met } } - EmitCallAndReturnHandling(il, method, emitNew, backwardsCompat); + EmitCallAndReturnHandling(il, method, backwardsCompat); // Create the delegate; it is also compiled at this point due to restrictedSkipVisibility=true. return (InvokeFunc_ObjSpanArgs)dm.CreateDelegate(typeof(InvokeFunc_ObjSpanArgs), target: null); @@ -144,11 +137,7 @@ public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase { Debug.Assert(!method.ContainsGenericParameters); - bool emitNew = method is RuntimeConstructorInfo; - bool hasThis = !(emitNew || method.IsStatic); - - // The first parameter is unused but supports treating the DynamicMethod as an instance method which is slightly faster than a static. - Type[] delegateParameters = [typeof(object), typeof(object), typeof(IntPtr*)]; + Type[] delegateParameters = [typeof(object), typeof(IntPtr*)]; string declaringTypeName = method.DeclaringType != null ? method.DeclaringType.Name + "." : string.Empty; var dm = new DynamicMethod( @@ -161,9 +150,9 @@ public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase ILGenerator il = dm.GetILGenerator(); // Handle instance methods. - if (hasThis) + if (!method.IsStatic) { - il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_0); if (method.DeclaringType!.IsValueType) { il.Emit(OpCodes.Unbox, method.DeclaringType); @@ -174,7 +163,7 @@ public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase ReadOnlySpan parameters = method.GetParametersAsSpan(); for (int i = 0; i < parameters.Length; i++) { - il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_1); if (i != 0) { il.Emit(OpCodes.Ldc_I4, i * IntPtr.Size); @@ -190,7 +179,7 @@ public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase } } - EmitCallAndReturnHandling(il, method, emitNew, backwardsCompat); + EmitCallAndReturnHandling(il, method, backwardsCompat); // Create the delegate; it is also compiled at this point due to restrictedSkipVisibility=true. return (InvokeFunc_RefArgs)dm.CreateDelegate(typeof(InvokeFunc_RefArgs), target: null); @@ -205,7 +194,7 @@ private static void Unbox(ILGenerator il, Type parameterType) il.Emit(OpCodes.Ldobj, parameterType); } - private static void EmitCallAndReturnHandling(ILGenerator il, MethodBase method, bool emitNew, bool backwardsCompat) + private static void EmitCallAndReturnHandling(ILGenerator il, MethodBase method, bool backwardsCompat) { // For CallStack reasons, don't inline target method. // Mono interpreter does not support\need this. @@ -219,31 +208,26 @@ private static void EmitCallAndReturnHandling(ILGenerator il, MethodBase method, #endif } - // Invoke the method. - if (emitNew) + if (method is RuntimeConstructorInfo rci) { - il.Emit(OpCodes.Newobj, (ConstructorInfo)method); - } - else if (method.IsStatic || method.DeclaringType!.IsValueType) - { - il.Emit(OpCodes.Call, (MethodInfo)method); + Debug.Assert(!method.IsStatic); + Debug.Assert(!method.IsVirtual); + + il.Emit(OpCodes.Call, rci); + il.Emit(OpCodes.Ldnull); } else { - il.Emit(OpCodes.Callvirt, (MethodInfo)method); - } - - // Handle the return. - if (emitNew) - { - Type returnType = method.DeclaringType!; - if (returnType.IsValueType) + if (method.IsStatic || method.DeclaringType!.IsValueType) { - il.Emit(OpCodes.Box, returnType); + il.Emit(OpCodes.Call, (MethodInfo)method); } - } - else - { + else + { + il.Emit(OpCodes.Callvirt, (MethodInfo)method); + } + + // Handle the return. RuntimeType returnType; if (method is RuntimeMethodInfo rmi) { @@ -311,6 +295,16 @@ private static void EmitCallAndReturnHandling(ILGenerator il, MethodBase method, il.Emit(OpCodes.Ret); } + private static Type GetParameterTypeForCallI(Type type) + { + if (type.IsByRef || type.IsValueType || type.IsPointer || type.IsFunctionPointer) + { + return type; + } + + return typeof(object); + } + private static class ThrowHelper { public static void Throw_NullReference_InvokeNullRefReturned() diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Constructor.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Constructor.cs index 61ce60ff5bd4ec..afd2525a817631 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Constructor.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Constructor.cs @@ -12,7 +12,7 @@ namespace System.Reflection internal sealed partial class MethodBaseInvoker { // The rarely used scenario of calling the constructor on an existing instance. - internal unsafe object? InvokeConstructorWithoutAlloc( + internal unsafe void InvokeConstructorWithoutAlloc( object? obj, BindingFlags invokeAttr, Binder? binder, @@ -20,7 +20,6 @@ internal sealed partial class MethodBaseInvoker CultureInfo? culture) { bool wrapInTargetInvocationException = (invokeAttr & BindingFlags.DoNotWrapExceptions) == 0; - object? ret; int argCount = _argCount; scoped Span shouldCopyBack = stackalloc bool[argCount]; @@ -48,7 +47,7 @@ internal sealed partial class MethodBaseInvoker try { // Use the interpreted version to avoid having to generate a new method that doesn't allocate. - ret = InterpretedInvoke_Constructor(obj, pByRefStorage); + InterpretedInvoke_Constructor(obj, pByRefStorage); } catch (Exception e) when (wrapInTargetInvocationException) { @@ -56,7 +55,6 @@ internal sealed partial class MethodBaseInvoker } CopyBack(parameters, copyOfArgs, shouldCopyBack); - return ret; } finally { @@ -65,12 +63,12 @@ internal sealed partial class MethodBaseInvoker } } - internal unsafe object? InvokeConstructorWithoutAlloc(object? obj, bool wrapInTargetInvocationException) + internal unsafe void InvokeConstructorWithoutAlloc(object? obj, bool wrapInTargetInvocationException) { try { // Use the interpreted version to avoid having to generate a new method that doesn't allocate. - return InterpretedInvoke_Constructor(obj, null); + InterpretedInvoke_Constructor(obj, null); } catch (Exception e) when (wrapInTargetInvocationException) { diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs index 81d6461679cb82..839d79f89d8cfc 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs @@ -104,7 +104,9 @@ internal void ThrowNoInvokeException() CultureInfo? culture) { if ((InvocationFlags & InvocationFlags.NoInvoke) != 0) + { ThrowNoInvokeException(); + } if (!IsStatic) { @@ -126,9 +128,23 @@ internal void ThrowNoInvokeException() return null; } - return argCount == 0 ? - Invoker.InvokeConstructorWithoutAlloc(obj!, (invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) : - Invoker.InvokeConstructorWithoutAlloc(obj!, invokeAttr, binder, parameters!, culture); + switch (argCount) + { + case 0 : + Invoker.InvokeWithNoArgs(obj, invokeAttr); + break; + case 1 : + Invoker.InvokeWithOneArg(obj, invokeAttr, binder, parameters!, culture); + break; + case 2 or 3 or 4 : + Invoker.InvokeWithFewArgs(obj, invokeAttr, binder, parameters!, culture); + break; + default: + Invoker.InvokeWithManyArgs(obj, invokeAttr, binder, parameters!, culture); + break; + }; + + return null; } [DebuggerStepThrough] @@ -150,13 +166,33 @@ public override object Invoke(BindingFlags invokeAttr, Binder? binder, object?[] MethodBaseInvoker.ThrowTargetParameterCountException(); } - return argCount switch + object obj; + try { - 0 => Invoker.InvokeWithNoArgs(obj: null, invokeAttr)!, - 1 => Invoker.InvokeWithOneArg(obj: null, invokeAttr, binder, parameters!, culture)!, - 2 or 3 or 4 => Invoker.InvokeWithFewArgs(obj: null, invokeAttr, binder, parameters!, culture)!, - _ => Invoker.InvokeWithManyArgs(obj: null, invokeAttr, binder, parameters!, culture)!, + obj = ((RuntimeType)DeclaringType!).GetUninitializedObject(); + } + catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) + { + throw new TargetInvocationException(e); + } + + switch (argCount) + { + case 0: + Invoker.InvokeWithNoArgs(obj, invokeAttr); + break; + case 1: + Invoker.InvokeWithOneArg(obj, invokeAttr, binder, parameters!, culture); + break; + case 2 or 3 or 4: + Invoker.InvokeWithFewArgs(obj, invokeAttr, binder, parameters!, culture); + break; + default: + Invoker.InvokeWithManyArgs(obj, invokeAttr, binder, parameters!, culture); + break; }; + + return obj; } } } From 062552fe34910b4a7ee89a1ca00ad1b3bb2e039b Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Wed, 23 Oct 2024 13:11:19 -0500 Subject: [PATCH 02/24] Initial switch from Call to Calli --- .../Reflection/ConstructorInvoker.CoreCLR.cs | 2 +- .../Reflection/MethodBaseInvoker.CoreCLR.cs | 4 +- .../Reflection/MethodInvoker.CoreCLR.cs | 4 +- .../System.Private.CoreLib.Shared.projitems | 1 - .../System/Reflection/ConstructorInvoker.cs | 26 +- .../src/System/Reflection/InvokerEmitUtil.cs | 302 ++++++++---------- .../MethodBaseInvoker.Constructor.cs | 79 ----- .../System/Reflection/MethodBaseInvoker.cs | 30 +- .../src/System/Reflection/MethodInvoker.cs | 26 +- .../System/Reflection/MethodInvokerCommon.cs | 112 ++++++- 10 files changed, 294 insertions(+), 292 deletions(-) delete mode 100644 src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Constructor.cs diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs index f58e24742dc500..9fcb0107d1e371 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs @@ -13,7 +13,7 @@ internal unsafe ConstructorInvoker(RuntimeConstructorInfo constructor) : this(co _invokeFunc_RefArgs = InterpretedInvoke; } - private unsafe object? InterpretedInvoke(object? obj, IntPtr* args) + private unsafe object? InterpretedInvoke(object? obj, IntPtr _, IntPtr* args) { return RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _signature!, isConstructor: obj is null); } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs index 7bb6439468d192..06d1fcd9f17006 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs @@ -29,10 +29,10 @@ internal unsafe MethodBaseInvoker(DynamicMethod method, Signature signature) : t _invokeFunc_RefArgs = InterpretedInvoke_Method; } - private unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr* args) => + private unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr _, IntPtr* args) => RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _signature!, isConstructor: obj is null); - private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr* args) => + private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr _, IntPtr* args) => RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _signature!, isConstructor: false); } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs index 644364a77266e2..b10b5f9f0f0832 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs @@ -30,10 +30,10 @@ private unsafe MethodInvoker(RuntimeConstructorInfo constructor) : this(construc _invocationFlags = constructor.ComputeAndUpdateInvocationFlags(); } - private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr* args) => + private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr _, IntPtr* args) => RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _signature!, isConstructor: false); - private unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr* args) => + private unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr _, IntPtr* args) => RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _signature!, isConstructor: obj is null); } } diff --git a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems index 89cdcbbe747d61..22ee2012302fe7 100644 --- a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems +++ b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems @@ -734,7 +734,6 @@ - diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index 90a3554e9392b9..a300b3e47ca3c5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -34,6 +34,7 @@ public sealed partial class ConstructorInvoker private readonly InvokerArgFlags[] _invokerArgFlags; private readonly RuntimeConstructorInfo _method; private readonly bool _needsByRefStrategy; + private readonly IntPtr _functionPointer; /// /// Creates a new instance of ConstructorInvoker. @@ -64,6 +65,7 @@ private ConstructorInvoker(RuntimeConstructorInfo constructor, RuntimeType[] arg _invocationFlags = constructor.ComputeAndUpdateInvocationFlags(); _argTypes = argumentTypes; _argCount = _argTypes.Length; + _functionPointer = constructor.MethodHandle.GetFunctionPointer(); Initialize(argumentTypes, out _strategy, out _invokerArgFlags, out _needsByRefStrategy); } @@ -181,15 +183,15 @@ private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4 // Check fast path first. if (_invokeFunc_Obj4Args is not null) { - return _invokeFunc_Obj4Args(obj, arg1, arg2, arg3, arg4)!; + return _invokeFunc_Obj4Args(obj, _functionPointer, arg1, arg2, arg3, arg4)!; } if ((_strategy & InvokerStrategy.StrategyDetermined_Obj4Args) == 0) { - DetermineStrategy_Obj4Args(ref _strategy, ref _invokeFunc_Obj4Args, _method, _needsByRefStrategy, backwardsCompat: false); + DetermineStrategy_Obj4Args(ref _strategy, ref _invokeFunc_Obj4Args, _method, _needsByRefStrategy); if (_invokeFunc_Obj4Args is not null) { - return _invokeFunc_Obj4Args(obj, arg1, arg2, arg3, arg4)!; + return _invokeFunc_Obj4Args(obj, _functionPointer, arg1, arg2, arg3, arg4)!; } } @@ -262,16 +264,16 @@ internal object InvokeWithFewArgs(Span arguments) // Check fast path first. if (_invokeFunc_ObjSpanArgs is not null) { - return _invokeFunc_ObjSpanArgs(obj, copyOfArgs)!; + return _invokeFunc_ObjSpanArgs(obj, _functionPointer, copyOfArgs)!; // No need to call CopyBack here since there are no ref values. } if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy, backwardsCompat: false); + DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); if (_invokeFunc_ObjSpanArgs is not null) { - return _invokeFunc_ObjSpanArgs(obj, copyOfArgs)!; + return _invokeFunc_ObjSpanArgs(obj, _functionPointer, copyOfArgs)!; } } @@ -290,7 +292,7 @@ internal unsafe object InvokeDirectByRefWithFewArgs(Span copyOfArgs) { if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method, backwardsCompat: false); + DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); } StackAllocatedByRefs byrefs = default; @@ -304,7 +306,7 @@ internal unsafe object InvokeDirectByRefWithFewArgs(Span copyOfArgs) } object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); - return _invokeFunc_RefArgs!(obj, pByRefFixedStorage)!; + return _invokeFunc_RefArgs!(obj, _functionPointer, pByRefFixedStorage)!; } internal unsafe object InvokeWithManyArgs(Span arguments) @@ -314,7 +316,7 @@ internal unsafe object InvokeWithManyArgs(Span arguments) if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy, backwardsCompat: false); + DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); } object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); @@ -337,7 +339,7 @@ internal unsafe object InvokeWithManyArgs(Span arguments) copyOfArgs[i] = arg; } - _invokeFunc_ObjSpanArgs(obj, copyOfArgs); + _invokeFunc_ObjSpanArgs(obj, _functionPointer, copyOfArgs); // No need to call CopyBack here since there are no ref values. } finally @@ -349,7 +351,7 @@ internal unsafe object InvokeWithManyArgs(Span arguments) { if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method, backwardsCompat: false); + DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); } IntPtr* pStorage = stackalloc IntPtr[2 * _argCount]; @@ -377,7 +379,7 @@ internal unsafe object InvokeWithManyArgs(Span arguments) ByReference.Create(ref Unsafe.AsRef(pStorage + i)); } - _invokeFunc_RefArgs!(obj, pByRefStorage); + _invokeFunc_RefArgs!(obj, _functionPointer, pByRefStorage); CopyBack(arguments, copyOfArgs, shouldCopyBack); } finally diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index 96ed03179a41f4..dd712c0de7bbaf 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -9,22 +9,16 @@ namespace System.Reflection { internal static class InvokerEmitUtil { - // If changed, update native stack walking code that also uses this prefix to ignore reflection frames. - private const string InvokeStubPrefix = "InvokeStub_"; + internal unsafe delegate object? InvokeFunc_RefArgs(object? obj, IntPtr functionPointer, IntPtr* refArguments); + internal delegate object? InvokeFunc_ObjSpanArgs(object? obj, IntPtr functionPointer, Span arguments); + internal delegate object? InvokeFunc_Obj4Args(object? obj, IntPtr functionPointer, object? arg1, object? arg2, object? arg3, object? arg4); - internal unsafe delegate object? InvokeFunc_RefArgs(object? obj, IntPtr* refArguments); - internal delegate object? InvokeFunc_ObjSpanArgs(object? obj, Span arguments); - internal delegate object? InvokeFunc_Obj4Args(object? obj, object? arg1, object? arg2, object? arg3, object? arg4); - - public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBase method, bool backwardsCompat) + public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(Type declaringType, bool isStatic, Type[] calliParameterTypes, Type returnType) { - Debug.Assert(!method.ContainsGenericParameters); - - Type[] delegateParameters = [typeof(object), typeof(object), typeof(object), typeof(object), typeof(object)]; + Type[] delegateParameters = [typeof(object), typeof(IntPtr), typeof(object), typeof(object), typeof(object), typeof(object)]; - string declaringTypeName = method.DeclaringType != null ? method.DeclaringType.Name + "." : string.Empty; - var dm = new DynamicMethod( - InvokeStubPrefix + declaringTypeName + method.Name, + DynamicMethod dm = new ( + GetInvokeStubName(calliParameterTypes, returnType), returnType: typeof(object), delegateParameters, typeof(object).Module, // Use system module to identify our DynamicMethods. @@ -32,35 +26,23 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBas ILGenerator il = dm.GetILGenerator(); - // Handle instance methods. - if (!method.IsStatic) - { - il.Emit(OpCodes.Ldarg_0); - if (method.DeclaringType!.IsValueType) - { - il.Emit(OpCodes.Unbox, method.DeclaringType); - } - } + EmitLdargForInstance(il, isStatic, declaringType); // Push the arguments. - ReadOnlySpan parameters = method.GetParametersAsSpan(); - for (int i = 0; i < parameters.Length; i++) + for (int i = 0; i < calliParameterTypes.Length; i++) { - RuntimeType parameterType = (RuntimeType)parameters[i].ParameterType; + RuntimeType parameterType = (RuntimeType)calliParameterTypes[i]; switch (i) { case 0: - il.Emit(OpCodes.Ldarg_1); - break; - case 1: il.Emit(OpCodes.Ldarg_2); break; - case 2: + case 1: il.Emit(OpCodes.Ldarg_3); break; default: - il.Emit(OpCodes.Ldarg_S, i + 1); + il.Emit(OpCodes.Ldarg_S, i + 2); break; } @@ -74,21 +56,19 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBas } } - EmitCallAndReturnHandling(il, method, backwardsCompat); + EmitCall(il, isStatic, calliParameterTypes, returnType); + EmitReturnHandling(il, returnType); // Create the delegate; it is also compiled at this point due to restrictedSkipVisibility=true. return (InvokeFunc_Obj4Args)dm.CreateDelegate(typeof(InvokeFunc_Obj4Args), target: null); } - public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(MethodBase method, bool backwardsCompat) + public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Type declaringType, bool isStatic, Type[] calliParameterTypes, Type returnType) { - Debug.Assert(!method.ContainsGenericParameters); - - Type[] delegateParameters = [typeof(object), typeof(Span)]; + Type[] delegateParameters = [typeof(object), typeof(IntPtr), typeof(Span)]; - string declaringTypeName = method.DeclaringType != null ? method.DeclaringType.Name + "." : string.Empty; - var dm = new DynamicMethod( - InvokeStubPrefix + declaringTypeName + method.Name, + DynamicMethod dm = new ( + GetInvokeStubName(calliParameterTypes, returnType), returnType: typeof(object), delegateParameters, typeof(object).Module, // Use system module to identify our DynamicMethods. @@ -96,23 +76,14 @@ public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Met ILGenerator il = dm.GetILGenerator(); - // Handle instance methods. - if (!method.IsStatic) - { - il.Emit(OpCodes.Ldarg_0); - if (method.DeclaringType!.IsValueType) - { - il.Emit(OpCodes.Unbox, method.DeclaringType); - } - } + EmitLdargForInstance(il, isStatic, declaringType); // Push the arguments. - ReadOnlySpan parameters = method.GetParametersAsSpan(); - for (int i = 0; i < parameters.Length; i++) + for (int i = 0; i < calliParameterTypes.Length; i++) { - RuntimeType parameterType = (RuntimeType)parameters[i].ParameterType; + RuntimeType parameterType = (RuntimeType)calliParameterTypes[i]; - il.Emit(OpCodes.Ldarga_S, 1); + il.Emit(OpCodes.Ldarga_S, 2); il.Emit(OpCodes.Ldc_I4, i); il.Emit(OpCodes.Call, Methods.Span_get_Item()); il.Emit(OpCodes.Ldind_Ref); @@ -127,21 +98,19 @@ public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Met } } - EmitCallAndReturnHandling(il, method, backwardsCompat); + EmitCall(il, isStatic, calliParameterTypes, returnType); + EmitReturnHandling(il, returnType); // Create the delegate; it is also compiled at this point due to restrictedSkipVisibility=true. return (InvokeFunc_ObjSpanArgs)dm.CreateDelegate(typeof(InvokeFunc_ObjSpanArgs), target: null); } - public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase method, bool backwardsCompat) + public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(Type declaringType, bool isStatic, Type[] calliParameterTypes, Type returnType) { - Debug.Assert(!method.ContainsGenericParameters); - - Type[] delegateParameters = [typeof(object), typeof(IntPtr*)]; + Type[] delegateParameters = [typeof(object), typeof(IntPtr), typeof(IntPtr*)]; - string declaringTypeName = method.DeclaringType != null ? method.DeclaringType.Name + "." : string.Empty; - var dm = new DynamicMethod( - InvokeStubPrefix + declaringTypeName + method.Name, + DynamicMethod dm = new ( + GetInvokeStubName(calliParameterTypes, returnType), returnType: typeof(object), delegateParameters, typeof(object).Module, // Use system module to identify our DynamicMethods. @@ -149,21 +118,12 @@ public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase ILGenerator il = dm.GetILGenerator(); - // Handle instance methods. - if (!method.IsStatic) - { - il.Emit(OpCodes.Ldarg_0); - if (method.DeclaringType!.IsValueType) - { - il.Emit(OpCodes.Unbox, method.DeclaringType); - } - } + EmitLdargForInstance(il, isStatic, declaringType); // Push the arguments. - ReadOnlySpan parameters = method.GetParametersAsSpan(); - for (int i = 0; i < parameters.Length; i++) + for (int i = 0; i < calliParameterTypes.Length; i++) { - il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); if (i != 0) { il.Emit(OpCodes.Ldc_I4, i * IntPtr.Size); @@ -172,14 +132,15 @@ public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase il.Emit(OpCodes.Ldfld, Methods.ByReferenceOfByte_Value()); - RuntimeType parameterType = (RuntimeType)parameters[i].ParameterType; + RuntimeType parameterType = (RuntimeType)calliParameterTypes[i]; if (!parameterType.IsByRef) { il.Emit(OpCodes.Ldobj, parameterType.IsPointer || parameterType.IsFunctionPointer ? typeof(IntPtr) : parameterType); } } - EmitCallAndReturnHandling(il, method, backwardsCompat); + EmitCall(il, isStatic, calliParameterTypes, returnType); + EmitReturnHandling(il, returnType); // Create the delegate; it is also compiled at this point due to restrictedSkipVisibility=true. return (InvokeFunc_RefArgs)dm.CreateDelegate(typeof(InvokeFunc_RefArgs), target: null); @@ -194,115 +155,142 @@ private static void Unbox(ILGenerator il, Type parameterType) il.Emit(OpCodes.Ldobj, parameterType); } - private static void EmitCallAndReturnHandling(ILGenerator il, MethodBase method, bool backwardsCompat) + private static void EmitCall(ILGenerator il, bool isStatic, Type[]? calliParameterTypes, Type returnType) { - // For CallStack reasons, don't inline target method. - // Mono interpreter does not support\need this. - if (backwardsCompat && RuntimeFeature.IsDynamicCodeCompiled) + il.Emit(OpCodes.Ldarg_1); + + CallingConventions callingConventions = CallingConventions.Standard; + if (!isStatic) { -#if MONO - il.Emit(OpCodes.Call, Methods.DisableInline()); -#else - il.Emit(OpCodes.Call, Methods.NextCallReturnAddress()); - il.Emit(OpCodes.Pop); -#endif + callingConventions |= CallingConventions.HasThis; } - if (method is RuntimeConstructorInfo rci) - { - Debug.Assert(!method.IsStatic); - Debug.Assert(!method.IsVirtual); + il.EmitCalli(OpCodes.Calli, callingConventions, returnType, calliParameterTypes, optionalParameterTypes: null); + } - il.Emit(OpCodes.Call, rci); + private static void EmitReturnHandling(ILGenerator il, Type returnType) + { + if (returnType == typeof(void)) + { il.Emit(OpCodes.Ldnull); } - else + else if (returnType.IsValueType) { - if (method.IsStatic || method.DeclaringType!.IsValueType) - { - il.Emit(OpCodes.Call, (MethodInfo)method); - } - else - { - il.Emit(OpCodes.Callvirt, (MethodInfo)method); - } - - // Handle the return. - RuntimeType returnType; - if (method is RuntimeMethodInfo rmi) - { - returnType = (RuntimeType)rmi.ReturnType; - } - else - { - Debug.Assert(method is DynamicMethod); - returnType = (RuntimeType)((DynamicMethod)method).ReturnType; - } - - if (returnType == typeof(void)) - { - il.Emit(OpCodes.Ldnull); - } - else if (returnType.IsValueType) + il.Emit(OpCodes.Box, returnType); + } + else if (returnType.IsPointer) + { + il.Emit(OpCodes.Ldtoken, returnType); + il.Emit(OpCodes.Call, Methods.Type_GetTypeFromHandle()); + il.Emit(OpCodes.Call, Methods.Pointer_Box()); + } + else if (returnType.IsFunctionPointer) + { + il.Emit(OpCodes.Box, typeof(IntPtr)); + } + else if (returnType.IsByRef) + { + // Check for null ref return. + RuntimeType elementType = (RuntimeType)returnType.GetElementType()!; + Label retValueOk = il.DefineLabel(); + il.Emit(OpCodes.Dup); + il.Emit(OpCodes.Brtrue_S, retValueOk); + il.Emit(OpCodes.Call, Methods.ThrowHelper_Throw_NullReference_InvokeNullRefReturned()); + il.MarkLabel(retValueOk); + + // Handle per-type differences. + if (elementType.IsValueType) { - il.Emit(OpCodes.Box, returnType); + il.Emit(OpCodes.Ldobj, elementType); + il.Emit(OpCodes.Box, elementType); } - else if (returnType.IsPointer) + else if (elementType.IsPointer) { - il.Emit(OpCodes.Ldtoken, returnType); + il.Emit(OpCodes.Ldind_Ref); + il.Emit(OpCodes.Conv_U); + il.Emit(OpCodes.Ldtoken, elementType); il.Emit(OpCodes.Call, Methods.Type_GetTypeFromHandle()); il.Emit(OpCodes.Call, Methods.Pointer_Box()); } - else if (returnType.IsFunctionPointer) + else if (elementType.IsFunctionPointer) { il.Emit(OpCodes.Box, typeof(IntPtr)); } - else if (returnType.IsByRef) + else { - // Check for null ref return. - RuntimeType elementType = (RuntimeType)returnType.GetElementType()!; - Label retValueOk = il.DefineLabel(); - il.Emit(OpCodes.Dup); - il.Emit(OpCodes.Brtrue_S, retValueOk); - il.Emit(OpCodes.Call, Methods.ThrowHelper_Throw_NullReference_InvokeNullRefReturned()); - il.MarkLabel(retValueOk); - - // Handle per-type differences. - if (elementType.IsValueType) - { - il.Emit(OpCodes.Ldobj, elementType); - il.Emit(OpCodes.Box, elementType); - } - else if (elementType.IsPointer) - { - il.Emit(OpCodes.Ldind_Ref); - il.Emit(OpCodes.Conv_U); - il.Emit(OpCodes.Ldtoken, elementType); - il.Emit(OpCodes.Call, Methods.Type_GetTypeFromHandle()); - il.Emit(OpCodes.Call, Methods.Pointer_Box()); - } - else if (elementType.IsFunctionPointer) - { - il.Emit(OpCodes.Box, typeof(IntPtr)); - } - else - { - il.Emit(OpCodes.Ldobj, elementType); - } + il.Emit(OpCodes.Ldobj, elementType); } } il.Emit(OpCodes.Ret); } - private static Type GetParameterTypeForCallI(Type type) + private static void EmitLdargForInstance(ILGenerator il, bool isStatic, Type declaringType) + { + if (!isStatic) + { + il.Emit(OpCodes.Ldarg_0); + if (declaringType.IsValueType) + { + il.Emit(OpCodes.Unbox, declaringType); + } + } + } + + /// + /// Return the name of the dynamic method that will be created using the function pointer syntax of + /// of listing the parameter types and then the return type. + /// + private static string GetInvokeStubName(ReadOnlySpan parameterTypes, Type returnType) { - if (type.IsByRef || type.IsValueType || type.IsPointer || type.IsFunctionPointer) + // If changed, update native stack walking code that also uses "InvokeStub_" to ignore reflection frames. + const string InvokeStubPrefix = "InvokeStub_<"; + const int MaxChars = 255; + + Span value = stackalloc char[MaxChars]; + InvokeStubPrefix.AsSpan().CopyTo(value); + int charsWritten = InvokeStubPrefix.Length; + int parameterCount = parameterTypes.Length; + string typeName; + + // Parameters. + for (int i = 0; i < parameterCount; i++) { - return type; + typeName = parameterTypes[i].Name; + if (charsWritten + typeName.Length + 2 >= MaxChars) + { + return GetDefaultWhenLengthTooLong(); + } + + typeName.AsSpan().CopyTo(value.Slice(charsWritten, typeName.Length)); + charsWritten += typeName.Length; + + value[charsWritten++] = ','; + value[charsWritten++] = ' '; } - return typeof(object); + // Return type. + typeName = returnType.Name; + if (charsWritten + typeName.Length + 2 >= MaxChars) + { + return GetDefaultWhenLengthTooLong(); + } + + typeName.AsSpan().CopyTo(value.Slice(charsWritten, typeName.Length)); + charsWritten += typeName.Length; + + // Closing '>'. + value[charsWritten++] = '>'; + value[charsWritten++] = ' '; + + // Success. The dynamic method's Name property will append the delegate's parameter types + // to the end of the name. + return new string(value.Slice(0, charsWritten)); + + string GetDefaultWhenLengthTooLong() + { + return $"{InvokeStubPrefix}({parameterCount}) "; + } } private static class ThrowHelper @@ -339,15 +327,9 @@ public static MethodInfo Pointer_Box() => public static MethodInfo Type_GetTypeFromHandle() => s_Type_GetTypeFromHandle ??= typeof(Type).GetMethod(nameof(Type.GetTypeFromHandle), [typeof(RuntimeTypeHandle)])!; -#if MONO - private static MethodInfo? s_DisableInline; - public static MethodInfo DisableInline() => - s_DisableInline ??= typeof(System.Runtime.CompilerServices.JitHelpers).GetMethod(nameof(System.Runtime.CompilerServices.JitHelpers.DisableInline), BindingFlags.NonPublic | BindingFlags.Static)!; -#else private static MethodInfo? s_NextCallReturnAddress; public static MethodInfo NextCallReturnAddress() => s_NextCallReturnAddress ??= typeof(StubHelpers.StubHelpers).GetMethod(nameof(StubHelpers.StubHelpers.NextCallReturnAddress), BindingFlags.NonPublic | BindingFlags.Static)!; -#endif } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Constructor.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Constructor.cs deleted file mode 100644 index afd2525a817631..00000000000000 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Constructor.cs +++ /dev/null @@ -1,79 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Globalization; -using System.Runtime; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using static System.Reflection.MethodBase; - -namespace System.Reflection -{ - internal sealed partial class MethodBaseInvoker - { - // The rarely used scenario of calling the constructor on an existing instance. - internal unsafe void InvokeConstructorWithoutAlloc( - object? obj, - BindingFlags invokeAttr, - Binder? binder, - object?[] parameters, - CultureInfo? culture) - { - bool wrapInTargetInvocationException = (invokeAttr & BindingFlags.DoNotWrapExceptions) == 0; - int argCount = _argCount; - - scoped Span shouldCopyBack = stackalloc bool[argCount]; - IntPtr* pStorage = stackalloc IntPtr[2 * argCount]; - NativeMemory.Clear(pStorage, (nuint)(2 * argCount) * (nuint)sizeof(IntPtr)); - Span copyOfArgs = new(ref Unsafe.AsRef(pStorage), argCount); - GCFrameRegistration regArgStorage = new((void**)pStorage, (uint)argCount, areByRefs: false); - IntPtr* pByRefStorage = pStorage + argCount; - GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)argCount, areByRefs: true); - - try - { - GCFrameRegistration.RegisterForGCReporting(®ArgStorage); - GCFrameRegistration.RegisterForGCReporting(®ByRefStorage); - - CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); - - for (int i = 0; i < argCount; i++) - { - *(ByReference*)(pByRefStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? - ByReference.Create(ref Unsafe.AsRef(pStorage + i).GetRawData()) : - ByReference.Create(ref Unsafe.AsRef(pStorage + i)); - } - - try - { - // Use the interpreted version to avoid having to generate a new method that doesn't allocate. - InterpretedInvoke_Constructor(obj, pByRefStorage); - } - catch (Exception e) when (wrapInTargetInvocationException) - { - throw new TargetInvocationException(e); - } - - CopyBack(parameters, copyOfArgs, shouldCopyBack); - } - finally - { - GCFrameRegistration.UnregisterForGCReporting(®ByRefStorage); - GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); - } - } - - internal unsafe void InvokeConstructorWithoutAlloc(object? obj, bool wrapInTargetInvocationException) - { - try - { - // Use the interpreted version to avoid having to generate a new method that doesn't allocate. - InterpretedInvoke_Constructor(obj, null); - } - catch (Exception e) when (wrapInTargetInvocationException) - { - throw new TargetInvocationException(e); - } - } - } -} diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index ecb353c8e6bacc..53e8a88c4a82dc 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -26,12 +26,14 @@ internal sealed partial class MethodBaseInvoker private readonly MethodBase _method; private readonly int _argCount; private readonly bool _needsByRefStrategy; + private readonly IntPtr _functionPointer; private MethodBaseInvoker(MethodBase method, RuntimeType[] argumentTypes) { _method = method; _argTypes = argumentTypes; _argCount = _argTypes.Length; + _functionPointer = method.MethodHandle.GetFunctionPointer(); Initialize(argumentTypes, out _strategy, out _invokerArgFlags, out _needsByRefStrategy); } @@ -49,12 +51,12 @@ internal static void ThrowTargetParameterCountException() if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method, backwardsCompat: true); + DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); } try { - return _invokeFunc_RefArgs!(obj, refArguments: null); + return _invokeFunc_RefArgs!(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), refArguments: null); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -83,7 +85,7 @@ internal static void ThrowTargetParameterCountException() object? ret; if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy, backwardsCompat: true); + DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); } CheckArguments(parametersSpan, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); @@ -92,7 +94,7 @@ internal static void ThrowTargetParameterCountException() { try { - ret = _invokeFunc_ObjSpanArgs(obj, copyOfArgs); + ret = _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -124,7 +126,7 @@ internal static void ThrowTargetParameterCountException() object? ret; if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy, backwardsCompat: true); + DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); } CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); @@ -133,7 +135,7 @@ internal static void ThrowTargetParameterCountException() { try { - ret = _invokeFunc_ObjSpanArgs(obj, copyOfArgs); + ret = _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -156,7 +158,7 @@ internal static void ThrowTargetParameterCountException() if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method, backwardsCompat: true); + DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); } StackAllocatedByRefs byrefs = default; @@ -171,7 +173,7 @@ internal static void ThrowTargetParameterCountException() try { - return _invokeFunc_RefArgs!(obj, pByRefFixedStorage); + return _invokeFunc_RefArgs!(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), pByRefFixedStorage); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -195,7 +197,7 @@ internal static void ThrowTargetParameterCountException() if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy, backwardsCompat: true); + DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); } if (_invokeFunc_ObjSpanArgs is not null) @@ -214,7 +216,7 @@ internal static void ThrowTargetParameterCountException() try { - ret = _invokeFunc_ObjSpanArgs(obj, copyOfArgs); + ret = _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -232,7 +234,7 @@ internal static void ThrowTargetParameterCountException() { if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method, backwardsCompat: true); + DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); } IntPtr* pStorage = stackalloc IntPtr[3 * _argCount]; @@ -259,7 +261,7 @@ internal static void ThrowTargetParameterCountException() try { - ret = _invokeFunc_RefArgs!(obj, pByRefStorage); + ret = _invokeFunc_RefArgs!(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), pByRefStorage); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -300,7 +302,7 @@ internal void InvokePropertySetter( { try { - _invokeFunc_ObjSpanArgs(obj, copyOfArgs); + _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -312,7 +314,7 @@ internal void InvokePropertySetter( if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) { // Initialize for next time. - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy, backwardsCompat: true); + DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); } InvokeDirectByRefWithFewArgs(obj, copyOfArgs, invokeAttr); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index d7d8ff6e01d98b..97f4fa5ebcd9fc 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -36,6 +36,7 @@ public sealed partial class MethodInvoker private readonly MethodBase _method; private readonly bool _needsByRefStrategy; private readonly bool _isStatic; + private readonly IntPtr _functionPointer; /// /// Creates a new instance of MethodInvoker. @@ -83,6 +84,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] argumentTypes) _argTypes = argumentTypes; _argCount = _argTypes.Length; _isStatic = _method.IsStatic; + _functionPointer = method.MethodHandle.GetFunctionPointer(); Initialize(argumentTypes, out _strategy, out _invokerArgFlags, out _needsByRefStrategy); } @@ -215,15 +217,15 @@ private MethodInvoker(MethodBase method, RuntimeType[] argumentTypes) // Check fast path first. if (_invokeFunc_Obj4Args is not null) { - return _invokeFunc_Obj4Args(obj, arg1, arg2, arg3, arg4); + return _invokeFunc_Obj4Args(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), arg1, arg2, arg3, arg4); } if ((_strategy & InvokerStrategy.StrategyDetermined_Obj4Args) == 0) { - DetermineStrategy_Obj4Args(ref _strategy, ref _invokeFunc_Obj4Args, _method, _needsByRefStrategy, backwardsCompat: false); + DetermineStrategy_Obj4Args(ref _strategy, ref _invokeFunc_Obj4Args, _method, _needsByRefStrategy); if (_invokeFunc_Obj4Args is not null) { - return _invokeFunc_Obj4Args(obj, arg1, arg2, arg3, arg4); + return _invokeFunc_Obj4Args(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), arg1, arg2, arg3, arg4); } } @@ -311,16 +313,16 @@ private void ThrowForBadInvocationFlags() // Check fast path first. if (_invokeFunc_ObjSpanArgs is not null) { - return _invokeFunc_ObjSpanArgs(obj, copyOfArgs); + return _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); // No need to call CopyBack here since there are no ref values. } if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy, backwardsCompat: false); + DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); if (_invokeFunc_ObjSpanArgs is not null) { - return _invokeFunc_ObjSpanArgs(obj, copyOfArgs); + return _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); } } @@ -339,7 +341,7 @@ private void ThrowForBadInvocationFlags() { if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method, backwardsCompat: false); + DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); } StackAllocatedByRefs byrefs = default; @@ -352,7 +354,7 @@ private void ThrowForBadInvocationFlags() ByReference.Create(ref copyOfArgs[i]); } - return _invokeFunc_RefArgs!(obj, pByRefFixedStorage); + return _invokeFunc_RefArgs!(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), pByRefFixedStorage); } internal unsafe object? InvokeWithManyArgs(object? obj, Span arguments) @@ -363,7 +365,7 @@ private void ThrowForBadInvocationFlags() if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy, backwardsCompat: false); + DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); } if (_invokeFunc_ObjSpanArgs is not null) @@ -384,7 +386,7 @@ private void ThrowForBadInvocationFlags() copyOfArgs[i] = arg; } - ret = _invokeFunc_ObjSpanArgs(obj, copyOfArgs); + ret = _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); // No need to call CopyBack here since there are no ref values. } finally @@ -396,7 +398,7 @@ private void ThrowForBadInvocationFlags() { if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method, backwardsCompat: false); + DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); } IntPtr* pStorage = stackalloc IntPtr[2 * _argCount]; @@ -424,7 +426,7 @@ private void ThrowForBadInvocationFlags() ByReference.Create(ref Unsafe.AsRef(pStorage + i)); } - ret = _invokeFunc_RefArgs!(obj, pByRefStorage); + ret = _invokeFunc_RefArgs!(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), pByRefStorage); CopyBack(arguments, copyOfArgs, shouldCopyBack); } finally diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index d54640f8449d79..f5faa8664797fc 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -2,6 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Reflection.Emit; using System.Runtime.CompilerServices; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; @@ -105,8 +107,7 @@ internal static void DetermineStrategy_ObjSpanArgs( ref InvokeFunc_ObjSpanArgs? invokeFunc_ObjSpanArgs, MethodBase method, - bool needsByRefStrategy, - bool backwardsCompat) + bool needsByRefStrategy) { if (needsByRefStrategy) { @@ -123,7 +124,7 @@ ref InvokeFunc_ObjSpanArgs? { if (RuntimeFeature.IsDynamicCodeSupported) { - invokeFunc_ObjSpanArgs = CreateInvokeDelegate_ObjSpanArgs(method, backwardsCompat); + invokeFunc_ObjSpanArgs = CreateInvokeDelegate_ObjSpanArgs(method.DeclaringType!, method.IsStatic, GetNormalizedCalliParameters(method), GetNormalizedCalliReturnType(method)); } strategy |= InvokerStrategy.StrategyDetermined_ObjSpanArgs; @@ -134,8 +135,7 @@ internal static void DetermineStrategy_Obj4Args( ref InvokerStrategy strategy, ref InvokeFunc_Obj4Args? invokeFunc_Obj4Args, MethodBase method, - bool needsByRefStrategy, - bool backwardsCompat) + bool needsByRefStrategy) { if (needsByRefStrategy) { @@ -152,7 +152,7 @@ internal static void DetermineStrategy_Obj4Args( { if (RuntimeFeature.IsDynamicCodeSupported) { - invokeFunc_Obj4Args = CreateInvokeDelegate_Obj4Args(method, backwardsCompat); + invokeFunc_Obj4Args = CreateInvokeDelegate_Obj4Args(method.DeclaringType!, method.IsStatic, GetNormalizedCalliParameters(method), GetNormalizedCalliReturnType(method)); } strategy |= InvokerStrategy.StrategyDetermined_Obj4Args; @@ -162,8 +162,7 @@ internal static void DetermineStrategy_Obj4Args( internal static void DetermineStrategy_RefArgs( ref InvokerStrategy strategy, ref InvokeFunc_RefArgs? invokeFunc_RefArgs, - MethodBase method, - bool backwardsCompat) + MethodBase method) { if (((strategy & InvokerStrategy.HasBeenInvoked_RefArgs) == 0) && !Debugger.IsAttached) { @@ -175,11 +174,106 @@ internal static void DetermineStrategy_RefArgs( { if (RuntimeFeature.IsDynamicCodeSupported) { - invokeFunc_RefArgs = CreateInvokeDelegate_RefArgs(method, backwardsCompat); + invokeFunc_RefArgs = CreateInvokeDelegate_RefArgs(method.DeclaringType!, method.IsStatic, GetNormalizedCalliParameters(method), GetNormalizedCalliReturnType(method)); } strategy |= InvokerStrategy.StrategyDetermined_RefArgs; } } + + private static Type[] GetNormalizedCalliParameters(MethodBase method) + { + ReadOnlySpan parameters = method.GetParametersAsSpan(); + Type[]? parameterTypes = parameters.Length == 0 ? Array.Empty() : new Type[parameters.Length]; + + for (int i = 0; i < parameters.Length; i++) + { + parameterTypes[i] = NormalizeCallIParameterType(parameters[i].ParameterType); + } + + return parameterTypes; + } + + internal static Type GetNormalizedCalliReturnType(MethodBase method) + { + Type returnType; + + if (method is RuntimeMethodInfo rmi) + { + returnType = NormalizeCallIParameterType(rmi.ReturnType); + } + else if (method is DynamicMethod dm) + { + returnType = NormalizeCallIParameterType(dm.ReturnType); + } + else + { + Debug.Assert(method is RuntimeConstructorInfo); + returnType = typeof(void); + } + + return returnType; + } + + /// + /// For reference types, use System.Object so we can share DynamicMethods in more places. + /// + internal static Type NormalizeCallIParameterType(Type type) + { + if (type.IsValueType || type.IsByRef || type.IsPointer || type.IsFunctionPointer) + { + return type; + } + + return typeof(object); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static IntPtr GetFunctionPointer(object? obj, IntPtr functionPointer, MethodBase method, Type[] parameterTypes) + { + if (obj is null || !method.IsVirtual || method.DeclaringType!.IsSealed || method.IsFinal) + { + return functionPointer; + } + + Type actualType = obj.GetType(); + if (actualType == method.DeclaringType) + { + return functionPointer; + } + + return GetFunctionPointerSlow(actualType, method, parameterTypes); + } + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", + Justification = "Reflection implementation")] + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2072:UnrecognizedReflectionPattern", + Justification = "Reflection implementation")] + // todo: optimize the polymorphic checks below. + internal static IntPtr GetFunctionPointerSlow(Type type, MethodBase method, Type[] parameterTypes) + { + if (method.DeclaringType!.IsInterface) + { + InterfaceMapping mapping = type.GetInterfaceMap(method.DeclaringType); + + for (int i = 0; i < mapping.InterfaceMethods.Length; i++) + { + if (mapping.InterfaceMethods[i] == method) + { + return mapping.TargetMethods[i].MethodHandle.GetFunctionPointer(); + } + } + + throw new InvalidOperationException("todo:Method not found in interface mapping!!!"); + } + + method = type.GetMethod(method.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, parameterTypes)!; + if (method == null) + { + throw new InvalidOperationException("todo:Method not found!!!"); + } + + return method.MethodHandle.GetFunctionPointer(); + } } } From 76bd6f972cabd226521b7a9dbe8849091406f388 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Sun, 10 Nov 2024 17:48:20 -0600 Subject: [PATCH 03/24] Add back CallVirt; add caching and well-known signatures --- .../Reflection/ConstructorInvoker.CoreCLR.cs | 12 - .../Reflection/Emit/DynamicILGenerator.cs | 46 +- .../Reflection/Emit/DynamicMethod.CoreCLR.cs | 16 +- .../Reflection/MethodBaseInvoker.CoreCLR.cs | 31 +- .../Reflection/MethodInvoker.CoreCLR.cs | 28 - .../RuntimeConstructorInfo.CoreCLR.cs | 20 +- .../Reflection/RuntimeMethodInfo.CoreCLR.cs | 20 +- .../src/System/RuntimeType.CoreCLR.cs | 33 ++ .../System.Private.CoreLib.Shared.projitems | 2 + .../System/Reflection/ConstructorInvoker.cs | 285 +++++----- .../src/System/Reflection/Emit/ILGenerator.cs | 3 + .../System/Reflection/InvokeSignatureInfo.cs | 208 +++++++ .../src/System/Reflection/InvokerEmitUtil.cs | 271 +++++---- .../src/System/Reflection/MethodBase.cs | 46 +- .../System/Reflection/MethodBaseInvoker.cs | 520 +++++++++++------- .../src/System/Reflection/MethodInvoker.cs | 314 +++++------ ...MethodInvokerCommon.WellKnownSignatures.cs | 74 +++ .../System/Reflection/MethodInvokerCommon.cs | 269 +++------ .../Reflection/RuntimeConstructorInfo.cs | 43 +- .../System/Reflection/RuntimeMethodInfo.cs | 15 +- .../Reflection/MethodBaseInvoker.Mono.cs | 2 - 21 files changed, 1266 insertions(+), 992 deletions(-) create mode 100644 src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs create mode 100644 src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs index 9fcb0107d1e371..00dc216baa645f 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs @@ -5,17 +5,5 @@ namespace System.Reflection { public partial class ConstructorInvoker { - private readonly Signature? _signature; - - internal unsafe ConstructorInvoker(RuntimeConstructorInfo constructor) : this(constructor, constructor.Signature.Arguments) - { - _signature = constructor.Signature; - _invokeFunc_RefArgs = InterpretedInvoke; - } - - private unsafe object? InterpretedInvoke(object? obj, IntPtr _, IntPtr* args) - { - return RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _signature!, isConstructor: obj is null); - } } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs index 4c02d9abbb8056..f93ad07d37a275 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs @@ -168,11 +168,20 @@ public override void Emit(OpCode opcode, string str) // Signature related calls (vararg, calli) // // - public override void EmitCalli(OpCode opcode, - CallingConventions callingConvention, - Type? returnType, - Type[]? parameterTypes, - Type[]? optionalParameterTypes) + public override void EmitCalli( + OpCode opcode, + CallingConventions callingConvention, + Type? returnType, + Type[]? parameterTypes, + Type[]? optionalParameterTypes) + => EmitCalli(opcode, callingConvention, returnType, parameterTypes, optionalParameterTypes); + + internal override void EmitCalli( + OpCode opcode, + CallingConventions callingConvention, + Type? returnType, + ReadOnlySpan parameterTypes, + Type[]? optionalParameterTypes) { int stackchange = 0; if (optionalParameterTypes != null) @@ -194,8 +203,7 @@ public override void EmitCalli(OpCode opcode, if (returnType != typeof(void)) stackchange++; // Pop off arguments if any. - if (parameterTypes != null) - stackchange -= parameterTypes.Length; + stackchange -= parameterTypes.Length; // Pop off vararg arguments. if (optionalParameterTypes != null) stackchange -= optionalParameterTypes.Length; @@ -213,9 +221,7 @@ public override void EmitCalli(OpCode opcode, public override void EmitCalli(OpCode opcode, CallingConvention unmanagedCallConv, Type? returnType, Type[]? parameterTypes) { int stackchange = 0; - int cParams = 0; - if (parameterTypes != null) - cParams = parameterTypes.Length; + int cParams = parameterTypes is null ? 0 : parameterTypes.Length; SignatureHelper sig = GetMethodSigHelper(unmanagedCallConv, returnType, parameterTypes); @@ -224,8 +230,7 @@ public override void EmitCalli(OpCode opcode, CallingConvention unmanagedCallCon stackchange++; // Pop off arguments if any. - if (parameterTypes != null) - stackchange -= cParams; + stackchange -= cParams; // Pop the native function pointer. stackchange--; @@ -439,7 +444,7 @@ private int GetMemberRefToken(MethodInfo methodInfo, Type[]? optionalParameterTy private SignatureHelper GetMethodSigHelper( CallingConvention unmanagedCallConv, Type? returnType, - Type[]? parameterTypes) + ReadOnlySpan parameterTypes) { SignatureHelper sigHelp = SignatureHelper.GetMethodSigHelper(null, unmanagedCallConv, returnType); AddParameters(sigHelp, parameterTypes, null, null); @@ -449,7 +454,7 @@ private SignatureHelper GetMethodSigHelper( private SignatureHelper GetMethodSigHelper( CallingConventions call, Type? returnType, - Type[]? parameterTypes, + ReadOnlySpan parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers, Type[]? optionalParameterTypes) @@ -464,20 +469,17 @@ private SignatureHelper GetMethodSigHelper( return sig; } - private void AddParameters(SignatureHelper sigHelp, Type[]? parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers) + private void AddParameters(SignatureHelper sigHelp, ReadOnlySpan parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers) { - if (requiredCustomModifiers != null && (parameterTypes == null || requiredCustomModifiers.Length != parameterTypes.Length)) + if (requiredCustomModifiers != null && requiredCustomModifiers.Length != parameterTypes.Length) throw new ArgumentException(SR.Format(SR.Argument_MismatchedArrays, nameof(requiredCustomModifiers), nameof(parameterTypes))); - if (optionalCustomModifiers != null && (parameterTypes == null || optionalCustomModifiers.Length != parameterTypes.Length)) + if (optionalCustomModifiers != null && optionalCustomModifiers.Length != parameterTypes.Length) throw new ArgumentException(SR.Format(SR.Argument_MismatchedArrays, nameof(optionalCustomModifiers), nameof(parameterTypes))); - if (parameterTypes != null) + for (int i = 0; i < parameterTypes.Length; i++) { - for (int i = 0; i < parameterTypes.Length; i++) - { - sigHelp.AddDynamicArgument(m_scope, parameterTypes[i], requiredCustomModifiers?[i], optionalCustomModifiers?[i]); - } + sigHelp.AddDynamicArgument(m_scope, parameterTypes[i], requiredCustomModifiers?[i], optionalCustomModifiers?[i]); } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs index abdb8be14b27a3..96a114bc25d88d 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs @@ -90,7 +90,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - return _invoker ??= new MethodBaseInvoker(this, Signature); + return _invoker ??= MethodBaseInvoker.Create(this, Signature.Arguments); } } @@ -132,13 +132,17 @@ Signature LazyCreateSignature() int argCount = (parameters != null) ? parameters.Length : 0; if (Signature.Arguments.Length != argCount) throw new TargetParameterCountException(SR.Arg_ParmCnt); - object? retValue = argCount switch + + object? retValue = Invoker.Strategy switch { - 0 => Invoker.InvokeWithNoArgs(obj, invokeAttr), - 1 => Invoker.InvokeWithOneArg(obj, invokeAttr, binder, parameters!, culture), - 2 or 3 or 4 => Invoker.InvokeWithFewArgs(obj, invokeAttr, binder, parameters!, culture), - _ => Invoker.InvokeWithManyArgs(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, IntPtr.Zero, invokeAttr), + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, IntPtr.Zero, invokeAttr, binder, parameters![0], culture), + MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, IntPtr.Zero, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, IntPtr.Zero, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, IntPtr.Zero, invokeAttr, binder, parameters!, culture), + _ => Invoker.InvokeWithManyRefArgs(obj, IntPtr.Zero, invokeAttr, binder, parameters!, culture) }; + GC.KeepAlive(this); return retValue; } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs index 06d1fcd9f17006..f608c7f59b8223 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs @@ -7,32 +7,13 @@ namespace System.Reflection { internal partial class MethodBaseInvoker { - private readonly Signature? _signature; + internal static MethodBaseInvoker GetOrCreate(RuntimeMethodInfo method) => + MethodBaseInvoker.GetOrCreate(method, (RuntimeType)method.ReturnType, method.ArgumentTypes); - internal unsafe MethodBaseInvoker(RuntimeMethodInfo method) : this(method, method.Signature.Arguments) - { - _signature = method.Signature; - _invocationFlags = method.ComputeAndUpdateInvocationFlags(); - _invokeFunc_RefArgs = InterpretedInvoke_Method; - } + internal static MethodBaseInvoker GetOrCreate(RuntimeConstructorInfo constructor) => + MethodBaseInvoker.GetOrCreate(constructor, (RuntimeType)typeof(void), constructor.ArgumentTypes); - internal unsafe MethodBaseInvoker(RuntimeConstructorInfo constructor) : this(constructor, constructor.Signature.Arguments) - { - _signature = constructor.Signature; - _invocationFlags = constructor.ComputeAndUpdateInvocationFlags(); - _invokeFunc_RefArgs = InterpretedInvoke_Constructor; - } - - internal unsafe MethodBaseInvoker(DynamicMethod method, Signature signature) : this(method, signature.Arguments) - { - _signature = signature; - _invokeFunc_RefArgs = InterpretedInvoke_Method; - } - - private unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr _, IntPtr* args) => - RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _signature!, isConstructor: obj is null); - - private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr _, IntPtr* args) => - RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _signature!, isConstructor: false); + internal static MethodBaseInvoker GetOrCreate(DynamicMethod dm) => + MethodBaseInvoker.GetOrCreate(dm, (RuntimeType)dm.ReturnType, dm.ArgumentTypes); } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs index b10b5f9f0f0832..966e47bdba9e87 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs @@ -7,33 +7,5 @@ namespace System.Reflection { public partial class MethodInvoker { - private readonly Signature? _signature; - - private unsafe MethodInvoker(RuntimeMethodInfo method) : this(method, method.Signature.Arguments) - { - _signature = method.Signature; - _invokeFunc_RefArgs = InterpretedInvoke_Method; - _invocationFlags = method.ComputeAndUpdateInvocationFlags(); - } - - private unsafe MethodInvoker(DynamicMethod method) : this(method, method.Signature.Arguments) - { - _signature = method.Signature; - _invokeFunc_RefArgs = InterpretedInvoke_Method; - // No _invocationFlags for DynamicMethod. - } - - private unsafe MethodInvoker(RuntimeConstructorInfo constructor) : this(constructor, constructor.Signature.Arguments) - { - _signature = constructor.Signature; - _invokeFunc_RefArgs = InterpretedInvoke_Constructor; - _invocationFlags = constructor.ComputeAndUpdateInvocationFlags(); - } - - private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr _, IntPtr* args) => - RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _signature!, isConstructor: false); - - private unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr _, IntPtr* args) => - RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _signature!, isConstructor: obj is null); } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs index c16d10e97b38d5..5524be75ee2871 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs @@ -29,14 +29,19 @@ internal sealed partial class RuntimeConstructorInfo : ConstructorInfo, IRuntime private readonly BindingFlags m_bindingFlags; private Signature? m_signature; private MethodBaseInvoker? m_invoker; - + private InvocationFlags m_invocationFlags; + private IntPtr m_functionPointer; + // todo: add this CreateUninitializedCache or move to invoker, and no longer cache invoker internal InvocationFlags InvocationFlags { - [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - InvocationFlags flags = Invoker._invocationFlags; - Debug.Assert((flags & InvocationFlags.Initialized) == InvocationFlags.Initialized); + InvocationFlags flags = m_invocationFlags; + if (flags == InvocationFlags.Unknown) + { + m_invocationFlags = flags = ComputeInvocationFlags(); + } + return flags; } } @@ -46,7 +51,12 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - m_invoker ??= new MethodBaseInvoker(this); + if (m_invoker is null) + { + m_invoker ??= MethodBaseInvoker.GetOrCreate(this); + m_functionPointer = MethodHandle.GetFunctionPointer(); + } + return m_invoker; } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs index a4bd430b620082..1804b12cb5ee7d 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs @@ -28,14 +28,19 @@ internal sealed partial class RuntimeMethodInfo : MethodInfo, IRuntimeMethodInfo private readonly RuntimeType m_declaringType; private readonly object? m_keepalive; private MethodBaseInvoker? m_invoker; + private InvocationFlags m_invocationFlags; + private IntPtr m_functionPointer; internal InvocationFlags InvocationFlags { - [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - InvocationFlags flags = Invoker._invocationFlags; - Debug.Assert((flags & InvocationFlags.Initialized) == InvocationFlags.Initialized); + InvocationFlags flags = m_invocationFlags; + if (flags == InvocationFlags.Unknown) + { + m_invocationFlags = flags = ComputeInvocationFlags(); + } + return flags; } } @@ -45,7 +50,12 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - m_invoker ??= new MethodBaseInvoker(this); + if (m_invoker is null) + { + m_invoker ??= MethodBaseInvoker.GetOrCreate(this); + m_functionPointer = MethodHandle.GetFunctionPointer(); + } + return m_invoker; } } @@ -306,7 +316,7 @@ internal void InvokePropertySetter(object? obj, BindingFlags invokeAttr, Binder? throw new TargetParameterCountException(SR.Arg_ParmCnt); } - Invoker.InvokePropertySetter(obj, invokeAttr, binder, parameter, culture); + Invoker.InvokeWith1Arg(obj, m_functionPointer, invokeAttr, binder, parameter, culture); } #endregion diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs index 3537f7cbb7c6f6..07672d7a48d664 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs @@ -7,6 +7,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Reflection; +using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; @@ -4519,5 +4520,37 @@ internal V this[K key] m_Table.Insert(key, value); } } + + public unsafe V GetValue(int hashcode, in TAlternativeKey alternative, delegate* equals) where TAlternativeKey : allows ref struct + { + Table table = m_Table; + if (table is null) + return default!; + + if (hashcode < 0) + hashcode = ~hashcode; + + K[] keys = table.m_keys; + int index = hashcode % keys.Length; + + while (true) + { + K hit = Volatile.Read(ref keys[index]); + + if (hit != null) + { + if (equals(alternative, hit)) + return table.m_values[index]; + + index++; + if (index >= keys.Length) + index -= keys.Length; + } + else + { + return default!; + } + } + } } } diff --git a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems index 29e7621a89cb98..4480693e02e8ad 100644 --- a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems +++ b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems @@ -723,6 +723,7 @@ + @@ -740,6 +741,7 @@ + diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index a300b3e47ca3c5..828dddf2fc780f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -2,9 +2,12 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Reflection.Emit; using System.Runtime; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Threading; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; using static System.Reflection.MethodInvokerCommon; @@ -24,16 +27,16 @@ namespace System.Reflection /// public sealed partial class ConstructorInvoker { - private InvokeFunc_ObjSpanArgs? _invokeFunc_ObjSpanArgs; - private InvokeFunc_Obj4Args? _invokeFunc_Obj4Args; - private InvokeFunc_RefArgs? _invokeFunc_RefArgs; - private InvokerStrategy _strategy; - private readonly int _argCount; - private readonly RuntimeType[] _argTypes; + private static CerHashtable s_invokerFuncs; + private static object? s_invokerFuncsLock; + + private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. private readonly InvocationFlags _invocationFlags; + private readonly Delegate _invokeFunc; // todo: use GetMethodImpl and fcnptr? private readonly InvokerArgFlags[] _invokerArgFlags; private readonly RuntimeConstructorInfo _method; - private readonly bool _needsByRefStrategy; + private readonly InvokeSignatureInfo _signatureInfo; + private readonly InvokerStrategy _strategy; private readonly IntPtr _functionPointer; /// @@ -59,15 +62,27 @@ public static ConstructorInvoker Create(ConstructorInfo constructor) return new ConstructorInvoker(runtimeConstructor); } - private ConstructorInvoker(RuntimeConstructorInfo constructor, RuntimeType[] argumentTypes) + private ConstructorInvoker(RuntimeConstructorInfo constructor) { - _method = constructor; - _invocationFlags = constructor.ComputeAndUpdateInvocationFlags(); - _argTypes = argumentTypes; - _argCount = _argTypes.Length; - _functionPointer = constructor.MethodHandle.GetFunctionPointer(); + _invocationFlags = constructor.InvocationFlags; - Initialize(argumentTypes, out _strategy, out _invokerArgFlags, out _needsByRefStrategy); + if ((_invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers | InvocationFlags.NoConstructorInvoke)) == 0) + { + _functionPointer = constructor.MethodHandle.GetFunctionPointer(); + _method = constructor; + _signatureInfo = InvokeSignatureInfo.Create(constructor, constructor.ArgumentTypes); + _argCount = _signatureInfo.ParameterTypes.Length; + Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); + _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); + _invokeFunc = GetOrCreateDynamicMethod(ref s_invokerFuncs, ref s_invokerFuncsLock, _signatureInfo, constructor, _strategy); + } + else + { + _signatureInfo = null!; + _method = null!; + _invokeFunc = null!; + _invokerArgFlags = default!; + } } /// @@ -157,7 +172,7 @@ public object Invoke(object? arg1, object? arg2, object? arg3, object? arg4) private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4) { - if ((_invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers | InvocationFlags.NoConstructorInvoke)) != 0) + if (_invokeFunc is null) { _method.ThrowNoInvokeException(); } @@ -179,23 +194,8 @@ private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4 } object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); - - // Check fast path first. - if (_invokeFunc_Obj4Args is not null) - { - return _invokeFunc_Obj4Args(obj, _functionPointer, arg1, arg2, arg3, arg4)!; - } - - if ((_strategy & InvokerStrategy.StrategyDetermined_Obj4Args) == 0) - { - DetermineStrategy_Obj4Args(ref _strategy, ref _invokeFunc_Obj4Args, _method, _needsByRefStrategy); - if (_invokeFunc_Obj4Args is not null) - { - return _invokeFunc_Obj4Args(obj, _functionPointer, arg1, arg2, arg3, arg4)!; - } - } - - return InvokeDirectByRef(arg1, arg2, arg3, arg4); + ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, arg1, arg2, arg3, arg4); + return obj; } /// @@ -211,41 +211,80 @@ public object Invoke(Span arguments) MethodBaseInvoker.ThrowTargetParameterCountException(); } - if (!_needsByRefStrategy) + switch (_strategy) { - // Switch to fast path if possible. - switch (_argCount) - { - case 0: - return InvokeImpl(null, null, null, null); - case 1: - return InvokeImpl(arguments[0], null, null, null); - case 2: - return InvokeImpl(arguments[0], arguments[1], null, null); - case 3: - return InvokeImpl(arguments[0], arguments[1], arguments[2], null); - case 4: - return InvokeImpl(arguments[0], arguments[1], arguments[2], arguments[3]); - default: - break; - } + case InvokerStrategy.Obj4: + switch (_argCount) + { + case 0: + return InvokeImpl(null, null, null, null); + case 1: + return InvokeImpl(arguments[0], null, null, null); + case 2: + return InvokeImpl(arguments[0], arguments[1], null, null); + case 3: + return InvokeImpl(arguments[0], arguments[1], arguments[2], null); + default: + Debug.Assert(_argCount == 4); + return InvokeImpl(arguments[0], arguments[1], arguments[2], arguments[3]); + } + case InvokerStrategy.ObjSpan: + return InvokeWithSpanArgs(arguments); + case InvokerStrategy.Ref4: + return InvokeWithRefArgs4(arguments); + default: + Debug.Assert(_strategy == InvokerStrategy.RefMany); + return InvokeWithRefArgsMany(arguments); } + } - if ((_invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers)) != 0) + internal unsafe object InvokeWithSpanArgs(Span arguments) + { + if (_invokeFunc is null) { _method.ThrowNoInvokeException(); } - if (argLen > MaxStackAllocArgCount) + // todo: do we need a copyOfArgs if no ref args? + Span copyOfArgs; + GCFrameRegistration regArgStorage; + + object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + + IntPtr* pArgStorage = stackalloc IntPtr[_argCount]; + NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr)); + copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); + regArgStorage = new((void**)pArgStorage, (uint)_argCount, areByRefs: false); + + try + { + GCFrameRegistration.RegisterForGCReporting(®ArgStorage); + + for (int i = 0; i < _argCount; i++) + { + object? arg = arguments[i]; + CheckArgument(ref arg, i); + copyOfArgs[i] = arg; + } + + ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + // No need to call CopyBack here since there are no ref values. + } + finally { - return InvokeWithManyArgs(arguments); + GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); } - return InvokeWithFewArgs(arguments); + return obj; } - internal object InvokeWithFewArgs(Span arguments) + internal object InvokeWithRefArgs4(Span arguments) { + if (_invokeFunc is null) + { + _method.ThrowNoInvokeException(); + } + Debug.Assert(_argCount <= MaxStackAllocArgCount); StackAllocatedArgumentsWithCopyBack stackArgStorage = default; @@ -260,133 +299,55 @@ internal object InvokeWithFewArgs(Span arguments) } object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); - - // Check fast path first. - if (_invokeFunc_ObjSpanArgs is not null) - { - return _invokeFunc_ObjSpanArgs(obj, _functionPointer, copyOfArgs)!; - // No need to call CopyBack here since there are no ref values. - } - - if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) - { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); - if (_invokeFunc_ObjSpanArgs is not null) - { - return _invokeFunc_ObjSpanArgs(obj, _functionPointer, copyOfArgs)!; - } - } - - InvokeDirectByRefWithFewArgs(copyOfArgs); + ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); CopyBack(arguments, copyOfArgs, shouldCopyBack); return obj; } - internal object InvokeDirectByRef(object? arg1 = null, object? arg2 = null, object? arg3 = null, object? arg4 = null) + internal unsafe object InvokeWithRefArgsMany(Span arguments) { - StackAllocatedArguments stackStorage = new(arg1, arg2, arg3, arg4); - return InvokeDirectByRefWithFewArgs(((Span)stackStorage._args).Slice(0, _argCount)); - } - - internal unsafe object InvokeDirectByRefWithFewArgs(Span copyOfArgs) - { - if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) - { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); - } - - StackAllocatedByRefs byrefs = default; - IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; - - for (int i = 0; i < _argCount; i++) + if (_invokeFunc is null) { - *(ByReference*)(pByRefFixedStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? - ByReference.Create(ref copyOfArgs[i]!.GetRawData()) : - ByReference.Create(ref copyOfArgs[i]); + _method.ThrowNoInvokeException(); } - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); - return _invokeFunc_RefArgs!(obj, _functionPointer, pByRefFixedStorage)!; - } - - internal unsafe object InvokeWithManyArgs(Span arguments) - { Span copyOfArgs; GCFrameRegistration regArgStorage; - if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) - { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); - } - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); - if (_invokeFunc_ObjSpanArgs is not null) - { - IntPtr* pArgStorage = stackalloc IntPtr[_argCount]; - NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); - regArgStorage = new((void**)pArgStorage, (uint)_argCount, areByRefs: false); + IntPtr* pStorage = stackalloc IntPtr[2 * _argCount]; + NativeMemory.Clear(pStorage, (nuint)(2 * _argCount) * (nuint)sizeof(IntPtr)); + copyOfArgs = new(ref Unsafe.AsRef(pStorage), _argCount); - try - { - GCFrameRegistration.RegisterForGCReporting(®ArgStorage); + IntPtr* pByRefStorage = pStorage + _argCount; + scoped Span shouldCopyBack = stackalloc bool[_argCount]; - for (int i = 0; i < _argCount; i++) - { - object? arg = arguments[i]; - CheckArgument(ref arg, i); - copyOfArgs[i] = arg; - } + regArgStorage = new((void**)pStorage, (uint)_argCount, areByRefs: false); + GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)_argCount, areByRefs: true); - _invokeFunc_ObjSpanArgs(obj, _functionPointer, copyOfArgs); - // No need to call CopyBack here since there are no ref values. - } - finally - { - GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); - } - } - else + try { - if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) - { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); - } - - IntPtr* pStorage = stackalloc IntPtr[2 * _argCount]; - NativeMemory.Clear(pStorage, (nuint)(2 * _argCount) * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pStorage), _argCount); + GCFrameRegistration.RegisterForGCReporting(®ArgStorage); + GCFrameRegistration.RegisterForGCReporting(®ByRefStorage); - IntPtr* pByRefStorage = pStorage + _argCount; - scoped Span shouldCopyBack = stackalloc bool[_argCount]; - - regArgStorage = new((void**)pStorage, (uint)_argCount, areByRefs: false); - GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)_argCount, areByRefs: true); - - try + for (int i = 0; i < _argCount; i++) { - GCFrameRegistration.RegisterForGCReporting(®ArgStorage); - GCFrameRegistration.RegisterForGCReporting(®ByRefStorage); - - for (int i = 0; i < _argCount; i++) - { - object? arg = arguments[i]; - shouldCopyBack[i] = CheckArgument(ref arg, i); - copyOfArgs[i] = arg; - *(ByReference*)(pByRefStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? - ByReference.Create(ref Unsafe.AsRef(pStorage + i).GetRawData()) : - ByReference.Create(ref Unsafe.AsRef(pStorage + i)); - } - - _invokeFunc_RefArgs!(obj, _functionPointer, pByRefStorage); - CopyBack(arguments, copyOfArgs, shouldCopyBack); - } - finally - { - GCFrameRegistration.UnregisterForGCReporting(®ByRefStorage); - GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); + object? arg = arguments[i]; + shouldCopyBack[i] = CheckArgument(ref arg, i); + copyOfArgs[i] = arg; + *(ByReference*)(pByRefStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? + ByReference.Create(ref Unsafe.AsRef(pStorage + i).GetRawData()) : + ByReference.Create(ref Unsafe.AsRef(pStorage + i)); } + + ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); + CopyBack(arguments, copyOfArgs, shouldCopyBack); + } + finally + { + GCFrameRegistration.UnregisterForGCReporting(®ByRefStorage); + GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); } return obj; @@ -417,7 +378,7 @@ internal void CopyBack(Span dest, ReadOnlySpan copyOfParameter [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool CheckArgument(ref object? arg, int i) { - RuntimeType sigType = _argTypes[i]; + RuntimeType sigType = (RuntimeType)_signatureInfo.ParameterTypes[i]; // Convert the type if necessary. // Note that Type.Missing is not supported. diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs index fb0703fe37d9a7..f746a27798fe04 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs @@ -42,6 +42,9 @@ protected ILGenerator() public abstract void EmitCalli(OpCode opcode, CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes, Type[]? optionalParameterTypes); + internal virtual void EmitCalli(OpCode opcode, CallingConventions callingConvention, + Type? returnType, ReadOnlySpan parameterTypes, Type[]? optionalParameterTypes) => throw new NotImplementedException(); + public abstract void EmitCalli(OpCode opcode, CallingConvention unmanagedCallConv, Type? returnType, Type[]? parameterTypes); public abstract void EmitCall(OpCode opcode, MethodInfo methodInfo, Type[]? optionalParameterTypes); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs new file mode 100644 index 00000000000000..c80b4ecb4cafee --- /dev/null +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs @@ -0,0 +1,208 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Diagnostics; + +namespace System.Reflection.Emit +{ + internal sealed class InvokeSignatureInfo + { + private readonly Type _declaringType; + private readonly Type[] _parameterTypes; + private readonly Type _returnType; + private readonly bool _isStatic; + + public static InvokeSignatureInfo Create(MethodBase method, Type[] parameterTypes) + { + if (method is RuntimeMethodInfo rmi) + { + return new InvokeSignatureInfo(declaringType: rmi.DeclaringType!, returnType: rmi.ReturnType, parameterTypes, rmi.IsStatic); + } + + if (method is RuntimeConstructorInfo rci) + { + Debug.Assert(rci.GetReturnType() == typeof(void)); + Debug.Assert(!rci.IsStatic); + + return new InvokeSignatureInfo(declaringType: rci.DeclaringType!, returnType: typeof(void), parameterTypes, isStatic: false); + } + + DynamicMethod dm = (DynamicMethod)method; + return new InvokeSignatureInfo(declaringType: dm.DeclaringType!, returnType: dm.ReturnType, parameterTypes, dm.IsStatic); + } + + public static InvokeSignatureInfo Create(in NormalizedLookupKey normalizedLookupKey) + { + return new InvokeSignatureInfo( + declaringType: normalizedLookupKey._declaringType, + returnType: normalizedLookupKey._returnType, + parameterTypes: normalizedLookupKey._parameterTypes, + isStatic: normalizedLookupKey._isStatic); + } + + public InvokeSignatureInfo(Type declaringType, Type returnType, Type[] parameterTypes, bool isStatic) + { + _declaringType = isStatic ? typeof(void) : declaringType; + _returnType = returnType; + _parameterTypes = parameterTypes; + _isStatic = isStatic; + } + + public Type DeclaringType => _declaringType; + public bool IsStatic => _isStatic; + public ReadOnlySpan ParameterTypes => _parameterTypes; + public Type ReturnType => _returnType; + + // Must be the same as NormalizedLookupKey.Comparer.Equals(). + public override bool Equals(object? other) + { + if (ReferenceEquals(this, other)) + { + return true; + } + + if (other is not InvokeSignatureInfo otherSig) + { + return false; + } + + if (!ReferenceEquals(_declaringType, otherSig._declaringType) || + !ReferenceEquals(_returnType, otherSig._returnType) || + _isStatic != otherSig._isStatic || + _parameterTypes.Length != otherSig._parameterTypes.Length) + { + return false; + } + + for (int i = 0; i < _parameterTypes.Length; i++) + { + if (!ReferenceEquals(_parameterTypes[i], otherSig._parameterTypes[i])) + { + return false; + } + } + + return true; + } + + public override int GetHashCode() => GetHashCode( + declaringType: _declaringType, + returnType: _returnType, + _parameterTypes); + + public static int GetHashCode(Type declaringType, Type returnType, Type[] parameterTypes) + { + int hashcode = declaringType.GetHashCode(); + hashcode = int.RotateLeft(hashcode, 5); + + hashcode ^= returnType.GetHashCode(); + hashcode = int.RotateLeft(hashcode, 5); + + for (int i = 0; i < parameterTypes.Length; i++) + { + hashcode ^= parameterTypes[i].GetHashCode(); + hashcode = int.RotateLeft(hashcode, 5); + } + + // We don't include _isStatic in the hashcode because it is already included with _declaringType==typeof(void). + + return hashcode; + } + + /// + /// Return an array of normalized types for a calli signature. + /// + /// + /// + private static Type[] GetNormalizedParameterTypes(Type[] parameterTypes) + { + if (parameterTypes.Length == 0) + { + return parameterTypes; + } + + Type[]? normalizedParameterTypes = null; + + // Check if we can re-use the existing array if it is already normalized. + for (int i = 0; i < parameterTypes.Length; i++) + { + if (!InvokeSignatureInfo.IsNormalized(parameterTypes[i])) + { + normalizedParameterTypes = new Type[parameterTypes.Length]; + break; + } + } + + if (normalizedParameterTypes is null) + { + return parameterTypes; + } + + for (int i = 0; i < parameterTypes.Length; i++) + { + normalizedParameterTypes[i] = NormalizeType(parameterTypes[i]); + } + + return normalizedParameterTypes; + } + + /// + /// Normalize the type for a calli signature. + /// + public static Type NormalizeType(Type type) => IsNormalized(type) ? type : typeof(object); + + public static bool IsNormalized(Type type) => + type == typeof(object) || + type == typeof(void) || + type.IsValueType || + type.IsByRef || + type.IsPointer || + type.IsFunctionPointer; + + /// + /// Provide a zero-alloc ref struct for lookup with normalized types for a Calli signature. + /// + internal readonly ref struct NormalizedLookupKey + { + internal readonly Type _declaringType; + internal readonly Type[] _parameterTypes; + internal readonly Type _returnType; + internal readonly bool _isStatic; + + public NormalizedLookupKey(Type declaringType, Type returnType, Type[] parameterTypes, bool isStatic) + { + _declaringType = isStatic ? typeof(void) : NormalizeType(declaringType); + _parameterTypes = GetNormalizedParameterTypes(parameterTypes); + _returnType = NormalizeType(returnType); + _isStatic = isStatic; + } + + public static bool AlternativeEquals(in NormalizedLookupKey @this, InvokeSignatureInfo signatureInfo) + { + if (!ReferenceEquals(@this._declaringType, signatureInfo._declaringType) || + !ReferenceEquals(@this._returnType, signatureInfo._returnType) || + @this._isStatic != signatureInfo._isStatic || + @this._parameterTypes.Length != signatureInfo._parameterTypes.Length) + { + return false; + } + + for (int i = 0; i < @this._parameterTypes.Length; i++) + { + if (!ReferenceEquals(@this._parameterTypes[i], signatureInfo._parameterTypes[i])) + { + return false; + } + } + + return true; + } + + public int AlternativeGetHashCode() => InvokeSignatureInfo.GetHashCode( + declaringType: _declaringType, + returnType: _returnType, + _parameterTypes); + } + } +} diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index dd712c0de7bbaf..fdfbc0006f5ad5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -9,29 +9,53 @@ namespace System.Reflection { internal static class InvokerEmitUtil { - internal unsafe delegate object? InvokeFunc_RefArgs(object? obj, IntPtr functionPointer, IntPtr* refArguments); - internal delegate object? InvokeFunc_ObjSpanArgs(object? obj, IntPtr functionPointer, Span arguments); + // If changed, update native stack walking code that also uses "InvokeStub_" to ignore reflection frames. + private const string InvokeStubPrefix = "InvokeStub_"; + + internal delegate object? InvokeFunc_Obj0Args(object? obj, IntPtr functionPointer); + internal delegate object? InvokeFunc_Obj1Arg(object? obj, IntPtr functionPointer, object? arg1); internal delegate object? InvokeFunc_Obj4Args(object? obj, IntPtr functionPointer, object? arg1, object? arg2, object? arg3, object? arg4); + internal delegate object? InvokeFunc_ObjSpanArgs(object? obj, IntPtr functionPointer, Span arguments); + internal unsafe delegate object? InvokeFunc_RefArgs(object? obj, IntPtr functionPointer, IntPtr* refArguments); - public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(Type declaringType, bool isStatic, Type[] calliParameterTypes, Type returnType) + public static unsafe InvokeFunc_Obj0Args CreateInvokeDelegate_Obj0Args(MethodBase? method, InvokeSignatureInfo signatureInfo, bool backwardsCompat) { - Type[] delegateParameters = [typeof(object), typeof(IntPtr), typeof(object), typeof(object), typeof(object), typeof(object)]; + DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr)]); + ILGenerator il = dm.GetILGenerator(); - DynamicMethod dm = new ( - GetInvokeStubName(calliParameterTypes, returnType), - returnType: typeof(object), - delegateParameters, - typeof(object).Module, // Use system module to identify our DynamicMethods. - skipVisibility: true); + EmitLdargForInstance(il, signatureInfo.IsStatic, signatureInfo.DeclaringType); + EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); + EmitReturnHandling(il, signatureInfo.ReturnType); + return (InvokeFunc_Obj0Args)dm.CreateDelegate(typeof(InvokeFunc_Obj0Args), target: null); + } + public static unsafe InvokeFunc_Obj1Arg CreateInvokeDelegate_Obj1Arg(MethodBase? method, InvokeSignatureInfo signatureInfo, bool backwardsCompat) + { + DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(object)]); + ILGenerator il = dm.GetILGenerator(); + + EmitLdargForInstance(il, signatureInfo.IsStatic, signatureInfo.DeclaringType); + + Debug.Assert(signatureInfo.ParameterTypes.Length == 1); + il.Emit(OpCodes.Ldarg_2); + UnboxSpecialType(il, (RuntimeType)signatureInfo.ParameterTypes[0]); + + EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); + EmitReturnHandling(il, signatureInfo.ReturnType); + return (InvokeFunc_Obj1Arg)dm.CreateDelegate(typeof(InvokeFunc_Obj1Arg), target: null); + } + + public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBase? method, InvokeSignatureInfo signatureInfo, bool backwardsCompat) + { + DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(object), typeof(object), typeof(object), typeof(object)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, isStatic, declaringType); + EmitLdargForInstance(il, signatureInfo.IsStatic, signatureInfo.DeclaringType); - // Push the arguments. - for (int i = 0; i < calliParameterTypes.Length; i++) + ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; + for (int i = 0; i < parameterTypes.Length; i++) { - RuntimeType parameterType = (RuntimeType)calliParameterTypes[i]; + RuntimeType parameterType = (RuntimeType)parameterTypes[i]; switch (i) { @@ -46,82 +70,48 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(Type decl break; } - if (parameterType.IsPointer || parameterType.IsFunctionPointer) - { - Unbox(il, typeof(IntPtr)); - } - else if (parameterType.IsValueType) - { - Unbox(il, parameterType); - } + UnboxSpecialType(il, parameterType); } - EmitCall(il, isStatic, calliParameterTypes, returnType); - EmitReturnHandling(il, returnType); - - // Create the delegate; it is also compiled at this point due to restrictedSkipVisibility=true. + EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); + EmitReturnHandling(il, signatureInfo.ReturnType); return (InvokeFunc_Obj4Args)dm.CreateDelegate(typeof(InvokeFunc_Obj4Args), target: null); } - public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Type declaringType, bool isStatic, Type[] calliParameterTypes, Type returnType) + public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(MethodBase? method, InvokeSignatureInfo signatureInfo, bool backwardsCompat) { - Type[] delegateParameters = [typeof(object), typeof(IntPtr), typeof(Span)]; - - DynamicMethod dm = new ( - GetInvokeStubName(calliParameterTypes, returnType), - returnType: typeof(object), - delegateParameters, - typeof(object).Module, // Use system module to identify our DynamicMethods. - skipVisibility: true); - + DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(Span)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, isStatic, declaringType); + EmitLdargForInstance(il, signatureInfo.IsStatic, signatureInfo.DeclaringType); - // Push the arguments. - for (int i = 0; i < calliParameterTypes.Length; i++) + ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; + for (int i = 0; i < parameterTypes.Length; i++) { - RuntimeType parameterType = (RuntimeType)calliParameterTypes[i]; + RuntimeType parameterType = (RuntimeType)parameterTypes[i]; il.Emit(OpCodes.Ldarga_S, 2); il.Emit(OpCodes.Ldc_I4, i); il.Emit(OpCodes.Call, Methods.Span_get_Item()); il.Emit(OpCodes.Ldind_Ref); - if (parameterType.IsPointer || parameterType.IsFunctionPointer) - { - Unbox(il, typeof(IntPtr)); - } - else if (parameterType.IsValueType) - { - Unbox(il, parameterType); - } + UnboxSpecialType(il, parameterType); } - EmitCall(il, isStatic, calliParameterTypes, returnType); - EmitReturnHandling(il, returnType); - - // Create the delegate; it is also compiled at this point due to restrictedSkipVisibility=true. + EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); + EmitReturnHandling(il, signatureInfo.ReturnType); return (InvokeFunc_ObjSpanArgs)dm.CreateDelegate(typeof(InvokeFunc_ObjSpanArgs), target: null); } - public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(Type declaringType, bool isStatic, Type[] calliParameterTypes, Type returnType) + public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase? method, InvokeSignatureInfo signatureInfo, bool backwardsCompat) { - Type[] delegateParameters = [typeof(object), typeof(IntPtr), typeof(IntPtr*)]; - - DynamicMethod dm = new ( - GetInvokeStubName(calliParameterTypes, returnType), - returnType: typeof(object), - delegateParameters, - typeof(object).Module, // Use system module to identify our DynamicMethods. - skipVisibility: true); - + DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(IntPtr*)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, isStatic, declaringType); + EmitLdargForInstance(il, signatureInfo.IsStatic, signatureInfo.DeclaringType); - // Push the arguments. - for (int i = 0; i < calliParameterTypes.Length; i++) + ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; + for (int i = 0; i < parameterTypes.Length; i++) { il.Emit(OpCodes.Ldarg_2); if (i != 0) @@ -132,17 +122,15 @@ public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(Type declar il.Emit(OpCodes.Ldfld, Methods.ByReferenceOfByte_Value()); - RuntimeType parameterType = (RuntimeType)calliParameterTypes[i]; + RuntimeType parameterType = (RuntimeType)parameterTypes[i]; if (!parameterType.IsByRef) { il.Emit(OpCodes.Ldobj, parameterType.IsPointer || parameterType.IsFunctionPointer ? typeof(IntPtr) : parameterType); } } - EmitCall(il, isStatic, calliParameterTypes, returnType); - EmitReturnHandling(il, returnType); - - // Create the delegate; it is also compiled at this point due to restrictedSkipVisibility=true. + EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); + EmitReturnHandling(il, signatureInfo.ReturnType); return (InvokeFunc_RefArgs)dm.CreateDelegate(typeof(InvokeFunc_RefArgs), target: null); } @@ -155,17 +143,57 @@ private static void Unbox(ILGenerator il, Type parameterType) il.Emit(OpCodes.Ldobj, parameterType); } - private static void EmitCall(ILGenerator il, bool isStatic, Type[]? calliParameterTypes, Type returnType) + private static void UnboxSpecialType(ILGenerator il, Type parameterType) + { + if (parameterType.IsPointer || parameterType.IsFunctionPointer) + { + Unbox(il, typeof(IntPtr)); + } + else if (parameterType.IsValueType) + { + Unbox(il, parameterType); + } + } + + private static DynamicMethod CreateDynamicMethod(MethodBase? method, InvokeSignatureInfo signatureInfo, Type[] delegateParameters) { - il.Emit(OpCodes.Ldarg_1); + return new DynamicMethod( + GetInvokeStubName(method, signatureInfo), + returnType: typeof(object), + delegateParameters, + typeof(object).Module, // Use system module to identify our DynamicMethods. + skipVisibility: true); // Supports creating the delegate immediately when calling CreateDelegate(). + } - CallingConventions callingConventions = CallingConventions.Standard; - if (!isStatic) + private static void EmitCall(ILGenerator il, MethodBase? method, InvokeSignatureInfo signatureInfo, bool isStatic, bool backwardsCompat) + { + if (method is null) { - callingConventions |= CallingConventions.HasThis; + CallingConventions callingConventions = CallingConventions.Standard; + if (!isStatic) + { + callingConventions |= CallingConventions.HasThis; + } + + il.Emit(OpCodes.Ldarg_1); + il.EmitCalli(OpCodes.Calli, callingConventions, signatureInfo.ReturnType, signatureInfo.ParameterTypes, optionalParameterTypes: null); } + else + { + // For CallStack reasons, don't inline target method. + // EmitCalli above and Mono interpreter do not need this. + if (backwardsCompat && RuntimeFeature.IsDynamicCodeCompiled) + { +#if MONO + il.Emit(OpCodes.Call, Methods.DisableInline()); +#else + il.Emit(OpCodes.Call, Methods.NextCallReturnAddress()); + il.Emit(OpCodes.Pop); +#endif + } - il.EmitCalli(OpCodes.Calli, callingConventions, returnType, calliParameterTypes, optionalParameterTypes: null); + il.Emit(OpCodes.Callvirt, (MethodInfo)method); + } } private static void EmitReturnHandling(ILGenerator il, Type returnType) @@ -238,25 +266,50 @@ private static void EmitLdargForInstance(ILGenerator il, bool isStatic, Type dec } /// - /// Return the name of the dynamic method that will be created using the function pointer syntax of + /// Return the name of the dynamic method that will be created using the function pointer syntax /// of listing the parameter types and then the return type. /// - private static string GetInvokeStubName(ReadOnlySpan parameterTypes, Type returnType) + private static string GetInvokeStubName(MethodBase? method, InvokeSignatureInfo signatureInfo) { - // If changed, update native stack walking code that also uses "InvokeStub_" to ignore reflection frames. - const string InvokeStubPrefix = "InvokeStub_<"; - const int MaxChars = 255; - - Span value = stackalloc char[MaxChars]; - InvokeStubPrefix.AsSpan().CopyTo(value); - int charsWritten = InvokeStubPrefix.Length; - int parameterCount = parameterTypes.Length; - string typeName; - - // Parameters. - for (int i = 0; i < parameterCount; i++) + if (method is not null) + { + string declaringTypeName = method.DeclaringType != null ? method.DeclaringType.Name + "." : string.Empty; + return InvokeStubPrefix + declaringTypeName + method.Name; + } + + return GetInvokeStubName(signatureInfo); + + static string GetInvokeStubName(InvokeSignatureInfo signatureInfo) { - typeName = parameterTypes[i].Name; + const int MaxChars = 256; + Span value = stackalloc char[MaxChars]; + + InvokeStubPrefix.AsSpan().CopyTo(value); + int charsWritten = InvokeStubPrefix.Length; + ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; + int parameterCount = parameterTypes.Length; + string typeName; + + value[charsWritten++] = '<'; + + // Parameters. + for (int i = 0; i < parameterCount; i++) + { + typeName = parameterTypes[i].Name; + if (charsWritten + typeName.Length + 2 >= MaxChars) + { + return GetDefaultWhenLengthTooLong(); + } + + typeName.AsSpan().CopyTo(value.Slice(charsWritten, typeName.Length)); + charsWritten += typeName.Length; + + value[charsWritten++] = ','; + value[charsWritten++] = ' '; + } + + // Return type. + typeName = signatureInfo.ReturnType.Name; if (charsWritten + typeName.Length + 2 >= MaxChars) { return GetDefaultWhenLengthTooLong(); @@ -265,31 +318,17 @@ private static string GetInvokeStubName(ReadOnlySpan parameterTypes, Type typeName.AsSpan().CopyTo(value.Slice(charsWritten, typeName.Length)); charsWritten += typeName.Length; - value[charsWritten++] = ','; + // Closing '>'. + value[charsWritten++] = '>'; value[charsWritten++] = ' '; - } - - // Return type. - typeName = returnType.Name; - if (charsWritten + typeName.Length + 2 >= MaxChars) - { - return GetDefaultWhenLengthTooLong(); - } - typeName.AsSpan().CopyTo(value.Slice(charsWritten, typeName.Length)); - charsWritten += typeName.Length; + // Success. Later on the dynamic method's Name property will append the delegate's parameter type names. + return new string(value.Slice(0, charsWritten)); - // Closing '>'. - value[charsWritten++] = '>'; - value[charsWritten++] = ' '; - - // Success. The dynamic method's Name property will append the delegate's parameter types - // to the end of the name. - return new string(value.Slice(0, charsWritten)); - - string GetDefaultWhenLengthTooLong() - { - return $"{InvokeStubPrefix}({parameterCount}) "; + string GetDefaultWhenLengthTooLong() + { + return $"{InvokeStubPrefix}({parameterCount}) "; + } } } @@ -327,9 +366,15 @@ public static MethodInfo Pointer_Box() => public static MethodInfo Type_GetTypeFromHandle() => s_Type_GetTypeFromHandle ??= typeof(Type).GetMethod(nameof(Type.GetTypeFromHandle), [typeof(RuntimeTypeHandle)])!; +#if MONO + private static MethodInfo? s_DisableInline; + public static MethodInfo DisableInline() => + s_DisableInline ??= typeof(System.Runtime.CompilerServices.JitHelpers).GetMethod(nameof(System.Runtime.CompilerServices.JitHelpers.DisableInline), BindingFlags.NonPublic | BindingFlags.Static)!; +#else private static MethodInfo? s_NextCallReturnAddress; public static MethodInfo NextCallReturnAddress() => s_NextCallReturnAddress ??= typeof(StubHelpers.StubHelpers).GetMethod(nameof(StubHelpers.StubHelpers.NextCallReturnAddress), BindingFlags.NonPublic | BindingFlags.Static)!; +#endif } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs index 72be9d4897d582..ffe8b4381516d6 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs @@ -143,7 +143,7 @@ internal virtual Type[] GetParameterTypes() { if (paramInfo.DefaultValue == DBNull.Value) { - throw new ArgumentException(SR.Arg_VarMissNull, "parameters"); + ThrowHelperArgumentExceptionVariableMissing(); } object? arg = paramInfo.DefaultValue; @@ -165,17 +165,41 @@ internal virtual Type[] GetParameterTypes() return arg; } - [Flags] - internal enum InvokerStrategy : int - { - HasBeenInvoked_ObjSpanArgs = 0x1, - StrategyDetermined_ObjSpanArgs = 0x2, + [DoesNotReturn] + internal static void ThrowHelperArgumentExceptionVariableMissing() => + throw new ArgumentException(SR.Arg_VarMissNull, "parameters"); - HasBeenInvoked_Obj4Args = 0x4, - StrategyDetermined_Obj4Args = 0x8, - - HasBeenInvoked_RefArgs = 0x10, - StrategyDetermined_RefArgs = 0x20, + internal enum InvokerStrategy + { + /// + /// Optimized for no arguments. + /// + Obj0 = 0, + + /// + /// Optimized for 1 argument. + /// + Obj1 = 1, + + /// + /// Optimized for 4 arguments or less. + /// + Obj4 = 2, + + /// + /// Optimized for 5 arguments or more. + /// + ObjSpan = 3, + + /// + /// Slower approach that handles copy back for 4 arguments or less. + /// + Ref4 = 4, + + /// + /// Slower approach that handles copy back for 5 or more arguments. + /// + RefMany = 5, } [Flags] diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index 53e8a88c4a82dc..a383974ae3aee1 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -1,12 +1,16 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Reflection.Emit; using System.Runtime; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Threading; +using System.Collections.Concurrent; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; using static System.Reflection.MethodInvokerCommon; @@ -17,46 +21,128 @@ internal sealed partial class MethodBaseInvoker { internal const int MaxStackAllocArgCount = 4; - private InvokeFunc_ObjSpanArgs? _invokeFunc_ObjSpanArgs; - private InvokeFunc_RefArgs? _invokeFunc_RefArgs; - private InvokerStrategy _strategy; - internal readonly InvocationFlags _invocationFlags; + private static CerHashtable s_invokers; + private static object? s_invokersLock; + + // todo: use single with cast: private Delegate _invokeFunc; + private readonly InvokeFunc_Obj0Args? _invokeFunc_Obj0Args; + private readonly InvokeFunc_Obj1Arg? _invokeFunc_Obj1Arg; + private readonly InvokeFunc_ObjSpanArgs? _invokeFunc_ObjSpanArgs; + private readonly InvokeFunc_RefArgs? _invokeFunc_RefArgs; + + private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. private readonly InvokerArgFlags[] _invokerArgFlags; - private readonly RuntimeType[] _argTypes; - private readonly MethodBase _method; - private readonly int _argCount; - private readonly bool _needsByRefStrategy; - private readonly IntPtr _functionPointer; + private readonly MethodBase? _method; // This will be null when using Calli. + private readonly InvokeSignatureInfo _signatureInfo; + private readonly InvokerStrategy _strategy; + + public static MethodBaseInvoker Create(MethodBase method, RuntimeType[] argumentTypes) + { + return new MethodBaseInvoker(SupportsCalli(method) ? null : method, InvokeSignatureInfo.Create(method, argumentTypes)); + } - private MethodBaseInvoker(MethodBase method, RuntimeType[] argumentTypes) + public static MethodBaseInvoker GetOrCreate(MethodBase method, RuntimeType returnType, RuntimeType[] argumentTypes) { + if (!CanCacheInvoker(method)) + { + return Create(method, argumentTypes); + } + + InvokeSignatureInfo.NormalizedLookupKey key = new((RuntimeType)method.DeclaringType!, returnType, argumentTypes, method.IsStatic); + + int hashcode = key.AlternativeGetHashCode(); + MethodBaseInvoker existing; + unsafe + { + existing = s_invokers.GetValue(hashcode, key, &InvokeSignatureInfo.NormalizedLookupKey.AlternativeEquals); + } + + if (existing is not null) + { + return existing; + } + + if (s_invokersLock is null) + { + Interlocked.CompareExchange(ref s_invokersLock!, new object(), null); + } + + bool lockTaken = false; + try + { + Monitor.Enter(s_invokersLock, ref lockTaken); + + unsafe + { + existing = s_invokers.GetValue(hashcode, key, &InvokeSignatureInfo.NormalizedLookupKey.AlternativeEquals); + } + + if (existing is not null) + { + return existing; + } + + InvokeSignatureInfo memberBaseSignatureTypes = InvokeSignatureInfo.Create(key); + MethodBaseInvoker invoker = new MethodBaseInvoker(method: null, memberBaseSignatureTypes); + s_invokers[memberBaseSignatureTypes] = invoker; + return invoker; + } + finally + { + if (lockTaken) + { + Monitor.Exit(s_invokersLock); + } + } + } + + private static bool CanCacheInvoker(MethodBase method) => + CanCacheDynamicMethod(method) && + // Supporting default values would increase cache memory usage and slow down the common case. + !HasDefaultParameterValues(method); + + private MethodBaseInvoker(MethodBase? method, InvokeSignatureInfo signatureInfo) + { + _argCount = signatureInfo.ParameterTypes.Length; _method = method; - _argTypes = argumentTypes; - _argCount = _argTypes.Length; - _functionPointer = method.MethodHandle.GetFunctionPointer(); + _signatureInfo = signatureInfo; + Initialize(signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); - Initialize(argumentTypes, out _strategy, out _invokerArgFlags, out _needsByRefStrategy); + _strategy = GetInvokerStrategy(_argCount, needsByRefStrategy); + switch (_strategy) + { + case InvokerStrategy.Obj0: + _invokeFunc_Obj0Args = CreateInvokeDelegate_Obj0Args(_method, _signatureInfo, backwardsCompat: true); + break; + case InvokerStrategy.Obj1: + _invokeFunc_Obj1Arg = CreateInvokeDelegate_Obj1Arg(_method, _signatureInfo, backwardsCompat: true); + break; + case InvokerStrategy.Obj4: + case InvokerStrategy.ObjSpan: + _invokeFunc_ObjSpanArgs = CreateInvokeDelegate_ObjSpanArgs(_method, _signatureInfo, backwardsCompat: true); + break; + default: + Debug.Assert(_strategy == InvokerStrategy.Ref4 || _strategy == InvokerStrategy.RefMany); + _invokeFunc_RefArgs = CreateInvokeDelegate_RefArgs(_method, _signatureInfo, backwardsCompat: true); + break; + } } + internal InvokerStrategy Strategy => _strategy; + [DoesNotReturn] internal static void ThrowTargetParameterCountException() { throw new TargetParameterCountException(SR.Arg_ParmCnt); } - - internal unsafe object? InvokeWithNoArgs(object? obj, BindingFlags invokeAttr) + internal unsafe object? InvokeWith0Args(object? obj, IntPtr functionPointer, BindingFlags invokeAttr) { Debug.Assert(_argCount == 0); - if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) - { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); - } - try { - return _invokeFunc_RefArgs!(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), refArguments: null); + return _invokeFunc_Obj0Args!(obj, functionPointer); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -64,54 +150,31 @@ internal static void ThrowTargetParameterCountException() } } - internal unsafe object? InvokeWithOneArg( + internal unsafe object? InvokeWith1Arg( object? obj, + IntPtr functionPointer, BindingFlags invokeAttr, Binder? binder, - object?[] parameters, + object? parameter, CultureInfo? culture) { Debug.Assert(_argCount == 1); - object? arg = parameters[0]; - var parametersSpan = new ReadOnlySpan(in arg); - - object? copyOfArg = null; - Span copyOfArgs = new(ref copyOfArg); - - bool copyBack = false; - Span shouldCopyBack = new(ref copyBack); - - object? ret; - if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) - { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); - } - - CheckArguments(parametersSpan, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); + CheckArgument(ref parameter, 0, binder, culture, invokeAttr); - if (_invokeFunc_ObjSpanArgs is not null) + try { - try - { - ret = _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); - } - catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) - { - throw new TargetInvocationException(e); - } + return _invokeFunc_Obj1Arg!(obj, functionPointer, parameter); } - else + catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { - ret = InvokeDirectByRefWithFewArgs(obj, copyOfArgs, invokeAttr); + throw new TargetInvocationException(e); } - - CopyBack(parameters, copyOfArgs, shouldCopyBack); - return ret; } - internal unsafe object? InvokeWithFewArgs( + internal unsafe object? InvokeWith4Args( object? obj, + IntPtr functionPointer, BindingFlags invokeAttr, Binder? binder, object?[] parameters, @@ -123,66 +186,109 @@ internal static void ThrowTargetParameterCountException() Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, _argCount); Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); - object? ret; - if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) + CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); + + try { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); + return _invokeFunc_ObjSpanArgs!(obj, functionPointer, copyOfArgs); } + catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) + { + throw new TargetInvocationException(e); + } + } - CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); + internal unsafe object? InvokeWithSpanArgs( + object? obj, + IntPtr functionPointer, + BindingFlags invokeAttr, + Binder? binder, + object?[] parameters, + CultureInfo? culture) + { + Debug.Assert(_argCount > MaxStackAllocArgCount); - if (_invokeFunc_ObjSpanArgs is not null) + Span copyOfArgs; + object? ret; + GCFrameRegistration regArgStorage; + Span shouldCopyBack; + + IntPtr* pArgStorage = stackalloc IntPtr[_argCount * 2]; + NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr) * 2); + copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); + regArgStorage = new((void**)pArgStorage, (uint)_argCount, areByRefs: false); + shouldCopyBack = new Span(pArgStorage + _argCount, _argCount); + + try { + GCFrameRegistration.RegisterForGCReporting(®ArgStorage); + + CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); + try { - ret = _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); + ret = _invokeFunc_ObjSpanArgs!(obj, functionPointer, copyOfArgs); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { throw new TargetInvocationException(e); } + + CopyBack(parameters, copyOfArgs, shouldCopyBack); } - else + finally { - ret = InvokeDirectByRefWithFewArgs(obj, copyOfArgs, invokeAttr); - + GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); } - CopyBack(parameters, copyOfArgs, shouldCopyBack); return ret; } - internal unsafe object? InvokeDirectByRefWithFewArgs(object? obj, Span copyOfArgs, BindingFlags invokeAttr) + internal unsafe object? InvokeWith4RefArgs( + object? obj, + IntPtr functionPointer, + BindingFlags invokeAttr, + Binder? binder, + object?[] parameters, + CultureInfo? culture) { Debug.Assert(_argCount <= MaxStackAllocArgCount); - if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) - { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); - } + StackAllocatedArgumentsWithCopyBack stackArgStorage = default; + Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, _argCount); + Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); StackAllocatedByRefs byrefs = default; IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; + CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); + for (int i = 0; i < _argCount; i++) { *(ByReference*)(pByRefFixedStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? ByReference.Create(ref copyOfArgs[i]!.GetRawData()) : +#pragma warning disable CS9080 ByReference.Create(ref copyOfArgs[i]); +#pragma warning restore CS9080 } + object? ret; try { - return _invokeFunc_RefArgs!(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), pByRefFixedStorage); + ret = _invokeFunc_RefArgs!(obj, functionPointer, pByRefFixedStorage); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { throw new TargetInvocationException(e); } + + CopyBack(parameters, copyOfArgs, shouldCopyBack); + return ret; } - internal unsafe object? InvokeWithManyArgs( + internal unsafe object? InvokeWithManyRefArgs( object? obj, + IntPtr functionPointer, BindingFlags invokeAttr, Binder? binder, object?[] parameters, @@ -190,135 +296,48 @@ internal static void ThrowTargetParameterCountException() { Debug.Assert(_argCount > MaxStackAllocArgCount); - Span copyOfArgs; object? ret; - GCFrameRegistration regArgStorage; - Span shouldCopyBack; - - if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) - { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); - } - - if (_invokeFunc_ObjSpanArgs is not null) - { - IntPtr* pArgStorage = stackalloc IntPtr[_argCount * 2]; - NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr) * 2); - copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); - regArgStorage = new((void**)pArgStorage, (uint)_argCount, areByRefs: false); - shouldCopyBack = new Span(pArgStorage + _argCount, _argCount); - try - { - GCFrameRegistration.RegisterForGCReporting(®ArgStorage); + IntPtr* pStorage = stackalloc IntPtr[3 * _argCount]; + NativeMemory.Clear(pStorage, (nuint)(3 * _argCount) * (nuint)sizeof(IntPtr)); + IntPtr* pByRefStorage = pStorage + _argCount; + Span copyOfArgs = new(ref Unsafe.AsRef(pStorage), _argCount); + GCFrameRegistration regArgStorage = new((void**)pStorage, (uint)_argCount, areByRefs: false); + GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)_argCount, areByRefs: true); + Span shouldCopyBack = new Span(pStorage + _argCount * 2, _argCount); - CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); - - try - { - ret = _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); - } - catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) - { - throw new TargetInvocationException(e); - } - - CopyBack(parameters, copyOfArgs, shouldCopyBack); - } - finally - { - GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); - } - } - else + try { - if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) - { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); - } + GCFrameRegistration.RegisterForGCReporting(®ArgStorage); + GCFrameRegistration.RegisterForGCReporting(®ByRefStorage); - IntPtr* pStorage = stackalloc IntPtr[3 * _argCount]; - NativeMemory.Clear(pStorage, (nuint)(3 * _argCount) * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pStorage), _argCount); - regArgStorage = new((void**)pStorage, (uint)_argCount, areByRefs: false); - IntPtr* pByRefStorage = pStorage + _argCount; - GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)_argCount, areByRefs: true); - shouldCopyBack = new Span(pStorage + _argCount * 2, _argCount); + CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); - try + for (int i = 0; i < _argCount; i++) { - GCFrameRegistration.RegisterForGCReporting(®ArgStorage); - GCFrameRegistration.RegisterForGCReporting(®ByRefStorage); - - CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); - - for (int i = 0; i < _argCount; i++) - { - *(ByReference*)(pByRefStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? - ByReference.Create(ref Unsafe.AsRef(pStorage + i).GetRawData()) : - ByReference.Create(ref Unsafe.AsRef(pStorage + i)); - } - - try - { - ret = _invokeFunc_RefArgs!(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), pByRefStorage); - } - catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) - { - throw new TargetInvocationException(e); - } - - CopyBack(parameters, copyOfArgs, shouldCopyBack); - } - finally - { - GCFrameRegistration.UnregisterForGCReporting(®ByRefStorage); - GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); + *(ByReference*)(pByRefStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? + ByReference.Create(ref Unsafe.AsRef(pStorage + i).GetRawData()) : + ByReference.Create(ref Unsafe.AsRef(pStorage + i)); } - } - - return ret; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void InvokePropertySetter( - object? obj, - BindingFlags invokeAttr, - Binder? binder, - object? parameter, - CultureInfo? culture) - { - Debug.Assert(_argCount == 1); - - object? copyOfArg = null; - Span copyOfArgs = new(ref copyOfArg, 1); - - bool copyBack = false; - Span shouldCopyBack = new(ref copyBack, 1); // Not used for setters - CheckArguments(new ReadOnlySpan(in parameter), copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); - - if (_invokeFunc_ObjSpanArgs is not null) // Fast path check - { try { - _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); + ret = _invokeFunc_RefArgs!(obj, functionPointer, pByRefStorage); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { throw new TargetInvocationException(e); } + + CopyBack(parameters, copyOfArgs, shouldCopyBack); } - else + finally { - if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) - { - // Initialize for next time. - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); - } - - InvokeDirectByRefWithFewArgs(obj, copyOfArgs, invokeAttr); + GCFrameRegistration.UnregisterForGCReporting(®ByRefStorage); + GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); } + + return ret; } // Copy modified values out. This is done with ByRef, Type.Missing and parameters changed by the Binder. @@ -344,46 +363,104 @@ internal void CopyBack(object?[] dest, Span copyOfParameters, Span parameters, Span copyOfParameters, Span shouldCopyBack, Binder? binder, CultureInfo? culture, - BindingFlags invokeAttr - ) + BindingFlags invokeAttr) { for (int i = 0; i < parameters.Length; i++) { object? arg = parameters[i]; - RuntimeType sigType = _argTypes[i]; + RuntimeType sigType = (RuntimeType)_signatureInfo.ParameterTypes[i]; // Convert a Type.Missing to the default value. if (ReferenceEquals(arg, Type.Missing)) { + if (_method is null) + { + ThrowHelperArgumentExceptionVariableMissing(); + } + arg = HandleTypeMissing(_method.GetParametersAsSpan()[i], sigType); shouldCopyBack[i] = true; } // Convert the type if necessary. - if (arg is null) + // Check fast path to ignore non-byref types for normalized arguments. + if (!ReferenceEquals(sigType, typeof(object))) { - if ((_invokerArgFlags[i] & InvokerArgFlags.IsValueType_ByRef_Or_Pointer) != 0) + if (arg is null) { - shouldCopyBack[i] = sigType.CheckValue(ref arg, binder, culture, invokeAttr); + if ((_invokerArgFlags[i] & InvokerArgFlags.IsValueType_ByRef_Or_Pointer) != 0) + { + shouldCopyBack[i] = sigType.CheckValue(ref arg, binder, culture, invokeAttr); + } } - } - else if (!ReferenceEquals(arg.GetType(), sigType)) - { - // Determine if we can use the fast path for byref types. - if (TryByRefFastPath(sigType, ref arg)) + // Check fast path to ignore when arg type matches signature type. + else if (!ReferenceEquals(sigType, arg.GetType())) { - // Fast path when the value's type matches the signature type of a byref parameter. - shouldCopyBack[i] = true; - } - else - { - shouldCopyBack[i] = sigType.CheckValue(ref arg, binder, culture, invokeAttr); + // Fast path to ignore byref types. + if (TryByRefFastPath(sigType, ref arg!)) + { + shouldCopyBack[i] = true; + } + else + { + shouldCopyBack[i] = sigType.CheckValue(ref arg, binder, culture, invokeAttr); + } } } @@ -391,6 +468,35 @@ BindingFlags invokeAttr } } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void CheckArgument( + ref object? arg, + int index, + Binder? binder, + CultureInfo? culture, + BindingFlags invokeAttr) + { + RuntimeType sigType = (RuntimeType)_signatureInfo.ParameterTypes[index]; + + // Convert a Type.Missing to the default value. + if (ReferenceEquals(arg, Type.Missing)) + { + if (_method is null) + { + // When _method is null, we are using Calli and previously checked if there were any default parameter values. + ThrowHelperArgumentExceptionVariableMissing(); + } + + arg = HandleTypeMissing(_method.GetParametersAsSpan()[index], sigType); + } + + // Convert the type if necessary. + if (!ReferenceEquals(sigType, typeof(object)) && !ReferenceEquals(sigType, arg?.GetType())) + { + sigType.CheckValue(ref arg, binder, culture, invokeAttr); + } + } + private static bool TryByRefFastPath(RuntimeType type, ref object arg) { if (RuntimeType.TryGetByRefElementType(type, out RuntimeType? sigElementType) && @@ -408,5 +514,21 @@ private static bool TryByRefFastPath(RuntimeType type, ref object arg) return false; } + + private static InvokerStrategy GetInvokerStrategy(int argCount, bool needsByRefStrategy) + { + if (needsByRefStrategy) + { + return argCount <= 4 ? InvokerStrategy.Ref4 : InvokerStrategy.RefMany; + } + + return argCount switch + { + 0 => InvokerStrategy.Obj0, + 1 => InvokerStrategy.Obj1, + 2 or 3 or 4 => InvokerStrategy.Obj4, + _ => InvokerStrategy.ObjSpan + }; + } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index 97f4fa5ebcd9fc..c7797fd9652c70 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Reflection.Emit; using System.Runtime; using System.Runtime.CompilerServices; @@ -25,18 +26,18 @@ namespace System.Reflection /// public sealed partial class MethodInvoker { - private InvokeFunc_ObjSpanArgs? _invokeFunc_ObjSpanArgs; - private InvokeFunc_Obj4Args? _invokeFunc_Obj4Args; - private InvokeFunc_RefArgs? _invokeFunc_RefArgs; + private static CerHashtable s_invokerFuncs; + private static object? s_invokerFuncsLock; + + private readonly Delegate? _invokeFunc; // todo: use GetMethodImpl and fcnptr? private InvokerStrategy _strategy; - private readonly int _argCount; - private readonly RuntimeType[] _argTypes; + + private readonly InvokeSignatureInfo _signatureInfo; private readonly InvocationFlags _invocationFlags; private readonly InvokerArgFlags[] _invokerArgFlags; private readonly MethodBase _method; - private readonly bool _needsByRefStrategy; - private readonly bool _isStatic; private readonly IntPtr _functionPointer; + private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. /// /// Creates a new instance of MethodInvoker. @@ -55,38 +56,42 @@ public static MethodInvoker Create(MethodBase method) if (method is RuntimeMethodInfo rmi) { - return new MethodInvoker(rmi); + return new MethodInvoker(rmi, rmi.ArgumentTypes, rmi.InvocationFlags); } - if (method is DynamicMethod dm) + if (method is RuntimeConstructorInfo rci) { - return new MethodInvoker(dm); + return new MethodInvoker(rci, rci.ArgumentTypes, rci.InvocationFlags); } - if (method is RuntimeConstructorInfo rci) + if (method is DynamicMethod dm) { - // This is useful for calling a constructor on an already-initialized object - // such as created from RuntimeHelpers.GetUninitializedObject(Type). - MethodInvoker invoker = new MethodInvoker(rci); - - // Use the interpreted version to avoid having to generate a new method that doesn't allocate. - invoker._strategy = GetStrategyForUsingInterpreted(); - - return invoker; + return new MethodInvoker(dm, dm.ArgumentTypes, InvocationFlags.Unknown); } throw new ArgumentException(SR.Argument_MustBeRuntimeMethod, nameof(method)); } - private MethodInvoker(MethodBase method, RuntimeType[] argumentTypes) + private MethodInvoker(MethodBase method, RuntimeType[] arguments, InvocationFlags invocationFlags) { - _method = method; - _argTypes = argumentTypes; - _argCount = _argTypes.Length; - _isStatic = _method.IsStatic; - _functionPointer = method.MethodHandle.GetFunctionPointer(); + _invocationFlags = invocationFlags; - Initialize(argumentTypes, out _strategy, out _invokerArgFlags, out _needsByRefStrategy); + if ((invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers | InvocationFlags.NoConstructorInvoke)) == 0) + { + _signatureInfo = InvokeSignatureInfo.Create(method, arguments); + _method = method; + _argCount = _signatureInfo.ParameterTypes.Length; + _functionPointer = method.MethodHandle.GetFunctionPointer(); + Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); + _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); + _invokeFunc = GetOrCreateDynamicMethod(ref s_invokerFuncs, ref s_invokerFuncsLock, _signatureInfo, method, _strategy); + } + else + { + _signatureInfo = null!; + _method = null!; + _invokerArgFlags = default!; + } } /// @@ -188,12 +193,12 @@ private MethodInvoker(MethodBase method, RuntimeType[] argumentTypes) private object? InvokeImpl(object? obj, object? arg1, object? arg2, object? arg3, object? arg4) { - if ((_invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers | InvocationFlags.NoConstructorInvoke)) != 0) + if (_invokeFunc is null) { ThrowForBadInvocationFlags(); } - if (!_isStatic) + if (!_signatureInfo.IsStatic) { ValidateInvokeTarget(obj, _method); } @@ -214,22 +219,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] argumentTypes) break; } - // Check fast path first. - if (_invokeFunc_Obj4Args is not null) - { - return _invokeFunc_Obj4Args(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), arg1, arg2, arg3, arg4); - } - - if ((_strategy & InvokerStrategy.StrategyDetermined_Obj4Args) == 0) - { - DetermineStrategy_Obj4Args(ref _strategy, ref _invokeFunc_Obj4Args, _method, _needsByRefStrategy); - if (_invokeFunc_Obj4Args is not null) - { - return _invokeFunc_Obj4Args(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), arg1, arg2, arg3, arg4); - } - } - - return InvokeDirectByRef(obj, arg1, arg2, arg3, arg4); + return ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, arg1, arg2, arg3, arg4); } /// @@ -246,44 +236,34 @@ private MethodInvoker(MethodBase method, RuntimeType[] argumentTypes) MethodBaseInvoker.ThrowTargetParameterCountException(); } - if (!_needsByRefStrategy) + switch (_strategy) { - // Switch to fast path if possible. - switch (_argCount) - { - case 0: - return InvokeImpl(obj, null, null, null, null); - case 1: - return InvokeImpl(obj, arguments[0], null, null, null); - case 2: - return InvokeImpl(obj, arguments[0], arguments[1], null, null); - case 3: - return InvokeImpl(obj, arguments[0], arguments[1], arguments[2], null); - case 4: - return InvokeImpl(obj, arguments[0], arguments[1], arguments[2], arguments[3]); - default: - break; - } - } - - if ((_invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers)) != 0) - { - ThrowForBadInvocationFlags(); - } - - if (!_isStatic) - { - ValidateInvokeTarget(obj, _method); - } - - if (argLen > MaxStackAllocArgCount) - { - return InvokeWithManyArgs(obj, arguments); + case InvokerStrategy.Obj4: + switch (_argCount) + { + case 0: + return InvokeImpl(obj, null, null, null, null); + case 1: + return InvokeImpl(obj, arguments[0], null, null, null); + case 2: + return InvokeImpl(obj, arguments[0], arguments[1], null, null); + case 3: + return InvokeImpl(obj, arguments[0], arguments[1], arguments[2], null); + default: + Debug.Assert(_argCount == 4); + return InvokeImpl(obj, arguments[0], arguments[1], arguments[2], arguments[3]); + } + case InvokerStrategy.ObjSpan: + return InvokeWithSpanArgs(obj, arguments); + case InvokerStrategy.Ref4: + return InvokeWithRefArgs4(obj, arguments); + default: + Debug.Assert(_strategy == InvokerStrategy.RefMany); + return InvokeWithRefArgsMany(obj, arguments); } - - return InvokeWithFewArgs(obj, arguments); } + [DoesNotReturn] private void ThrowForBadInvocationFlags() { if (_method is RuntimeMethodInfo rmi) @@ -295,148 +275,110 @@ private void ThrowForBadInvocationFlags() ((RuntimeConstructorInfo)_method).ThrowNoInvokeException(); } - internal object? InvokeWithFewArgs(object? obj, Span arguments) + internal unsafe object? InvokeWithSpanArgs(object? obj, Span arguments) { - Debug.Assert(_argCount <= MaxStackAllocArgCount); - - StackAllocatedArgumentsWithCopyBack stackArgStorage = default; - Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, _argCount); - scoped Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); - - for (int i = 0; i < _argCount; i++) + if (_invokeFunc is null) { - object? arg = arguments[i]; - shouldCopyBack[i] = CheckArgument(ref arg, i); - copyOfArgs[i] = arg; + ThrowForBadInvocationFlags(); } - // Check fast path first. - if (_invokeFunc_ObjSpanArgs is not null) - { - return _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); - // No need to call CopyBack here since there are no ref values. - } + Span copyOfArgs; + GCFrameRegistration regArgStorage; - if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) + IntPtr* pArgStorage = stackalloc IntPtr[_argCount]; + NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr)); + copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); + regArgStorage = new((void**)pArgStorage, (uint)_argCount, areByRefs: false); + + try { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); - if (_invokeFunc_ObjSpanArgs is not null) + GCFrameRegistration.RegisterForGCReporting(®ArgStorage); + + for (int i = 0; i < _argCount; i++) { - return _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); + object? arg = arguments[i]; + CheckArgument(ref arg, i); + copyOfArgs[i] = arg; } - } - - object? ret = InvokeDirectByRefWithFewArgs(obj, copyOfArgs); - CopyBack(arguments, copyOfArgs, shouldCopyBack); - return ret; - } - internal object? InvokeDirectByRef(object? obj, object? arg1 = null, object? arg2 = null, object? arg3 = null, object? arg4 = null) - { - StackAllocatedArguments stackStorage = new(arg1, arg2, arg3, arg4); - return InvokeDirectByRefWithFewArgs(obj, ((Span)stackStorage._args).Slice(0, _argCount)); + return ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + // No need to call CopyBack here since there are no ref values. + } + finally + { + GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); + } } - internal unsafe object? InvokeDirectByRefWithFewArgs(object? obj, Span copyOfArgs) + internal object? InvokeWithRefArgs4(object? obj, Span arguments) { - if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) + if (_invokeFunc is null) { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); + ThrowForBadInvocationFlags(); } - StackAllocatedByRefs byrefs = default; - IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; + Debug.Assert(_argCount <= MaxStackAllocArgCount); + + StackAllocatedArgumentsWithCopyBack stackArgStorage = default; + Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, _argCount); + scoped Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); for (int i = 0; i < _argCount; i++) { - *(ByReference*)(pByRefFixedStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? - ByReference.Create(ref copyOfArgs[i]!.GetRawData()) : - ByReference.Create(ref copyOfArgs[i]); + object? arg = arguments[i]; + shouldCopyBack[i] = CheckArgument(ref arg, i); + copyOfArgs[i] = arg; } - return _invokeFunc_RefArgs!(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), pByRefFixedStorage); + object? ret = ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + CopyBack(arguments, copyOfArgs, shouldCopyBack); + return ret; } - internal unsafe object? InvokeWithManyArgs(object? obj, Span arguments) + internal unsafe object? InvokeWithRefArgsMany(object? obj, Span arguments) { + if (_invokeFunc is null) + { + ThrowForBadInvocationFlags(); + } + Span copyOfArgs; GCFrameRegistration regArgStorage; - object? ret; - if ((_strategy & InvokerStrategy.StrategyDetermined_ObjSpanArgs) == 0) - { - DetermineStrategy_ObjSpanArgs(ref _strategy, ref _invokeFunc_ObjSpanArgs, _method, _needsByRefStrategy); - } + IntPtr* pStorage = stackalloc IntPtr[2 * _argCount]; + NativeMemory.Clear(pStorage, (nuint)(2 * _argCount) * (nuint)sizeof(IntPtr)); + copyOfArgs = new(ref Unsafe.AsRef(pStorage), _argCount); - if (_invokeFunc_ObjSpanArgs is not null) - { - IntPtr* pArgStorage = stackalloc IntPtr[_argCount]; - NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); - regArgStorage = new((void**)pArgStorage, (uint)_argCount, areByRefs: false); + IntPtr* pByRefStorage = pStorage + _argCount; + scoped Span shouldCopyBack = stackalloc bool[_argCount]; - try - { - GCFrameRegistration.RegisterForGCReporting(®ArgStorage); + regArgStorage = new((void**)pStorage, (uint)_argCount, areByRefs: false); + GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)_argCount, areByRefs: true); - for (int i = 0; i < _argCount; i++) - { - object? arg = arguments[i]; - CheckArgument(ref arg, i); - copyOfArgs[i] = arg; - } + try + { + GCFrameRegistration.RegisterForGCReporting(®ArgStorage); + GCFrameRegistration.RegisterForGCReporting(®ByRefStorage); - ret = _invokeFunc_ObjSpanArgs(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), copyOfArgs); - // No need to call CopyBack here since there are no ref values. - } - finally + for (int i = 0; i < _argCount; i++) { - GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); + object? arg = arguments[i]; + shouldCopyBack[i] = CheckArgument(ref arg, i); + copyOfArgs[i] = arg; + *(ByReference*)(pByRefStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? + ByReference.Create(ref Unsafe.AsRef(pStorage + i).GetRawData()) : + ByReference.Create(ref Unsafe.AsRef(pStorage + i)); } + + object? ret = ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); + CopyBack(arguments, copyOfArgs, shouldCopyBack); + return ret; } - else + finally { - if ((_strategy & InvokerStrategy.StrategyDetermined_RefArgs) == 0) - { - DetermineStrategy_RefArgs(ref _strategy, ref _invokeFunc_RefArgs, _method); - } - - IntPtr* pStorage = stackalloc IntPtr[2 * _argCount]; - NativeMemory.Clear(pStorage, (nuint)(2 * _argCount) * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pStorage), _argCount); - - IntPtr* pByRefStorage = pStorage + _argCount; - scoped Span shouldCopyBack = stackalloc bool[_argCount]; - - regArgStorage = new((void**)pStorage, (uint)_argCount, areByRefs: false); - GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)_argCount, areByRefs: true); - - try - { - GCFrameRegistration.RegisterForGCReporting(®ArgStorage); - GCFrameRegistration.RegisterForGCReporting(®ByRefStorage); - - for (int i = 0; i < _argCount; i++) - { - object? arg = arguments[i]; - shouldCopyBack[i] = CheckArgument(ref arg, i); - copyOfArgs[i] = arg; - *(ByReference*)(pByRefStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? - ByReference.Create(ref Unsafe.AsRef(pStorage + i).GetRawData()) : - ByReference.Create(ref Unsafe.AsRef(pStorage + i)); - } - - ret = _invokeFunc_RefArgs!(obj, GetFunctionPointer(obj, _functionPointer, _method, _argTypes), pByRefStorage); - CopyBack(arguments, copyOfArgs, shouldCopyBack); - } - finally - { - GCFrameRegistration.UnregisterForGCReporting(®ByRefStorage); - GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); - } + GCFrameRegistration.UnregisterForGCReporting(®ByRefStorage); + GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); } - - return ret; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -464,7 +406,7 @@ internal void CopyBack(Span dest, Span copyOfParameters, Span< [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool CheckArgument(ref object? arg, int i) { - RuntimeType sigType = _argTypes[i]; + RuntimeType sigType = (RuntimeType)_signatureInfo.ParameterTypes[i]; // Convert the type if necessary. // Note that Type.Missing is not supported. diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs new file mode 100644 index 00000000000000..7cb4784d9cbe7f --- /dev/null +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs @@ -0,0 +1,74 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Reflection.Emit; +using static System.Reflection.InvokerEmitUtil; + +namespace System.Reflection +{ + internal static partial class MethodInvokerCommon + { + public static bool TryGetWellKnownSignatureForInstanceAny(InvokeSignatureInfo signatureInfo, [NotNullWhen(true)] out Delegate? func) + { + Debug.Assert(signatureInfo.ParameterTypes.Length == 0); + + if (signatureInfo.DeclaringType != typeof(object)) + { + func = null!; + return false; + } + + Type returnType = signatureInfo.ReturnType; + + if (returnType == typeof(void)) + { + func = new InvokeFunc_Obj0Args(CallInstanceVoid); + } + else if (returnType == typeof(int)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(object)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + + // todo: add more types + + func = null!; + return false; + } + + public static bool TryGetWellKnownSignatureForInstanceAnyVoid(InvokeSignatureInfo signatureInfo, [NotNullWhen(true)] out Delegate? func) + { + Debug.Assert(signatureInfo.ParameterTypes.Length == 1); + + if (signatureInfo.DeclaringType != typeof(object) || signatureInfo.ReturnType != typeof(void)) + { + func = null!; + return false; + } + + Type arg1Type = signatureInfo.ParameterTypes[0]; + if (arg1Type == typeof(int)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(object)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + + // todo: add more types + + func = null!; + return false; + } + + private static unsafe object? CallInstanceVoid(object? obj, IntPtr functionPointer) { ((delegate* managed)functionPointer)(obj); return null; } + private static unsafe object? CallInstanceAny(object? obj, IntPtr functionPointer) => ((delegate* managed)functionPointer)(obj); + private static unsafe object? CallInstanceAnyVoid(object? obj, IntPtr functionPointer, object? arg1) { ((delegate* managed)functionPointer)(obj, (TArg1)arg1!); return null; } + } +} diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index f5faa8664797fc..26a8c59a272c15 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -5,42 +5,28 @@ using System.Diagnostics.CodeAnalysis; using System.Reflection.Emit; using System.Runtime.CompilerServices; +using System.Threading; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; namespace System.Reflection { - internal static class MethodInvokerCommon + internal static partial class MethodInvokerCommon { internal static void Initialize( - RuntimeType[] argumentTypes, - out InvokerStrategy strategy, - out InvokerArgFlags[] invokerFlags, - out bool needsByRefStrategy) + InvokeSignatureInfo signatureInfo, + out bool needsByRefStrategy, + out InvokerArgFlags[] invokerFlags) { - if (LocalAppContextSwitches.ForceInterpretedInvoke && !LocalAppContextSwitches.ForceEmitInvoke) - { - // Always use the native interpreted invoke. - // Useful for testing, to avoid startup overhead of emit, or for calling a ctor on already initialized object. - strategy = GetStrategyForUsingInterpreted(); - } - else if (LocalAppContextSwitches.ForceEmitInvoke && !LocalAppContextSwitches.ForceInterpretedInvoke) - { - // Always use emit invoke (if IsDynamicCodeSupported == true); useful for testing. - strategy = GetStrategyForUsingEmit(); - } - else - { - strategy = default; - } - - int argCount = argumentTypes.Length; - invokerFlags = new InvokerArgFlags[argCount]; needsByRefStrategy = false; + ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; + int argCount = parameterTypes.Length; + invokerFlags = new InvokerArgFlags[argCount]; + // Set invokerFlags[] and needsByRefStrategy. for (int i = 0; i < argCount; i++) { - RuntimeType type = argumentTypes[i]; + RuntimeType type = (RuntimeType)parameterTypes[i]; if (RuntimeTypeHandle.IsByRef(type)) { type = (RuntimeType)type.GetElementType(); @@ -72,208 +58,129 @@ internal static void Initialize( } } - internal static InvokerStrategy GetStrategyForUsingInterpreted() + public static InvokerStrategy GetInvokerStrategyForSpanInput(int argCount, bool needsByRefStrategy) { - // This causes the default strategy, which is interpreted, to always be used. - return InvokerStrategy.StrategyDetermined_Obj4Args | InvokerStrategy.StrategyDetermined_ObjSpanArgs | InvokerStrategy.StrategyDetermined_RefArgs; + if (needsByRefStrategy) + { + return InvokerStrategy.RefMany; + } + + return argCount <= 4 ? InvokerStrategy.Obj4 : InvokerStrategy.ObjSpan; } - private static InvokerStrategy GetStrategyForUsingEmit() + internal static Delegate CreateInvokeFunc(MethodBase? method, InvokeSignatureInfo signatureInfo, InvokerStrategy strategy, bool backwardsCompat) { - // This causes the emit strategy, if supported, to be used on the first call as well as subsequent calls. - return InvokerStrategy.HasBeenInvoked_Obj4Args | InvokerStrategy.HasBeenInvoked_ObjSpanArgs | InvokerStrategy.HasBeenInvoked_RefArgs; + Delegate? wellKnown; + + return strategy switch + { + InvokerStrategy.Obj0 => + TryGetWellKnownSignatureForInstanceAny(signatureInfo, out wellKnown) ? wellKnown : + CreateInvokeDelegate_Obj0Args(method, signatureInfo, backwardsCompat), + InvokerStrategy.Obj1 => + TryGetWellKnownSignatureForInstanceAnyVoid(signatureInfo, out wellKnown) ? wellKnown : + CreateInvokeDelegate_Obj1Arg(method, signatureInfo, backwardsCompat), + InvokerStrategy.Obj4 => CreateInvokeDelegate_Obj4Args(method, signatureInfo, backwardsCompat), + InvokerStrategy.ObjSpan => CreateInvokeDelegate_ObjSpanArgs(method, signatureInfo, backwardsCompat), + _ => CreateInvokeDelegate_RefArgs(method, signatureInfo, backwardsCompat) + }; } + internal static bool CanCacheDynamicMethod(MethodBase method) => + // The cache method's DeclaringType and other collectible parameters would be referenced. + !method.IsCollectible && + // Value types need to be unboxed which requires its type, so a cached value would not be very sharable. + !(method.DeclaringType!.IsValueType && !method.IsStatic) && + SupportsCalli(method); + /// - /// Confirm member invocation has an instance and is of the correct type + /// Determines if the method is not polymorphic and thus can be called with a calli instruction. /// - internal static void ValidateInvokeTarget(object? target, MethodBase method) + internal static bool SupportsCalli(MethodBase method) { - Debug.Assert(!method.IsStatic); - - if (target == null) - { - throw new TargetException(SR.RFLCT_Targ_StatMethReqTarg); - } + Debug.Assert(!method.DeclaringType!.IsValueType || method.DeclaringType.IsSealed); - if (!method.DeclaringType!.IsInstanceOfType(target)) - { - throw new TargetException(SR.Format(SR.RFLCT_Targ_ITargMismatch_WithType, method.DeclaringType, target.GetType())); - } + return method.IsStatic || + method.DeclaringType!.IsSealed || + method.IsFinal || + method is ConstructorInfo; } - internal static void DetermineStrategy_ObjSpanArgs( - ref InvokerStrategy strategy, - ref InvokeFunc_ObjSpanArgs? - invokeFunc_ObjSpanArgs, + internal static Delegate GetOrCreateDynamicMethod( + ref CerHashtable cache, + ref object? lockObject, + InvokeSignatureInfo signatureInfo, MethodBase method, - bool needsByRefStrategy) + InvokerStrategy strategy) { - if (needsByRefStrategy) + if (!CanCacheDynamicMethod(method)) { - // If ByRefs are used, we can't use this strategy. - strategy |= InvokerStrategy.StrategyDetermined_ObjSpanArgs; + return CreateInvokeFunc(method, signatureInfo, strategy, backwardsCompat: false); } - else if (((strategy & InvokerStrategy.HasBeenInvoked_ObjSpanArgs) == 0) && !Debugger.IsAttached) - { - // The first time, ignoring race conditions, use the slow path, except for the case when running under a debugger. - // This is a workaround for the debugger issues with understanding exceptions propagation over the slow path. - strategy |= InvokerStrategy.HasBeenInvoked_ObjSpanArgs; - } - else + + // Get the cached dynamic method. + Delegate invokeFunc = cache[signatureInfo]; + if (invokeFunc is null) { - if (RuntimeFeature.IsDynamicCodeSupported) + if (lockObject is null) { - invokeFunc_ObjSpanArgs = CreateInvokeDelegate_ObjSpanArgs(method.DeclaringType!, method.IsStatic, GetNormalizedCalliParameters(method), GetNormalizedCalliReturnType(method)); + Interlocked.CompareExchange(ref lockObject!, new object(), null); } - strategy |= InvokerStrategy.StrategyDetermined_ObjSpanArgs; - } - } - - internal static void DetermineStrategy_Obj4Args( - ref InvokerStrategy strategy, - ref InvokeFunc_Obj4Args? invokeFunc_Obj4Args, - MethodBase method, - bool needsByRefStrategy) - { - if (needsByRefStrategy) - { - // If ByRefs are used, we can't use this strategy. - strategy |= InvokerStrategy.StrategyDetermined_Obj4Args; - } - else if (((strategy & InvokerStrategy.HasBeenInvoked_Obj4Args) == 0) && !Debugger.IsAttached) - { - // The first time, ignoring race conditions, use the slow path, except for the case when running under a debugger. - // This is a workaround for the debugger issues with understanding exceptions propagation over the slow path. - strategy |= InvokerStrategy.HasBeenInvoked_Obj4Args; - } - else - { - if (RuntimeFeature.IsDynamicCodeSupported) + bool lockTaken = false; + try { - invokeFunc_Obj4Args = CreateInvokeDelegate_Obj4Args(method.DeclaringType!, method.IsStatic, GetNormalizedCalliParameters(method), GetNormalizedCalliReturnType(method)); + Monitor.Enter(lockObject, ref lockTaken); + invokeFunc = cache[signatureInfo]; + if (invokeFunc is null) + { + invokeFunc = CreateInvokeFunc(method, signatureInfo, strategy, backwardsCompat: false); + cache[signatureInfo] = invokeFunc; + } } - - strategy |= InvokerStrategy.StrategyDetermined_Obj4Args; - } - } - - internal static void DetermineStrategy_RefArgs( - ref InvokerStrategy strategy, - ref InvokeFunc_RefArgs? invokeFunc_RefArgs, - MethodBase method) - { - if (((strategy & InvokerStrategy.HasBeenInvoked_RefArgs) == 0) && !Debugger.IsAttached) - { - // The first time, ignoring race conditions, use the slow path, except for the case when running under a debugger. - // This is a workaround for the debugger issues with understanding exceptions propagation over the slow path. - strategy |= InvokerStrategy.HasBeenInvoked_RefArgs; - } - else - { - if (RuntimeFeature.IsDynamicCodeSupported) + finally { - invokeFunc_RefArgs = CreateInvokeDelegate_RefArgs(method.DeclaringType!, method.IsStatic, GetNormalizedCalliParameters(method), GetNormalizedCalliReturnType(method)); + if (lockTaken) + { + Monitor.Exit(lockObject); + } } - - strategy |= InvokerStrategy.StrategyDetermined_RefArgs; } + + return invokeFunc; } - private static Type[] GetNormalizedCalliParameters(MethodBase method) + internal static bool HasDefaultParameterValues(MethodBase method) { ReadOnlySpan parameters = method.GetParametersAsSpan(); - Type[]? parameterTypes = parameters.Length == 0 ? Array.Empty() : new Type[parameters.Length]; for (int i = 0; i < parameters.Length; i++) { - parameterTypes[i] = NormalizeCallIParameterType(parameters[i].ParameterType); - } - - return parameterTypes; - } - - internal static Type GetNormalizedCalliReturnType(MethodBase method) - { - Type returnType; - - if (method is RuntimeMethodInfo rmi) - { - returnType = NormalizeCallIParameterType(rmi.ReturnType); - } - else if (method is DynamicMethod dm) - { - returnType = NormalizeCallIParameterType(dm.ReturnType); - } - else - { - Debug.Assert(method is RuntimeConstructorInfo); - returnType = typeof(void); + if (parameters[i].HasDefaultValue) + { + return true; + } } - return returnType; + return false; } /// - /// For reference types, use System.Object so we can share DynamicMethods in more places. + /// Confirm member invocation has an instance and is of the correct type /// - internal static Type NormalizeCallIParameterType(Type type) - { - if (type.IsValueType || type.IsByRef || type.IsPointer || type.IsFunctionPointer) - { - return type; - } - - return typeof(object); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static IntPtr GetFunctionPointer(object? obj, IntPtr functionPointer, MethodBase method, Type[] parameterTypes) + internal static void ValidateInvokeTarget(object? target, MethodBase method) { - if (obj is null || !method.IsVirtual || method.DeclaringType!.IsSealed || method.IsFinal) - { - return functionPointer; - } - - Type actualType = obj.GetType(); - if (actualType == method.DeclaringType) - { - return functionPointer; - } - - return GetFunctionPointerSlow(actualType, method, parameterTypes); - } + Debug.Assert(!method.IsStatic); - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", - Justification = "Reflection implementation")] - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2072:UnrecognizedReflectionPattern", - Justification = "Reflection implementation")] - // todo: optimize the polymorphic checks below. - internal static IntPtr GetFunctionPointerSlow(Type type, MethodBase method, Type[] parameterTypes) - { - if (method.DeclaringType!.IsInterface) + if (target == null) { - InterfaceMapping mapping = type.GetInterfaceMap(method.DeclaringType); - - for (int i = 0; i < mapping.InterfaceMethods.Length; i++) - { - if (mapping.InterfaceMethods[i] == method) - { - return mapping.TargetMethods[i].MethodHandle.GetFunctionPointer(); - } - } - - throw new InvalidOperationException("todo:Method not found in interface mapping!!!"); + throw new TargetException(SR.RFLCT_Targ_StatMethReqTarg); } - method = type.GetMethod(method.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, parameterTypes)!; - if (method == null) + if (!method.DeclaringType!.IsInstanceOfType(target)) { - throw new InvalidOperationException("todo:Method not found!!!"); + throw new TargetException(SR.Format(SR.RFLCT_Targ_ITargMismatch_WithType, method.DeclaringType, target.GetType())); } - - return method.MethodHandle.GetFunctionPointer(); } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs index 839d79f89d8cfc..6a1dbfefdb955b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs @@ -10,8 +10,7 @@ namespace System.Reflection { internal sealed partial class RuntimeConstructorInfo : ConstructorInfo { - [MethodImpl(MethodImplOptions.NoInlining)] // move lazy invocation flags population out of the hot path - internal InvocationFlags ComputeAndUpdateInvocationFlags() + internal InvocationFlags ComputeInvocationFlags() { InvocationFlags invocationFlags = InvocationFlags.IsConstructor; // this is a given @@ -128,20 +127,14 @@ internal void ThrowNoInvokeException() return null; } - switch (argCount) + _ = Invoker.Strategy switch { - case 0 : - Invoker.InvokeWithNoArgs(obj, invokeAttr); - break; - case 1 : - Invoker.InvokeWithOneArg(obj, invokeAttr, binder, parameters!, culture); - break; - case 2 or 3 or 4 : - Invoker.InvokeWithFewArgs(obj, invokeAttr, binder, parameters!, culture); - break; - default: - Invoker.InvokeWithManyArgs(obj, invokeAttr, binder, parameters!, culture); - break; + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, m_functionPointer, invokeAttr), + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, m_functionPointer, invokeAttr, binder, parameters![0], culture), + MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), + _ => Invoker.InvokeWithManyRefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture) }; return null; @@ -176,20 +169,14 @@ public override object Invoke(BindingFlags invokeAttr, Binder? binder, object?[] throw new TargetInvocationException(e); } - switch (argCount) + _ = Invoker.Strategy switch { - case 0: - Invoker.InvokeWithNoArgs(obj, invokeAttr); - break; - case 1: - Invoker.InvokeWithOneArg(obj, invokeAttr, binder, parameters!, culture); - break; - case 2 or 3 or 4: - Invoker.InvokeWithFewArgs(obj, invokeAttr, binder, parameters!, culture); - break; - default: - Invoker.InvokeWithManyArgs(obj, invokeAttr, binder, parameters!, culture); - break; + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, m_functionPointer, invokeAttr), + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, m_functionPointer, invokeAttr, binder, parameters![0], culture), + MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), + _ => Invoker.InvokeWithManyRefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture) }; return obj; diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs index 2ad0258621f5a6..b2ada9d4a445bb 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs @@ -10,8 +10,7 @@ namespace System.Reflection { internal sealed partial class RuntimeMethodInfo : MethodInfo { - [MethodImpl(MethodImplOptions.NoInlining)] // move lazy invocation flags population out of the hot path - internal InvocationFlags ComputeAndUpdateInvocationFlags() + internal InvocationFlags ComputeInvocationFlags() { InvocationFlags invocationFlags = InvocationFlags.Unknown; @@ -121,12 +120,14 @@ internal void ThrowNoInvokeException() MethodBaseInvoker.ThrowTargetParameterCountException(); } - return argCount switch + return Invoker.Strategy switch { - 0 => Invoker.InvokeWithNoArgs(obj, invokeAttr), - 1 => Invoker.InvokeWithOneArg(obj, invokeAttr, binder, parameters!, culture), - 2 or 3 or 4 => Invoker.InvokeWithFewArgs(obj, invokeAttr, binder, parameters!, culture), - _ => Invoker.InvokeWithManyArgs(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, m_functionPointer, invokeAttr), + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, m_functionPointer, invokeAttr, binder, parameters![0], culture), + MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), + _ => Invoker.InvokeWithManyRefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture) }; } } diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs index e4c4b533900042..47703e4221a7b3 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs @@ -7,13 +7,11 @@ internal partial class MethodBaseInvoker { internal unsafe MethodBaseInvoker(RuntimeMethodInfo method) : this(method, method.ArgumentTypes) { - _invocationFlags = method.ComputeAndUpdateInvocationFlags(); _invokeFunc_RefArgs = InterpretedInvoke_Method; } internal unsafe MethodBaseInvoker(RuntimeConstructorInfo constructor) : this(constructor, constructor.ArgumentTypes) { - _invocationFlags = constructor.ComputeAndUpdateInvocationFlags(); _invokeFunc_RefArgs = InterpretedInvoke_Constructor; } From fbf8049b5c90350e2444893ab129025246f05748 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Mon, 11 Nov 2024 18:16:45 -0600 Subject: [PATCH 04/24] Only cache dynamic methods, not invoker --- .../Reflection/Emit/DynamicMethod.CoreCLR.cs | 14 +- .../Reflection/MethodBaseInvoker.CoreCLR.cs | 8 - .../RuntimeConstructorInfo.CoreCLR.cs | 13 +- .../Reflection/RuntimeMethodInfo.CoreCLR.cs | 13 +- .../src/System/RuntimeType.CoreCLR.cs | 33 --- .../System/Reflection/ConstructorInvoker.cs | 13 +- .../System/Reflection/InvokeSignatureInfo.cs | 109 ++++----- .../src/System/Reflection/InvokerEmitUtil.cs | 57 +++-- .../System/Reflection/MethodBaseInvoker.cs | 209 +++++++++--------- .../src/System/Reflection/MethodInvoker.cs | 55 +++-- ...MethodInvokerCommon.WellKnownSignatures.cs | 4 +- .../System/Reflection/MethodInvokerCommon.cs | 119 +++++----- .../Reflection/RuntimeConstructorInfo.cs | 38 ++-- .../System/Reflection/RuntimeMethodInfo.cs | 12 +- .../Reflection/BindingFlagsDoNotWrap.cs | 18 +- 15 files changed, 346 insertions(+), 369 deletions(-) diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs index 96a114bc25d88d..5d60cd98af31c3 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs @@ -90,7 +90,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - return _invoker ??= MethodBaseInvoker.Create(this, Signature.Arguments); + return _invoker ??= new MethodBaseInvoker(this, Signature.Arguments); } } @@ -135,12 +135,12 @@ Signature LazyCreateSignature() object? retValue = Invoker.Strategy switch { - MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, IntPtr.Zero, invokeAttr), - MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, IntPtr.Zero, invokeAttr, binder, parameters![0], culture), - MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, IntPtr.Zero, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, IntPtr.Zero, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, IntPtr.Zero, invokeAttr, binder, parameters!, culture), - _ => Invoker.InvokeWithManyRefArgs(obj, IntPtr.Zero, invokeAttr, binder, parameters!, culture) + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, invokeAttr), + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters![0], culture), + MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters!, culture), + _ => Invoker.InvokeWithManyRefArgs(obj, invokeAttr, binder, parameters!, culture) }; GC.KeepAlive(this); diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs index f608c7f59b8223..6db7675907b581 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs @@ -7,13 +7,5 @@ namespace System.Reflection { internal partial class MethodBaseInvoker { - internal static MethodBaseInvoker GetOrCreate(RuntimeMethodInfo method) => - MethodBaseInvoker.GetOrCreate(method, (RuntimeType)method.ReturnType, method.ArgumentTypes); - - internal static MethodBaseInvoker GetOrCreate(RuntimeConstructorInfo constructor) => - MethodBaseInvoker.GetOrCreate(constructor, (RuntimeType)typeof(void), constructor.ArgumentTypes); - - internal static MethodBaseInvoker GetOrCreate(DynamicMethod dm) => - MethodBaseInvoker.GetOrCreate(dm, (RuntimeType)dm.ReturnType, dm.ArgumentTypes); } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs index 5524be75ee2871..1e7e0604ecd522 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs @@ -30,10 +30,10 @@ internal sealed partial class RuntimeConstructorInfo : ConstructorInfo, IRuntime private Signature? m_signature; private MethodBaseInvoker? m_invoker; private InvocationFlags m_invocationFlags; - private IntPtr m_functionPointer; - // todo: add this CreateUninitializedCache or move to invoker, and no longer cache invoker + internal InvocationFlags InvocationFlags { + [MethodImpl(MethodImplOptions.AggressiveInlining)] get { InvocationFlags flags = m_invocationFlags; @@ -42,6 +42,7 @@ internal InvocationFlags InvocationFlags m_invocationFlags = flags = ComputeInvocationFlags(); } + Debug.Assert((flags & InvocationFlags.Initialized) == InvocationFlags.Initialized); return flags; } } @@ -51,13 +52,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - if (m_invoker is null) - { - m_invoker ??= MethodBaseInvoker.GetOrCreate(this); - m_functionPointer = MethodHandle.GetFunctionPointer(); - } - - return m_invoker; + return m_invoker ??= new MethodBaseInvoker(this, ArgumentTypes); } } #endregion diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs index 1804b12cb5ee7d..721bd0911e5757 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs @@ -29,10 +29,10 @@ internal sealed partial class RuntimeMethodInfo : MethodInfo, IRuntimeMethodInfo private readonly object? m_keepalive; private MethodBaseInvoker? m_invoker; private InvocationFlags m_invocationFlags; - private IntPtr m_functionPointer; internal InvocationFlags InvocationFlags { + [MethodImpl(MethodImplOptions.AggressiveInlining)] get { InvocationFlags flags = m_invocationFlags; @@ -41,6 +41,7 @@ internal InvocationFlags InvocationFlags m_invocationFlags = flags = ComputeInvocationFlags(); } + Debug.Assert((flags & InvocationFlags.Initialized) == InvocationFlags.Initialized); return flags; } } @@ -50,13 +51,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - if (m_invoker is null) - { - m_invoker ??= MethodBaseInvoker.GetOrCreate(this); - m_functionPointer = MethodHandle.GetFunctionPointer(); - } - - return m_invoker; + return m_invoker ??= new MethodBaseInvoker(this, ArgumentTypes); } } #endregion @@ -316,7 +311,7 @@ internal void InvokePropertySetter(object? obj, BindingFlags invokeAttr, Binder? throw new TargetParameterCountException(SR.Arg_ParmCnt); } - Invoker.InvokeWith1Arg(obj, m_functionPointer, invokeAttr, binder, parameter, culture); + Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameter, culture); } #endregion diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs index 07672d7a48d664..3537f7cbb7c6f6 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs @@ -7,7 +7,6 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Reflection; -using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; @@ -4520,37 +4519,5 @@ internal V this[K key] m_Table.Insert(key, value); } } - - public unsafe V GetValue(int hashcode, in TAlternativeKey alternative, delegate* equals) where TAlternativeKey : allows ref struct - { - Table table = m_Table; - if (table is null) - return default!; - - if (hashcode < 0) - hashcode = ~hashcode; - - K[] keys = table.m_keys; - int index = hashcode % keys.Length; - - while (true) - { - K hit = Volatile.Read(ref keys[index]); - - if (hit != null) - { - if (equals(alternative, hit)) - return table.m_values[index]; - - index++; - if (index >= keys.Length) - index -= keys.Length; - } - else - { - return default!; - } - } - } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index 828dddf2fc780f..ea3fc97217e21f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -27,17 +27,13 @@ namespace System.Reflection /// public sealed partial class ConstructorInvoker { - private static CerHashtable s_invokerFuncs; - private static object? s_invokerFuncsLock; - private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. - private readonly InvocationFlags _invocationFlags; + private readonly IntPtr _functionPointer; private readonly Delegate _invokeFunc; // todo: use GetMethodImpl and fcnptr? private readonly InvokerArgFlags[] _invokerArgFlags; private readonly RuntimeConstructorInfo _method; private readonly InvokeSignatureInfo _signatureInfo; private readonly InvokerStrategy _strategy; - private readonly IntPtr _functionPointer; /// /// Creates a new instance of ConstructorInvoker. @@ -64,9 +60,7 @@ public static ConstructorInvoker Create(ConstructorInfo constructor) private ConstructorInvoker(RuntimeConstructorInfo constructor) { - _invocationFlags = constructor.InvocationFlags; - - if ((_invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers | InvocationFlags.NoConstructorInvoke)) == 0) + if ((constructor.InvocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers | InvocationFlags.NoConstructorInvoke)) == 0) { _functionPointer = constructor.MethodHandle.GetFunctionPointer(); _method = constructor; @@ -74,7 +68,7 @@ private ConstructorInvoker(RuntimeConstructorInfo constructor) _argCount = _signatureInfo.ParameterTypes.Length; Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); - _invokeFunc = GetOrCreateDynamicMethod(ref s_invokerFuncs, ref s_invokerFuncsLock, _signatureInfo, constructor, _strategy); + _invokeFunc = GetOrCreateInvokeFunc(_signatureInfo, _strategy, isForArrayInput: false, backwardsCompat: false); } else { @@ -245,7 +239,6 @@ internal unsafe object InvokeWithSpanArgs(Span arguments) _method.ThrowNoInvokeException(); } - // todo: do we need a copyOfArgs if no ref args? Span copyOfArgs; GCFrameRegistration regArgStorage; diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs index c80b4ecb4cafee..784cb749cc4f6c 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs @@ -32,18 +32,52 @@ public static InvokeSignatureInfo Create(MethodBase method, Type[] parameterType return new InvokeSignatureInfo(declaringType: dm.DeclaringType!, returnType: dm.ReturnType, parameterTypes, dm.IsStatic); } - public static InvokeSignatureInfo Create(in NormalizedLookupKey normalizedLookupKey) + public static InvokeSignatureInfo CreateNormalized(MethodBase method, Type[] parameterTypes) { - return new InvokeSignatureInfo( - declaringType: normalizedLookupKey._declaringType, - returnType: normalizedLookupKey._returnType, - parameterTypes: normalizedLookupKey._parameterTypes, - isStatic: normalizedLookupKey._isStatic); + InvokeSignatureInfo sigInfo; + + if (method is RuntimeMethodInfo rmi) + { + sigInfo = CreateNormalized( + declaringType: method.IsStatic ? typeof(void) : rmi.DeclaringType!, + returnType: rmi.ReturnType, + parameterTypes, + rmi.IsStatic); + } + else if (method is RuntimeConstructorInfo rci) + { + Debug.Assert(rci.GetReturnType() == typeof(void)); + Debug.Assert(!rci.IsStatic); + + sigInfo = CreateNormalized( + declaringType: rci.DeclaringType!, + returnType: typeof(void), + parameterTypes, + isStatic: false); + } + else + { + DynamicMethod di = (DynamicMethod)method; + sigInfo = CreateNormalized( + declaringType: di.IsStatic ? typeof(void) : di.DeclaringType!, + returnType: di.ReturnType, + parameterTypes, + di.IsStatic); + } + + return sigInfo; + + static InvokeSignatureInfo CreateNormalized(Type declaringType, Type returnType, Type[] parameterTypes, bool isStatic) => + new InvokeSignatureInfo( + declaringType: NormalizeType(declaringType), + returnType: NormalizeType(returnType), + GetNormalizedParameterTypes(parameterTypes), + isStatic); } public InvokeSignatureInfo(Type declaringType, Type returnType, Type[] parameterTypes, bool isStatic) { - _declaringType = isStatic ? typeof(void) : declaringType; + _declaringType = declaringType; _returnType = returnType; _parameterTypes = parameterTypes; _isStatic = isStatic; @@ -86,27 +120,21 @@ public override bool Equals(object? other) return true; } - public override int GetHashCode() => GetHashCode( - declaringType: _declaringType, - returnType: _returnType, - _parameterTypes); - - public static int GetHashCode(Type declaringType, Type returnType, Type[] parameterTypes) + public override int GetHashCode() { - int hashcode = declaringType.GetHashCode(); + int hashcode = _declaringType.GetHashCode(); hashcode = int.RotateLeft(hashcode, 5); - hashcode ^= returnType.GetHashCode(); + hashcode ^= _returnType.GetHashCode(); hashcode = int.RotateLeft(hashcode, 5); - for (int i = 0; i < parameterTypes.Length; i++) + for (int i = 0; i < _parameterTypes.Length; i++) { - hashcode ^= parameterTypes[i].GetHashCode(); + hashcode ^= _parameterTypes[i].GetHashCode(); hashcode = int.RotateLeft(hashcode, 5); } // We don't include _isStatic in the hashcode because it is already included with _declaringType==typeof(void). - return hashcode; } @@ -159,50 +187,5 @@ public static bool IsNormalized(Type type) => type.IsByRef || type.IsPointer || type.IsFunctionPointer; - - /// - /// Provide a zero-alloc ref struct for lookup with normalized types for a Calli signature. - /// - internal readonly ref struct NormalizedLookupKey - { - internal readonly Type _declaringType; - internal readonly Type[] _parameterTypes; - internal readonly Type _returnType; - internal readonly bool _isStatic; - - public NormalizedLookupKey(Type declaringType, Type returnType, Type[] parameterTypes, bool isStatic) - { - _declaringType = isStatic ? typeof(void) : NormalizeType(declaringType); - _parameterTypes = GetNormalizedParameterTypes(parameterTypes); - _returnType = NormalizeType(returnType); - _isStatic = isStatic; - } - - public static bool AlternativeEquals(in NormalizedLookupKey @this, InvokeSignatureInfo signatureInfo) - { - if (!ReferenceEquals(@this._declaringType, signatureInfo._declaringType) || - !ReferenceEquals(@this._returnType, signatureInfo._returnType) || - @this._isStatic != signatureInfo._isStatic || - @this._parameterTypes.Length != signatureInfo._parameterTypes.Length) - { - return false; - } - - for (int i = 0; i < @this._parameterTypes.Length; i++) - { - if (!ReferenceEquals(@this._parameterTypes[i], signatureInfo._parameterTypes[i])) - { - return false; - } - } - - return true; - } - - public int AlternativeGetHashCode() => InvokeSignatureInfo.GetHashCode( - declaringType: _declaringType, - returnType: _returnType, - _parameterTypes); - } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index fdfbc0006f5ad5..f051c2f82eed49 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -23,9 +23,9 @@ public static unsafe InvokeFunc_Obj0Args CreateInvokeDelegate_Obj0Args(MethodBas DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, signatureInfo.IsStatic, signatureInfo.DeclaringType); + EmitLdargForInstance(il, method, signatureInfo.IsStatic, signatureInfo.DeclaringType); EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); - EmitReturnHandling(il, signatureInfo.ReturnType); + EmitReturnHandling(il, method is RuntimeConstructorInfo ? method.DeclaringType! : signatureInfo.ReturnType); return (InvokeFunc_Obj0Args)dm.CreateDelegate(typeof(InvokeFunc_Obj0Args), target: null); } @@ -34,14 +34,14 @@ public static unsafe InvokeFunc_Obj1Arg CreateInvokeDelegate_Obj1Arg(MethodBase? DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(object)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, signatureInfo.IsStatic, signatureInfo.DeclaringType); + EmitLdargForInstance(il, method, signatureInfo.IsStatic, signatureInfo.DeclaringType); Debug.Assert(signatureInfo.ParameterTypes.Length == 1); il.Emit(OpCodes.Ldarg_2); UnboxSpecialType(il, (RuntimeType)signatureInfo.ParameterTypes[0]); EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); - EmitReturnHandling(il, signatureInfo.ReturnType); + EmitReturnHandling(il, method is RuntimeConstructorInfo ? method.DeclaringType! : signatureInfo.ReturnType); return (InvokeFunc_Obj1Arg)dm.CreateDelegate(typeof(InvokeFunc_Obj1Arg), target: null); } @@ -50,7 +50,7 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBas DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(object), typeof(object), typeof(object), typeof(object)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, signatureInfo.IsStatic, signatureInfo.DeclaringType); + EmitLdargForInstance(il, method, signatureInfo.IsStatic, signatureInfo.DeclaringType); ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; for (int i = 0; i < parameterTypes.Length; i++) @@ -74,7 +74,7 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBas } EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); - EmitReturnHandling(il, signatureInfo.ReturnType); + EmitReturnHandling(il, method is RuntimeConstructorInfo ? method.DeclaringType! : signatureInfo.ReturnType); return (InvokeFunc_Obj4Args)dm.CreateDelegate(typeof(InvokeFunc_Obj4Args), target: null); } @@ -83,7 +83,7 @@ public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Met DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(Span)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, signatureInfo.IsStatic, signatureInfo.DeclaringType); + EmitLdargForInstance(il, method, signatureInfo.IsStatic, signatureInfo.DeclaringType); ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; for (int i = 0; i < parameterTypes.Length; i++) @@ -99,7 +99,7 @@ public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Met } EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); - EmitReturnHandling(il, signatureInfo.ReturnType); + EmitReturnHandling(il, method is RuntimeConstructorInfo ? method.DeclaringType! : signatureInfo.ReturnType); return (InvokeFunc_ObjSpanArgs)dm.CreateDelegate(typeof(InvokeFunc_ObjSpanArgs), target: null); } @@ -108,7 +108,7 @@ public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase? DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(IntPtr*)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, signatureInfo.IsStatic, signatureInfo.DeclaringType); + EmitLdargForInstance(il, method, signatureInfo.IsStatic, signatureInfo.DeclaringType); ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; for (int i = 0; i < parameterTypes.Length; i++) @@ -130,7 +130,7 @@ public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase? } EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); - EmitReturnHandling(il, signatureInfo.ReturnType); + EmitReturnHandling(il, method is RuntimeConstructorInfo ? method.DeclaringType! : signatureInfo.ReturnType); return (InvokeFunc_RefArgs)dm.CreateDelegate(typeof(InvokeFunc_RefArgs), target: null); } @@ -165,6 +165,18 @@ private static DynamicMethod CreateDynamicMethod(MethodBase? method, InvokeSigna skipVisibility: true); // Supports creating the delegate immediately when calling CreateDelegate(). } + private static void EmitLdargForInstance(ILGenerator il, MethodBase? method, bool isStatic, Type declaringType) + { + if (!isStatic && method is not RuntimeConstructorInfo) + { + il.Emit(OpCodes.Ldarg_0); + if (declaringType.IsValueType) + { + il.Emit(OpCodes.Unbox, declaringType); + } + } + } + private static void EmitCall(ILGenerator il, MethodBase? method, InvokeSignatureInfo signatureInfo, bool isStatic, bool backwardsCompat) { if (method is null) @@ -192,7 +204,18 @@ private static void EmitCall(ILGenerator il, MethodBase? method, InvokeSignature #endif } - il.Emit(OpCodes.Callvirt, (MethodInfo)method); + if (method is RuntimeConstructorInfo) + { + il.Emit(OpCodes.Newobj, (ConstructorInfo)method); + } + else if (method.IsStatic || method.DeclaringType!.IsValueType) + { + il.Emit(OpCodes.Call, (MethodInfo)method); + } + else + { + il.Emit(OpCodes.Callvirt, (MethodInfo)method); + } } } @@ -253,18 +276,6 @@ private static void EmitReturnHandling(ILGenerator il, Type returnType) il.Emit(OpCodes.Ret); } - private static void EmitLdargForInstance(ILGenerator il, bool isStatic, Type declaringType) - { - if (!isStatic) - { - il.Emit(OpCodes.Ldarg_0); - if (declaringType.IsValueType) - { - il.Emit(OpCodes.Unbox, declaringType); - } - } - } - /// /// Return the name of the dynamic method that will be created using the function pointer syntax /// of listing the parameter types and then the return type. diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index a383974ae3aee1..4a28375b00d384 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -17,114 +17,58 @@ namespace System.Reflection { + /// + /// Provides the implementation of the Invoke() methods on MethodInfo, ConstructorInfo and DynamicMethod. + /// + /// + /// This class is known by the runtime in order to ignore reflection frames during stack walks. + /// internal sealed partial class MethodBaseInvoker { internal const int MaxStackAllocArgCount = 4; - private static CerHashtable s_invokers; - private static object? s_invokersLock; - - // todo: use single with cast: private Delegate _invokeFunc; - private readonly InvokeFunc_Obj0Args? _invokeFunc_Obj0Args; - private readonly InvokeFunc_Obj1Arg? _invokeFunc_Obj1Arg; - private readonly InvokeFunc_ObjSpanArgs? _invokeFunc_ObjSpanArgs; - private readonly InvokeFunc_RefArgs? _invokeFunc_RefArgs; - private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. + private readonly IntPtr _functionPointer; // This will be Zero when not using calli. + private readonly Delegate _invokeFunc; private readonly InvokerArgFlags[] _invokerArgFlags; - private readonly MethodBase? _method; // This will be null when using Calli. + private readonly MethodBase? _method; // This will be null when using calli. private readonly InvokeSignatureInfo _signatureInfo; private readonly InvokerStrategy _strategy; + private readonly bool _allocateObject; // True for constructors when using calli. + // todo: CreateUninitializedCache - public static MethodBaseInvoker Create(MethodBase method, RuntimeType[] argumentTypes) + public MethodBaseInvoker(MethodBase method, RuntimeType[] parameterTypes) { - return new MethodBaseInvoker(SupportsCalli(method) ? null : method, InvokeSignatureInfo.Create(method, argumentTypes)); - } + _argCount = parameterTypes.Length; - public static MethodBaseInvoker GetOrCreate(MethodBase method, RuntimeType returnType, RuntimeType[] argumentTypes) - { - if (!CanCacheInvoker(method)) + if (SupportsCalli(method)) { - return Create(method, argumentTypes); - } - - InvokeSignatureInfo.NormalizedLookupKey key = new((RuntimeType)method.DeclaringType!, returnType, argumentTypes, method.IsStatic); - - int hashcode = key.AlternativeGetHashCode(); - MethodBaseInvoker existing; - unsafe - { - existing = s_invokers.GetValue(hashcode, key, &InvokeSignatureInfo.NormalizedLookupKey.AlternativeEquals); - } + _allocateObject = method is RuntimeConstructorInfo; + _functionPointer = method.MethodHandle.GetFunctionPointer(); + _method = null; - if (existing is not null) - { - return existing; - } - - if (s_invokersLock is null) - { - Interlocked.CompareExchange(ref s_invokersLock!, new object(), null); - } - - bool lockTaken = false; - try - { - Monitor.Enter(s_invokersLock, ref lockTaken); - - unsafe - { - existing = s_invokers.GetValue(hashcode, key, &InvokeSignatureInfo.NormalizedLookupKey.AlternativeEquals); - } - - if (existing is not null) + if (CanCacheDynamicMethod(method) && !HasDefaultParameterValues(method)) { - return existing; + _signatureInfo = InvokeSignatureInfo.CreateNormalized(method, parameterTypes); + Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); + _strategy = GetInvokerStrategy(_argCount, needsByRefStrategy); + _invokeFunc = GetOrCreateInvokeFunc(_signatureInfo, _strategy, isForArrayInput: true, backwardsCompat: false); } - - InvokeSignatureInfo memberBaseSignatureTypes = InvokeSignatureInfo.Create(key); - MethodBaseInvoker invoker = new MethodBaseInvoker(method: null, memberBaseSignatureTypes); - s_invokers[memberBaseSignatureTypes] = invoker; - return invoker; - } - finally - { - if (lockTaken) + else { - Monitor.Exit(s_invokersLock); + _signatureInfo = InvokeSignatureInfo.Create(method, parameterTypes); + Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); + _strategy = GetInvokerStrategy(_argCount, needsByRefStrategy); + _invokeFunc = CreateInvokeFunc(method: null, _signatureInfo, _strategy, isForArrayInput: true, backwardsCompat: false); } } - } - - private static bool CanCacheInvoker(MethodBase method) => - CanCacheDynamicMethod(method) && - // Supporting default values would increase cache memory usage and slow down the common case. - !HasDefaultParameterValues(method); - - private MethodBaseInvoker(MethodBase? method, InvokeSignatureInfo signatureInfo) - { - _argCount = signatureInfo.ParameterTypes.Length; - _method = method; - _signatureInfo = signatureInfo; - Initialize(signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); - - _strategy = GetInvokerStrategy(_argCount, needsByRefStrategy); - switch (_strategy) + else { - case InvokerStrategy.Obj0: - _invokeFunc_Obj0Args = CreateInvokeDelegate_Obj0Args(_method, _signatureInfo, backwardsCompat: true); - break; - case InvokerStrategy.Obj1: - _invokeFunc_Obj1Arg = CreateInvokeDelegate_Obj1Arg(_method, _signatureInfo, backwardsCompat: true); - break; - case InvokerStrategy.Obj4: - case InvokerStrategy.ObjSpan: - _invokeFunc_ObjSpanArgs = CreateInvokeDelegate_ObjSpanArgs(_method, _signatureInfo, backwardsCompat: true); - break; - default: - Debug.Assert(_strategy == InvokerStrategy.Ref4 || _strategy == InvokerStrategy.RefMany); - _invokeFunc_RefArgs = CreateInvokeDelegate_RefArgs(_method, _signatureInfo, backwardsCompat: true); - break; + _signatureInfo = InvokeSignatureInfo.Create(method, parameterTypes); + Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); + _strategy = GetInvokerStrategy(_argCount, needsByRefStrategy); + _invokeFunc = CreateInvokeFunc(method, _signatureInfo, _strategy, isForArrayInput: true, backwardsCompat: true); + _method = method; } } @@ -136,13 +80,19 @@ internal static void ThrowTargetParameterCountException() throw new TargetParameterCountException(SR.Arg_ParmCnt); } - internal unsafe object? InvokeWith0Args(object? obj, IntPtr functionPointer, BindingFlags invokeAttr) + internal unsafe object? InvokeWith0Args(object? obj, BindingFlags invokeAttr) { Debug.Assert(_argCount == 0); try { - return _invokeFunc_Obj0Args!(obj, functionPointer); + if (_allocateObject) + { + obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); + return obj; + } + return ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -152,7 +102,6 @@ internal static void ThrowTargetParameterCountException() internal unsafe object? InvokeWith1Arg( object? obj, - IntPtr functionPointer, BindingFlags invokeAttr, Binder? binder, object? parameter, @@ -164,7 +113,13 @@ internal static void ThrowTargetParameterCountException() try { - return _invokeFunc_Obj1Arg!(obj, functionPointer, parameter); + if (_allocateObject) + { + obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); + return obj; + } + return ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -174,7 +129,6 @@ internal static void ThrowTargetParameterCountException() internal unsafe object? InvokeWith4Args( object? obj, - IntPtr functionPointer, BindingFlags invokeAttr, Binder? binder, object?[] parameters, @@ -190,7 +144,16 @@ internal static void ThrowTargetParameterCountException() try { - return _invokeFunc_ObjSpanArgs!(obj, functionPointer, copyOfArgs); + if (_allocateObject) + { + obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + return obj; + } + else + { + return ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + } } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -200,7 +163,6 @@ internal static void ThrowTargetParameterCountException() internal unsafe object? InvokeWithSpanArgs( object? obj, - IntPtr functionPointer, BindingFlags invokeAttr, Binder? binder, object?[] parameters, @@ -227,7 +189,16 @@ internal static void ThrowTargetParameterCountException() try { - ret = _invokeFunc_ObjSpanArgs!(obj, functionPointer, copyOfArgs); + if (_allocateObject) + { + obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + ret = obj; + } + else + { + ret = ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + } } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -235,18 +206,16 @@ internal static void ThrowTargetParameterCountException() } CopyBack(parameters, copyOfArgs, shouldCopyBack); + return ret; } finally { GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); } - - return ret; } internal unsafe object? InvokeWith4RefArgs( object? obj, - IntPtr functionPointer, BindingFlags invokeAttr, Binder? binder, object?[] parameters, @@ -275,7 +244,16 @@ internal static void ThrowTargetParameterCountException() object? ret; try { - ret = _invokeFunc_RefArgs!(obj, functionPointer, pByRefFixedStorage); + if (_allocateObject) + { + obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); + ret = obj; + } + else + { + ret = ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); + } } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -288,7 +266,6 @@ internal static void ThrowTargetParameterCountException() internal unsafe object? InvokeWithManyRefArgs( object? obj, - IntPtr functionPointer, BindingFlags invokeAttr, Binder? binder, object?[] parameters, @@ -322,7 +299,16 @@ internal static void ThrowTargetParameterCountException() try { - ret = _invokeFunc_RefArgs!(obj, functionPointer, pByRefStorage); + if (_allocateObject) + { + obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); + ret = obj; + } + else + { + ret = ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); + } } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -530,5 +516,22 @@ private static InvokerStrategy GetInvokerStrategy(int argCount, bool needsByRefS _ => InvokerStrategy.ObjSpan }; } + + // Supporting default values would increase cache memory usage and slow down the common case + // since the default values would have to be cached as well. + internal static bool HasDefaultParameterValues(MethodBase method) + { + ReadOnlySpan parameters = method.GetParametersAsSpan(); + + for (int i = 0; i < parameters.Length; i++) + { + if (parameters[i].HasDefaultValue) + { + return true; + } + } + + return false; + } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index c7797fd9652c70..3c681b24dae0a5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -26,18 +26,13 @@ namespace System.Reflection /// public sealed partial class MethodInvoker { - private static CerHashtable s_invokerFuncs; - private static object? s_invokerFuncsLock; - + private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. + private readonly IntPtr _functionPointer; private readonly Delegate? _invokeFunc; // todo: use GetMethodImpl and fcnptr? - private InvokerStrategy _strategy; - - private readonly InvokeSignatureInfo _signatureInfo; - private readonly InvocationFlags _invocationFlags; private readonly InvokerArgFlags[] _invokerArgFlags; private readonly MethodBase _method; - private readonly IntPtr _functionPointer; - private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. + private readonly InvokerStrategy _strategy; + private readonly InvokeSignatureInfo _signatureInfo; /// /// Creates a new instance of MethodInvoker. @@ -72,19 +67,41 @@ public static MethodInvoker Create(MethodBase method) throw new ArgumentException(SR.Argument_MustBeRuntimeMethod, nameof(method)); } - private MethodInvoker(MethodBase method, RuntimeType[] arguments, InvocationFlags invocationFlags) + private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, InvocationFlags invocationFlags) { - _invocationFlags = invocationFlags; - - if ((invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers | InvocationFlags.NoConstructorInvoke)) == 0) + if ((invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers)) == 0) { - _signatureInfo = InvokeSignatureInfo.Create(method, arguments); - _method = method; - _argCount = _signatureInfo.ParameterTypes.Length; + _argCount = parameterTypes.Length; _functionPointer = method.MethodHandle.GetFunctionPointer(); - Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); - _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); - _invokeFunc = GetOrCreateDynamicMethod(ref s_invokerFuncs, ref s_invokerFuncsLock, _signatureInfo, method, _strategy); + _method = method; + + if (SupportsCalli(method)) + { + _functionPointer = method.MethodHandle.GetFunctionPointer(); + + if (CanCacheDynamicMethod(method)) + { + _signatureInfo = InvokeSignatureInfo.CreateNormalized(method, parameterTypes); + Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); + _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); + _invokeFunc = GetOrCreateInvokeFunc(_signatureInfo, _strategy, isForArrayInput: false, backwardsCompat: false); + } + else + { + _signatureInfo = InvokeSignatureInfo.Create(method, parameterTypes); + Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); + _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); + _invokeFunc = CreateInvokeFunc(method: null, _signatureInfo, _strategy, isForArrayInput: false, backwardsCompat: false); + } + } + else + { + _signatureInfo = InvokeSignatureInfo.Create(method, parameterTypes); + Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); + _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); + _invokeFunc = CreateInvokeFunc(method, _signatureInfo, _strategy, isForArrayInput: false, backwardsCompat: false); + _method = method; + } } else { diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs index 7cb4784d9cbe7f..547d90cf9daf6f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs @@ -10,7 +10,7 @@ namespace System.Reflection { internal static partial class MethodInvokerCommon { - public static bool TryGetWellKnownSignatureForInstanceAny(InvokeSignatureInfo signatureInfo, [NotNullWhen(true)] out Delegate? func) + public static bool TryGetWellKnownSignatureFor0Args(InvokeSignatureInfo signatureInfo, [NotNullWhen(true)] out Delegate? func) { Debug.Assert(signatureInfo.ParameterTypes.Length == 0); @@ -41,7 +41,7 @@ public static bool TryGetWellKnownSignatureForInstanceAny(InvokeSignatureInfo si return false; } - public static bool TryGetWellKnownSignatureForInstanceAnyVoid(InvokeSignatureInfo signatureInfo, [NotNullWhen(true)] out Delegate? func) + public static bool TryGetWellKnownSignatureFor1Arg(InvokeSignatureInfo signatureInfo, [NotNullWhen(true)] out Delegate? func) { Debug.Assert(signatureInfo.ParameterTypes.Length == 1); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index 26a8c59a272c15..01d05dfcdf710f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -13,6 +13,9 @@ namespace System.Reflection { internal static partial class MethodInvokerCommon { + private static CerHashtable s_invokerFuncs; + private static object? s_invokerFuncsLock; + internal static void Initialize( InvokeSignatureInfo signatureInfo, out bool needsByRefStrategy, @@ -68,81 +71,110 @@ public static InvokerStrategy GetInvokerStrategyForSpanInput(int argCount, bool return argCount <= 4 ? InvokerStrategy.Obj4 : InvokerStrategy.ObjSpan; } - internal static Delegate CreateInvokeFunc(MethodBase? method, InvokeSignatureInfo signatureInfo, InvokerStrategy strategy, bool backwardsCompat) + internal static Delegate CreateInvokeFunc(MethodBase? method, InvokeSignatureInfo signatureInfo, InvokerStrategy strategy, bool isForArrayInput, bool backwardsCompat) { - Delegate? wellKnown; + Delegate? invokeFunc; + + if (!TryCreateWellKnownInvokeFunc(method, signatureInfo, strategy, out invokeFunc)) + { + if (isForArrayInput) + { + invokeFunc = strategy switch + { + InvokerStrategy.Obj0 => CreateInvokeDelegate_Obj0Args(method, signatureInfo, backwardsCompat), + InvokerStrategy.Obj1 => CreateInvokeDelegate_Obj1Arg(method, signatureInfo, backwardsCompat), + InvokerStrategy.Obj4 or InvokerStrategy.ObjSpan => CreateInvokeDelegate_ObjSpanArgs(method, signatureInfo, backwardsCompat), + _ => CreateInvokeDelegate_RefArgs(method, signatureInfo, backwardsCompat) + }; + } + else + { + invokeFunc = strategy switch + { + InvokerStrategy.Obj0 => CreateInvokeDelegate_Obj0Args(method, signatureInfo, backwardsCompat), + InvokerStrategy.Obj1 => CreateInvokeDelegate_Obj1Arg(method, signatureInfo, backwardsCompat), + InvokerStrategy.Obj4 => CreateInvokeDelegate_Obj4Args(method, signatureInfo, backwardsCompat), + InvokerStrategy.ObjSpan => CreateInvokeDelegate_ObjSpanArgs(method, signatureInfo, backwardsCompat), + _ => CreateInvokeDelegate_RefArgs(method, signatureInfo, backwardsCompat) + }; + } + } + + return invokeFunc; - return strategy switch + static bool TryCreateWellKnownInvokeFunc(MethodBase? method, InvokeSignatureInfo signatureInfo, InvokerStrategy strategy, [NotNullWhen(true)] out Delegate? wellKnown) { - InvokerStrategy.Obj0 => - TryGetWellKnownSignatureForInstanceAny(signatureInfo, out wellKnown) ? wellKnown : - CreateInvokeDelegate_Obj0Args(method, signatureInfo, backwardsCompat), - InvokerStrategy.Obj1 => - TryGetWellKnownSignatureForInstanceAnyVoid(signatureInfo, out wellKnown) ? wellKnown : - CreateInvokeDelegate_Obj1Arg(method, signatureInfo, backwardsCompat), - InvokerStrategy.Obj4 => CreateInvokeDelegate_Obj4Args(method, signatureInfo, backwardsCompat), - InvokerStrategy.ObjSpan => CreateInvokeDelegate_ObjSpanArgs(method, signatureInfo, backwardsCompat), - _ => CreateInvokeDelegate_RefArgs(method, signatureInfo, backwardsCompat) - }; + if (method is null) + { + // Check if the method has a well-known signature that can be invoked directly using calli and a function pointer. + switch (strategy) + { + case InvokerStrategy.Obj0: + if (TryGetWellKnownSignatureFor0Args(signatureInfo, out wellKnown)) return true; + break; + case InvokerStrategy.Obj1: + if (TryGetWellKnownSignatureFor1Arg(signatureInfo, out wellKnown)) return true; + break; + } + } + + wellKnown = null; + return false; + } } internal static bool CanCacheDynamicMethod(MethodBase method) => // The cache method's DeclaringType and other collectible parameters would be referenced. !method.IsCollectible && // Value types need to be unboxed which requires its type, so a cached value would not be very sharable. - !(method.DeclaringType!.IsValueType && !method.IsStatic) && - SupportsCalli(method); + !(method.DeclaringType!.IsValueType && !method.IsStatic); /// /// Determines if the method is not polymorphic and thus can be called with a calli instruction. /// internal static bool SupportsCalli(MethodBase method) { - Debug.Assert(!method.DeclaringType!.IsValueType || method.DeclaringType.IsSealed); - return method.IsStatic || method.DeclaringType!.IsSealed || method.IsFinal || - method is ConstructorInfo; + ( + method is ConstructorInfo && + // A string cannot be allocated with an uninitialized value, so we use NewObj. + !ReferenceEquals(method.DeclaringType, typeof(string)) + ); } - internal static Delegate GetOrCreateDynamicMethod( - ref CerHashtable cache, - ref object? lockObject, + internal static Delegate GetOrCreateInvokeFunc( InvokeSignatureInfo signatureInfo, - MethodBase method, - InvokerStrategy strategy) + InvokerStrategy strategy, + bool isForArrayInput, + bool backwardsCompat) { - if (!CanCacheDynamicMethod(method)) - { - return CreateInvokeFunc(method, signatureInfo, strategy, backwardsCompat: false); - } - // Get the cached dynamic method. - Delegate invokeFunc = cache[signatureInfo]; + Delegate invokeFunc = s_invokerFuncs[signatureInfo]; if (invokeFunc is null) { - if (lockObject is null) + if (s_invokerFuncsLock is null) { - Interlocked.CompareExchange(ref lockObject!, new object(), null); + Interlocked.CompareExchange(ref s_invokerFuncsLock!, new object(), null); } bool lockTaken = false; try { - Monitor.Enter(lockObject, ref lockTaken); - invokeFunc = cache[signatureInfo]; + Monitor.Enter(s_invokerFuncsLock, ref lockTaken); + invokeFunc = s_invokerFuncs[signatureInfo]; if (invokeFunc is null) { - invokeFunc = CreateInvokeFunc(method, signatureInfo, strategy, backwardsCompat: false); - cache[signatureInfo] = invokeFunc; + invokeFunc = CreateInvokeFunc(method: null, signatureInfo, strategy, isForArrayInput, backwardsCompat); + s_invokerFuncs[signatureInfo] = invokeFunc; } } finally { if (lockTaken) { - Monitor.Exit(lockObject); + Monitor.Exit(s_invokerFuncsLock); } } } @@ -150,21 +182,6 @@ internal static Delegate GetOrCreateDynamicMethod( return invokeFunc; } - internal static bool HasDefaultParameterValues(MethodBase method) - { - ReadOnlySpan parameters = method.GetParametersAsSpan(); - - for (int i = 0; i < parameters.Length; i++) - { - if (parameters[i].HasDefaultValue) - { - return true; - } - } - - return false; - } - /// /// Confirm member invocation has an instance and is of the correct type /// diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs index 6a1dbfefdb955b..4c24beb1a21fe1 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs @@ -129,12 +129,12 @@ internal void ThrowNoInvokeException() _ = Invoker.Strategy switch { - MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, m_functionPointer, invokeAttr), - MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, m_functionPointer, invokeAttr, binder, parameters![0], culture), - MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), - _ => Invoker.InvokeWithManyRefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture) + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, invokeAttr), + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters![0], culture), + MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters!, culture), + _ => Invoker.InvokeWithManyRefArgs(obj, invokeAttr, binder, parameters!, culture) }; return null; @@ -159,27 +159,15 @@ public override object Invoke(BindingFlags invokeAttr, Binder? binder, object?[] MethodBaseInvoker.ThrowTargetParameterCountException(); } - object obj; - try + return Invoker.Strategy switch { - obj = ((RuntimeType)DeclaringType!).GetUninitializedObject(); - } - catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) - { - throw new TargetInvocationException(e); - } - - _ = Invoker.Strategy switch - { - MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, m_functionPointer, invokeAttr), - MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, m_functionPointer, invokeAttr, binder, parameters![0], culture), - MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), - _ => Invoker.InvokeWithManyRefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture) + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj: null, invokeAttr)!, + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj: null, invokeAttr, binder, parameters![0], culture)!, + MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj: null, invokeAttr, binder, parameters!, culture)!, + MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj: null, invokeAttr, binder, parameters!, culture)!, + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj: null, invokeAttr, binder, parameters!, culture)!, + _ => Invoker.InvokeWithManyRefArgs(obj : null, invokeAttr, binder, parameters!, culture)! }; - - return obj; } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs index b2ada9d4a445bb..53ca4ffb3b714a 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs @@ -122,12 +122,12 @@ internal void ThrowNoInvokeException() return Invoker.Strategy switch { - MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, m_functionPointer, invokeAttr), - MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, m_functionPointer, invokeAttr, binder, parameters![0], culture), - MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture), - _ => Invoker.InvokeWithManyRefArgs(obj, m_functionPointer, invokeAttr, binder, parameters!, culture) + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, invokeAttr), + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters![0], culture), + MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters!, culture), + _ => Invoker.InvokeWithManyRefArgs(obj, invokeAttr, binder, parameters!, culture) }; } } diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/BindingFlagsDoNotWrap.cs b/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/BindingFlagsDoNotWrap.cs index 0bebd1c99c97f4..1f03bebb2ee3ae 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/BindingFlagsDoNotWrap.cs +++ b/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/BindingFlagsDoNotWrap.cs @@ -20,7 +20,7 @@ public static void MethodInvoke() [Fact] public static void ConstructorInvoke() { - ConstructorInfo c = typeof(TestClass).GetConstructor(BindingFlags.Public|BindingFlags.Instance, null, Type.EmptyTypes, null); + ConstructorInfo c = typeof(TestClass).GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, Type.EmptyTypes, null); TestDoNotWrap((bf) => c.Invoke(bf, null, Array.Empty(), null)); } @@ -39,6 +39,14 @@ public static void ConstructorInvokeStringCtor() TestDoNotWrap((bf) => c.Invoke(bf, null, new object[] { null, 0, 0 }, null)); } + [Fact] + public static void ConstructorInvokeStringCtor_Success() + { + ConstructorInfo c = typeof(string).GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, new Type[] { typeof(char[]), typeof(int), typeof(int) }, null); + string s = (string)c.Invoke(default, null, new object[] { "Hello".ToCharArray(), 0, 5 }, null); + Assert.Equal("Hello", s); + } + [Fact] public static void ConstructorInvokeStringCtorTwoArgs() { @@ -46,6 +54,14 @@ public static void ConstructorInvokeStringCtorTwoArgs() TestDoNotWrap((bf) => c.Invoke(bf, null, new object[] { null, 0, 0 }, null)); } + [Fact] + public static void ConstructorInvokeStringCtorTwoArgs_Success() + { + ConstructorInfo c = typeof(string).GetConstructor(BindingFlags.Public | BindingFlags.Instance, new Type[] { typeof(char[]), typeof(int), typeof(int) }); + string s = (string)c.Invoke(invokeAttr: default, null, new object[] { "Hello".ToCharArray(), 0, 5 }, null); + Assert.Equal("Hello", s); + } + [Fact] public static void ConstructorInvokeUsingMethodInfoInvoke() { From febdd320a98979070b9c54b9c19a6f37fe83148d Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Thu, 14 Nov 2024 13:33:50 -0600 Subject: [PATCH 05/24] Share cache and more code across 3 invokers --- .../Reflection/Emit/DynamicILGenerator.cs | 46 ++- .../Reflection/Emit/DynamicMethod.CoreCLR.cs | 4 +- .../RuntimeConstructorInfo.CoreCLR.cs | 2 +- .../Reflection/RuntimeMethodInfo.CoreCLR.cs | 2 +- .../src/System/RuntimeType.CoreCLR.cs | 27 ++ .../System/Reflection/ConstructorInvoker.cs | 208 ++++++++++--- .../src/System/Reflection/Emit/ILGenerator.cs | 3 - .../System/Reflection/InvokeSignatureInfo.cs | 164 +++++----- .../src/System/Reflection/InvokerEmitUtil.cs | 65 ++-- .../src/System/Reflection/MethodBase.cs | 3 +- .../System/Reflection/MethodBaseInvoker.cs | 286 ++++++++---------- .../src/System/Reflection/MethodInvoker.cs | 192 ++++++++---- ...MethodInvokerCommon.WellKnownSignatures.cs | 4 +- .../System/Reflection/MethodInvokerCommon.cs | 232 +++++++++----- .../Reflection/RuntimeConstructorInfo.cs | 4 +- .../System/Reflection/RuntimeMethodInfo.cs | 2 +- .../ConstructorCommonTests.cs | 8 + .../ConstructorInvokerTests.cs | 130 ++++++++ .../MethodInvokerTests.cs | 124 +++++++- .../Reflection/BindingFlagsDoNotWrap.cs | 16 - 20 files changed, 1019 insertions(+), 503 deletions(-) diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs index f93ad07d37a275..4c02d9abbb8056 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs @@ -168,20 +168,11 @@ public override void Emit(OpCode opcode, string str) // Signature related calls (vararg, calli) // // - public override void EmitCalli( - OpCode opcode, - CallingConventions callingConvention, - Type? returnType, - Type[]? parameterTypes, - Type[]? optionalParameterTypes) - => EmitCalli(opcode, callingConvention, returnType, parameterTypes, optionalParameterTypes); - - internal override void EmitCalli( - OpCode opcode, - CallingConventions callingConvention, - Type? returnType, - ReadOnlySpan parameterTypes, - Type[]? optionalParameterTypes) + public override void EmitCalli(OpCode opcode, + CallingConventions callingConvention, + Type? returnType, + Type[]? parameterTypes, + Type[]? optionalParameterTypes) { int stackchange = 0; if (optionalParameterTypes != null) @@ -203,7 +194,8 @@ internal override void EmitCalli( if (returnType != typeof(void)) stackchange++; // Pop off arguments if any. - stackchange -= parameterTypes.Length; + if (parameterTypes != null) + stackchange -= parameterTypes.Length; // Pop off vararg arguments. if (optionalParameterTypes != null) stackchange -= optionalParameterTypes.Length; @@ -221,7 +213,9 @@ internal override void EmitCalli( public override void EmitCalli(OpCode opcode, CallingConvention unmanagedCallConv, Type? returnType, Type[]? parameterTypes) { int stackchange = 0; - int cParams = parameterTypes is null ? 0 : parameterTypes.Length; + int cParams = 0; + if (parameterTypes != null) + cParams = parameterTypes.Length; SignatureHelper sig = GetMethodSigHelper(unmanagedCallConv, returnType, parameterTypes); @@ -230,7 +224,8 @@ public override void EmitCalli(OpCode opcode, CallingConvention unmanagedCallCon stackchange++; // Pop off arguments if any. - stackchange -= cParams; + if (parameterTypes != null) + stackchange -= cParams; // Pop the native function pointer. stackchange--; @@ -444,7 +439,7 @@ private int GetMemberRefToken(MethodInfo methodInfo, Type[]? optionalParameterTy private SignatureHelper GetMethodSigHelper( CallingConvention unmanagedCallConv, Type? returnType, - ReadOnlySpan parameterTypes) + Type[]? parameterTypes) { SignatureHelper sigHelp = SignatureHelper.GetMethodSigHelper(null, unmanagedCallConv, returnType); AddParameters(sigHelp, parameterTypes, null, null); @@ -454,7 +449,7 @@ private SignatureHelper GetMethodSigHelper( private SignatureHelper GetMethodSigHelper( CallingConventions call, Type? returnType, - ReadOnlySpan parameterTypes, + Type[]? parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers, Type[]? optionalParameterTypes) @@ -469,17 +464,20 @@ private SignatureHelper GetMethodSigHelper( return sig; } - private void AddParameters(SignatureHelper sigHelp, ReadOnlySpan parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers) + private void AddParameters(SignatureHelper sigHelp, Type[]? parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers) { - if (requiredCustomModifiers != null && requiredCustomModifiers.Length != parameterTypes.Length) + if (requiredCustomModifiers != null && (parameterTypes == null || requiredCustomModifiers.Length != parameterTypes.Length)) throw new ArgumentException(SR.Format(SR.Argument_MismatchedArrays, nameof(requiredCustomModifiers), nameof(parameterTypes))); - if (optionalCustomModifiers != null && optionalCustomModifiers.Length != parameterTypes.Length) + if (optionalCustomModifiers != null && (parameterTypes == null || optionalCustomModifiers.Length != parameterTypes.Length)) throw new ArgumentException(SR.Format(SR.Argument_MismatchedArrays, nameof(optionalCustomModifiers), nameof(parameterTypes))); - for (int i = 0; i < parameterTypes.Length; i++) + if (parameterTypes != null) { - sigHelp.AddDynamicArgument(m_scope, parameterTypes[i], requiredCustomModifiers?[i], optionalCustomModifiers?[i]); + for (int i = 0; i < parameterTypes.Length; i++) + { + sigHelp.AddDynamicArgument(m_scope, parameterTypes[i], requiredCustomModifiers?[i], optionalCustomModifiers?[i]); + } } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs index 5d60cd98af31c3..8bd448e5c67515 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs @@ -90,7 +90,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - return _invoker ??= new MethodBaseInvoker(this, Signature.Arguments); + return _invoker ??= new MethodBaseInvoker(this, DeclaringType!, Signature.Arguments, ReturnType); } } @@ -136,7 +136,7 @@ Signature LazyCreateSignature() object? retValue = Invoker.Strategy switch { MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, invokeAttr), - MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters![0], culture), + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters!, culture), diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs index 1e7e0604ecd522..f3c0cba2882ada 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs @@ -52,7 +52,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - return m_invoker ??= new MethodBaseInvoker(this, ArgumentTypes); + return m_invoker ??= new MethodBaseInvoker(this, DeclaringType!, ArgumentTypes, GetReturnType()); } } #endregion diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs index 721bd0911e5757..5cf292f047b254 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs @@ -51,7 +51,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - return m_invoker ??= new MethodBaseInvoker(this, ArgumentTypes); + return m_invoker ??= new MethodBaseInvoker(this, DeclaringType!, ArgumentTypes, ReturnType); } } #endregion diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs index 8b732b8b8da708..322473919728c7 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs @@ -4524,5 +4524,32 @@ internal V this[K key] m_Table.Insert(key, value); } } + + public unsafe V GetValue(int hashcode, in TAlternativeKey alternative, delegate* equals) where TAlternativeKey : allows ref struct + { + Table table = m_Table; + if (table is null) + return default!; + if (hashcode < 0) + hashcode = ~hashcode; + K[] keys = table.m_keys; + int index = hashcode % keys.Length; + while (true) + { + K hit = Volatile.Read(ref keys[index]); + if (hit != null) + { + if (equals(alternative, hit)) + return table.m_values[index]; + index++; + if (index >= keys.Length) + index -= keys.Length; + } + else + { + return default!; + } + } + } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index ea3fc97217e21f..6ff52c5a6d272f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -9,6 +9,7 @@ using System.Runtime.InteropServices; using System.Threading; using static System.Reflection.InvokerEmitUtil; +using static System.Reflection.InvokeSignatureInfo; using static System.Reflection.MethodBase; using static System.Reflection.MethodInvokerCommon; @@ -28,12 +29,14 @@ namespace System.Reflection public sealed partial class ConstructorInvoker { private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. + private readonly Type _declaringType; private readonly IntPtr _functionPointer; private readonly Delegate _invokeFunc; // todo: use GetMethodImpl and fcnptr? private readonly InvokerArgFlags[] _invokerArgFlags; private readonly RuntimeConstructorInfo _method; - private readonly InvokeSignatureInfo _signatureInfo; + private readonly RuntimeType[] _parameterTypes; private readonly InvokerStrategy _strategy; + private readonly bool _allocateObject; /// /// Creates a new instance of ConstructorInvoker. @@ -60,23 +63,34 @@ public static ConstructorInvoker Create(ConstructorInfo constructor) private ConstructorInvoker(RuntimeConstructorInfo constructor) { - if ((constructor.InvocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers | InvocationFlags.NoConstructorInvoke)) == 0) - { - _functionPointer = constructor.MethodHandle.GetFunctionPointer(); - _method = constructor; - _signatureInfo = InvokeSignatureInfo.Create(constructor, constructor.ArgumentTypes); - _argCount = _signatureInfo.ParameterTypes.Length; - Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); - _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); - _invokeFunc = GetOrCreateInvokeFunc(_signatureInfo, _strategy, isForArrayInput: false, backwardsCompat: false); - } - else + _method = constructor; + + if ((constructor.InvocationFlags & InvocationFlags.NoInvoke) != 0) { - _signatureInfo = null!; - _method = null!; + _declaringType = null!; _invokeFunc = null!; - _invokerArgFlags = default!; + _invokerArgFlags = null!; + _parameterTypes = null!; + return; } + + _declaringType = constructor.DeclaringType!; + _parameterTypes = constructor.ArgumentTypes; + _argCount = _parameterTypes.Length; + + MethodBase _ = constructor; + Debug.Assert(constructor.IsStatic == false); + Initialize( + isForArrayInput: false, + constructor, + _declaringType, + _parameterTypes, + returnType: typeof(void), + out _allocateObject, + out _functionPointer, + out _invokeFunc, + out _strategy, + out _invokerArgFlags); } /// @@ -96,12 +110,24 @@ private ConstructorInvoker(RuntimeConstructorInfo constructor) /// public object Invoke() { + if (_invokeFunc is null) + { + _method.ThrowNoInvokeException(); + } + if (_argCount != 0) { MethodBaseInvoker.ThrowTargetParameterCountException(); } - return InvokeImpl(null, null, null, null); + if (_allocateObject) + { + object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); + return obj; + } + + return ((InvokeFunc_Obj0Args)_invokeFunc)(obj: null, _functionPointer)!; } /// @@ -114,12 +140,31 @@ public object Invoke() /// public object Invoke(object? arg1) { + if (_invokeFunc is null) + { + _method.ThrowNoInvokeException(); + } + if (_argCount != 1) { MethodBaseInvoker.ThrowTargetParameterCountException(); } - return InvokeImpl(arg1, null, null, null); + CheckArgument(ref arg1, 0); + + if (_strategy == InvokerStrategy.Ref4) + { + return InvokeWithRefArgs4(new Span(new object?[] { arg1 })); + } + + if (_allocateObject) + { + object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_Obj1Arg)_invokeFunc)(obj, _functionPointer, arg1); + return obj; + } + + return ((InvokeFunc_Obj1Arg)_invokeFunc)(obj: null, _functionPointer, arg1)!; } /// @@ -127,11 +172,21 @@ public object Invoke(object? arg1) /// The second argument for the invoked method. public object Invoke(object? arg1, object? arg2) { + if (_invokeFunc is null) + { + _method.ThrowNoInvokeException(); + } + if (_argCount != 2) { MethodBaseInvoker.ThrowTargetParameterCountException(); } + if (_strategy == InvokerStrategy.Ref4) + { + return InvokeWithRefArgs4(new Span(new object?[] { arg1, arg2 })); + } + return InvokeImpl(arg1, arg2, null, null); } @@ -141,11 +196,21 @@ public object Invoke(object? arg1, object? arg2) /// The third argument for the invoked method. public object Invoke(object? arg1, object? arg2, object? arg3) { + if (_invokeFunc is null) + { + _method.ThrowNoInvokeException(); + } + if (_argCount != 3) { MethodBaseInvoker.ThrowTargetParameterCountException(); } + if (_strategy == InvokerStrategy.Ref4) + { + return InvokeWithRefArgs4(new Span(new object?[] { arg1, arg2, arg3 })); + } + return InvokeImpl(arg1, arg2, arg3, null); } @@ -156,11 +221,21 @@ public object Invoke(object? arg1, object? arg2, object? arg3) /// The fourth argument for the invoked method. public object Invoke(object? arg1, object? arg2, object? arg3, object? arg4) { + if (_invokeFunc is null) + { + _method.ThrowNoInvokeException(); + } + if (_argCount != 4) { MethodBaseInvoker.ThrowTargetParameterCountException(); } + if (_strategy == InvokerStrategy.Ref4) + { + return InvokeWithRefArgs4(new Span(new object?[] { arg1, arg2, arg3, arg4 })); + } + return InvokeImpl(arg1, arg2, arg3, arg4); } @@ -187,9 +262,14 @@ private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4 break; } - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); - ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, arg1, arg2, arg3, arg4); - return obj; + if (_allocateObject) + { + object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, arg1, arg2, arg3, arg4); + return obj; + } + + return ((InvokeFunc_Obj4Args)_invokeFunc)(obj: null, _functionPointer, arg1, arg2, arg3, arg4)!; } /// @@ -199,21 +279,40 @@ private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4 /// public object Invoke(Span arguments) { - int argLen = arguments.Length; - if (argLen != _argCount) + if (_invokeFunc is null) + { + _method.ThrowNoInvokeException(); + } + + if (arguments.Length != _argCount) { MethodBaseInvoker.ThrowTargetParameterCountException(); } switch (_strategy) { + case InvokerStrategy.Obj0: + if (_allocateObject) + { + object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); + return obj; + } + return ((InvokeFunc_Obj0Args)_invokeFunc)(obj: null, _functionPointer)!; + case InvokerStrategy.Obj1: + object? arg1 = arguments[0]; + CheckArgument(ref arg1, 0); + + if (_allocateObject) + { + object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_Obj1Arg)_invokeFunc)(obj, _functionPointer, arg1); + return obj; + } + return ((InvokeFunc_Obj1Arg)_invokeFunc)(obj: null, _functionPointer, arg1)!; case InvokerStrategy.Obj4: switch (_argCount) { - case 0: - return InvokeImpl(null, null, null, null); - case 1: - return InvokeImpl(arguments[0], null, null, null); case 2: return InvokeImpl(arguments[0], arguments[1], null, null); case 3: @@ -239,11 +338,11 @@ internal unsafe object InvokeWithSpanArgs(Span arguments) _method.ThrowNoInvokeException(); } + object? obj; + Span copyOfArgs; GCFrameRegistration regArgStorage; - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); - IntPtr* pArgStorage = stackalloc IntPtr[_argCount]; NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr)); copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); @@ -260,7 +359,16 @@ internal unsafe object InvokeWithSpanArgs(Span arguments) copyOfArgs[i] = arg; } - ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + if (_allocateObject) + { + obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + } + else + { + obj = ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj: null, _functionPointer, copyOfArgs)!; + } + // No need to call CopyBack here since there are no ref values. } finally @@ -271,7 +379,7 @@ internal unsafe object InvokeWithSpanArgs(Span arguments) return obj; } - internal object InvokeWithRefArgs4(Span arguments) + internal unsafe object InvokeWithRefArgs4(Span arguments) { if (_invokeFunc is null) { @@ -282,17 +390,34 @@ internal object InvokeWithRefArgs4(Span arguments) StackAllocatedArgumentsWithCopyBack stackArgStorage = default; Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, _argCount); - scoped Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); + Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); + StackAllocatedByRefs byrefs = default; + IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; for (int i = 0; i < _argCount; i++) { object? arg = arguments[i]; shouldCopyBack[i] = CheckArgument(ref arg, i); copyOfArgs[i] = arg; + + *(ByReference*)(pByRefFixedStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? + ByReference.Create(ref copyOfArgs[i]!.GetRawData()) : +#pragma warning disable CS9080 + ByReference.Create(ref copyOfArgs[i]); +#pragma warning restore CS9080 + } + + object obj; + if (_allocateObject) + { + obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); + } + else + { + obj = ((InvokeFunc_RefArgs)_invokeFunc)(obj: null, _functionPointer, pByRefFixedStorage)!; } - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); - ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); CopyBack(arguments, copyOfArgs, shouldCopyBack); return obj; } @@ -304,11 +429,11 @@ internal unsafe object InvokeWithRefArgsMany(Span arguments) _method.ThrowNoInvokeException(); } + object? obj; + Span copyOfArgs; GCFrameRegistration regArgStorage; - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); - IntPtr* pStorage = stackalloc IntPtr[2 * _argCount]; NativeMemory.Clear(pStorage, (nuint)(2 * _argCount) * (nuint)sizeof(IntPtr)); copyOfArgs = new(ref Unsafe.AsRef(pStorage), _argCount); @@ -334,7 +459,16 @@ internal unsafe object InvokeWithRefArgsMany(Span arguments) ByReference.Create(ref Unsafe.AsRef(pStorage + i)); } - ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); + if (_allocateObject) + { + obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); + } + else + { + obj = ((InvokeFunc_RefArgs)_invokeFunc)(obj: null, _functionPointer, pByRefStorage)!; + } + CopyBack(arguments, copyOfArgs, shouldCopyBack); } finally @@ -371,7 +505,7 @@ internal void CopyBack(Span dest, ReadOnlySpan copyOfParameter [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool CheckArgument(ref object? arg, int i) { - RuntimeType sigType = (RuntimeType)_signatureInfo.ParameterTypes[i]; + RuntimeType sigType = (RuntimeType)_parameterTypes[i]; // Convert the type if necessary. // Note that Type.Missing is not supported. diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs index f746a27798fe04..fb0703fe37d9a7 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs @@ -42,9 +42,6 @@ protected ILGenerator() public abstract void EmitCalli(OpCode opcode, CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes, Type[]? optionalParameterTypes); - internal virtual void EmitCalli(OpCode opcode, CallingConventions callingConvention, - Type? returnType, ReadOnlySpan parameterTypes, Type[]? optionalParameterTypes) => throw new NotImplementedException(); - public abstract void EmitCalli(OpCode opcode, CallingConvention unmanagedCallConv, Type? returnType, Type[]? parameterTypes); public abstract void EmitCall(OpCode opcode, MethodInfo methodInfo, Type[]? optionalParameterTypes); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs index 784cb749cc4f6c..cc3fb5af624ec4 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs @@ -3,92 +3,35 @@ using System.Collections.Generic; using System.Diagnostics; +using static System.Reflection.MethodBase; -namespace System.Reflection.Emit +namespace System.Reflection { internal sealed class InvokeSignatureInfo { - private readonly Type _declaringType; - private readonly Type[] _parameterTypes; - private readonly Type _returnType; - private readonly bool _isStatic; + internal readonly Type _declaringType; + internal readonly Type[] _parameterTypes; + internal readonly Type _returnType; + internal readonly bool _isStatic; - public static InvokeSignatureInfo Create(MethodBase method, Type[] parameterTypes) + public static InvokeSignatureInfo Create(in InvokeSignatureInfoKey InvokeSignatureInfoKey) { - if (method is RuntimeMethodInfo rmi) - { - return new InvokeSignatureInfo(declaringType: rmi.DeclaringType!, returnType: rmi.ReturnType, parameterTypes, rmi.IsStatic); - } - - if (method is RuntimeConstructorInfo rci) - { - Debug.Assert(rci.GetReturnType() == typeof(void)); - Debug.Assert(!rci.IsStatic); - - return new InvokeSignatureInfo(declaringType: rci.DeclaringType!, returnType: typeof(void), parameterTypes, isStatic: false); - } - - DynamicMethod dm = (DynamicMethod)method; - return new InvokeSignatureInfo(declaringType: dm.DeclaringType!, returnType: dm.ReturnType, parameterTypes, dm.IsStatic); - } - - public static InvokeSignatureInfo CreateNormalized(MethodBase method, Type[] parameterTypes) - { - InvokeSignatureInfo sigInfo; - - if (method is RuntimeMethodInfo rmi) - { - sigInfo = CreateNormalized( - declaringType: method.IsStatic ? typeof(void) : rmi.DeclaringType!, - returnType: rmi.ReturnType, - parameterTypes, - rmi.IsStatic); - } - else if (method is RuntimeConstructorInfo rci) - { - Debug.Assert(rci.GetReturnType() == typeof(void)); - Debug.Assert(!rci.IsStatic); - - sigInfo = CreateNormalized( - declaringType: rci.DeclaringType!, - returnType: typeof(void), - parameterTypes, - isStatic: false); - } - else - { - DynamicMethod di = (DynamicMethod)method; - sigInfo = CreateNormalized( - declaringType: di.IsStatic ? typeof(void) : di.DeclaringType!, - returnType: di.ReturnType, - parameterTypes, - di.IsStatic); - } - - return sigInfo; - - static InvokeSignatureInfo CreateNormalized(Type declaringType, Type returnType, Type[] parameterTypes, bool isStatic) => - new InvokeSignatureInfo( - declaringType: NormalizeType(declaringType), - returnType: NormalizeType(returnType), - GetNormalizedParameterTypes(parameterTypes), - isStatic); + return new InvokeSignatureInfo( + InvokeSignatureInfoKey._declaringType, + InvokeSignatureInfoKey._parameterTypes, + InvokeSignatureInfoKey._returnType, + InvokeSignatureInfoKey._isStatic); } - public InvokeSignatureInfo(Type declaringType, Type returnType, Type[] parameterTypes, bool isStatic) + public InvokeSignatureInfo(Type declaringType, Type[] parameterTypes, Type returnType, bool isStatic) { _declaringType = declaringType; - _returnType = returnType; _parameterTypes = parameterTypes; + _returnType = returnType; _isStatic = isStatic; } - public Type DeclaringType => _declaringType; - public bool IsStatic => _isStatic; - public ReadOnlySpan ParameterTypes => _parameterTypes; - public Type ReturnType => _returnType; - - // Must be the same as NormalizedLookupKey.Comparer.Equals(). + // Must be the same as InvokeSignatureInfoKey.Comparer.Equals(). public override bool Equals(object? other) { if (ReferenceEquals(this, other)) @@ -120,23 +63,84 @@ public override bool Equals(object? other) return true; } - public override int GetHashCode() + public override int GetHashCode() => GetHashCode(_declaringType, _parameterTypes, _returnType); + + public static int GetHashCode(Type declaringType, Type[] parameterTypes, Type returnType) { - int hashcode = _declaringType.GetHashCode(); + int hashcode = declaringType.GetHashCode(); hashcode = int.RotateLeft(hashcode, 5); - hashcode ^= _returnType.GetHashCode(); + hashcode ^= returnType.GetHashCode(); hashcode = int.RotateLeft(hashcode, 5); - for (int i = 0; i < _parameterTypes.Length; i++) + for (int i = 0; i < parameterTypes.Length; i++) { - hashcode ^= _parameterTypes[i].GetHashCode(); + hashcode ^= parameterTypes[i].GetHashCode(); hashcode = int.RotateLeft(hashcode, 5); } // We don't include _isStatic in the hashcode because it is already included with _declaringType==typeof(void). return hashcode; } + } + + /// + /// Provide a zero-alloc ref struct to wrap member signature properties needed for both cache lookup and emit. + /// + internal readonly ref struct InvokeSignatureInfoKey + { + internal readonly Type _declaringType; + internal readonly Type[] _parameterTypes; + internal readonly Type _returnType; + internal readonly bool _isStatic; + + public static InvokeSignatureInfoKey CreateNormalized(Type declaringType, Type[] parameterTypes, Type returnType, bool isStatic) + { + return new InvokeSignatureInfoKey( + isStatic ? typeof(void) : NormalizeType(declaringType), + GetNormalizedParameterTypes(parameterTypes), + NormalizeType(returnType), + isStatic); + } + + public InvokeSignatureInfoKey(Type declaringType, Type[] parameterTypes, Type returnType, bool isStatic) + { + _declaringType = declaringType; + _parameterTypes = parameterTypes; + _returnType = returnType; + _isStatic = isStatic; + } + + public Type DeclaringType => _declaringType; + public Type[] ParameterTypes => _parameterTypes; + public Type ReturnType => _returnType; + public bool IsStatic => _isStatic; + + public static bool AlternativeEquals(in InvokeSignatureInfoKey @this, InvokeSignatureInfo signatureInfo) + { + if (!ReferenceEquals(@this._declaringType, signatureInfo._declaringType) || + !ReferenceEquals(@this._returnType, signatureInfo._returnType) || + @this._isStatic != signatureInfo._isStatic || + @this._parameterTypes.Length != signatureInfo._parameterTypes.Length) + { + return false; + } + + for (int i = 0; i < @this._parameterTypes.Length; i++) + { + if (!ReferenceEquals(@this._parameterTypes[i], signatureInfo._parameterTypes[i])) + { + return false; + } + } + + return true; + } + + public int AlternativeGetHashCode() => InvokeSignatureInfo.GetHashCode( + _declaringType, + _parameterTypes, + _returnType); /// /// Return an array of normalized types for a calli signature. @@ -155,7 +159,7 @@ private static Type[] GetNormalizedParameterTypes(Type[] parameterTypes) // Check if we can re-use the existing array if it is already normalized. for (int i = 0; i < parameterTypes.Length; i++) { - if (!InvokeSignatureInfo.IsNormalized(parameterTypes[i])) + if (!IsNormalized(parameterTypes[i])) { normalizedParameterTypes = new Type[parameterTypes.Length]; break; @@ -178,9 +182,9 @@ private static Type[] GetNormalizedParameterTypes(Type[] parameterTypes) /// /// Normalize the type for a calli signature. /// - public static Type NormalizeType(Type type) => IsNormalized(type) ? type : typeof(object); + private static Type NormalizeType(Type type) => IsNormalized(type) ? type : typeof(object); - public static bool IsNormalized(Type type) => + private static bool IsNormalized(Type type) => type == typeof(object) || type == typeof(void) || type.IsValueType || diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index f051c2f82eed49..41292645bc7f3b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -18,7 +18,7 @@ internal static class InvokerEmitUtil internal delegate object? InvokeFunc_ObjSpanArgs(object? obj, IntPtr functionPointer, Span arguments); internal unsafe delegate object? InvokeFunc_RefArgs(object? obj, IntPtr functionPointer, IntPtr* refArguments); - public static unsafe InvokeFunc_Obj0Args CreateInvokeDelegate_Obj0Args(MethodBase? method, InvokeSignatureInfo signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_Obj0Args CreateInvokeDelegate_Obj0Args(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr)]); ILGenerator il = dm.GetILGenerator(); @@ -29,7 +29,7 @@ public static unsafe InvokeFunc_Obj0Args CreateInvokeDelegate_Obj0Args(MethodBas return (InvokeFunc_Obj0Args)dm.CreateDelegate(typeof(InvokeFunc_Obj0Args), target: null); } - public static unsafe InvokeFunc_Obj1Arg CreateInvokeDelegate_Obj1Arg(MethodBase? method, InvokeSignatureInfo signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_Obj1Arg CreateInvokeDelegate_Obj1Arg(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(object)]); ILGenerator il = dm.GetILGenerator(); @@ -45,7 +45,7 @@ public static unsafe InvokeFunc_Obj1Arg CreateInvokeDelegate_Obj1Arg(MethodBase? return (InvokeFunc_Obj1Arg)dm.CreateDelegate(typeof(InvokeFunc_Obj1Arg), target: null); } - public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBase? method, InvokeSignatureInfo signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(object), typeof(object), typeof(object), typeof(object)]); ILGenerator il = dm.GetILGenerator(); @@ -78,7 +78,7 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBas return (InvokeFunc_Obj4Args)dm.CreateDelegate(typeof(InvokeFunc_Obj4Args), target: null); } - public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(MethodBase? method, InvokeSignatureInfo signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(Span)]); ILGenerator il = dm.GetILGenerator(); @@ -103,7 +103,7 @@ public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Met return (InvokeFunc_ObjSpanArgs)dm.CreateDelegate(typeof(InvokeFunc_ObjSpanArgs), target: null); } - public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase? method, InvokeSignatureInfo signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(IntPtr*)]); ILGenerator il = dm.GetILGenerator(); @@ -155,7 +155,7 @@ private static void UnboxSpecialType(ILGenerator il, Type parameterType) } } - private static DynamicMethod CreateDynamicMethod(MethodBase? method, InvokeSignatureInfo signatureInfo, Type[] delegateParameters) + private static DynamicMethod CreateDynamicMethod(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, Type[] delegateParameters) { return new DynamicMethod( GetInvokeStubName(method, signatureInfo), @@ -167,7 +167,7 @@ private static DynamicMethod CreateDynamicMethod(MethodBase? method, InvokeSigna private static void EmitLdargForInstance(ILGenerator il, MethodBase? method, bool isStatic, Type declaringType) { - if (!isStatic && method is not RuntimeConstructorInfo) + if (method is not RuntimeConstructorInfo && !isStatic) { il.Emit(OpCodes.Ldarg_0); if (declaringType.IsValueType) @@ -177,10 +177,12 @@ private static void EmitLdargForInstance(ILGenerator il, MethodBase? method, boo } } - private static void EmitCall(ILGenerator il, MethodBase? method, InvokeSignatureInfo signatureInfo, bool isStatic, bool backwardsCompat) + private static void EmitCall(ILGenerator il, MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool isStatic, bool backwardsCompat) { if (method is null) { + // Use calli + CallingConventions callingConventions = CallingConventions.Standard; if (!isStatic) { @@ -189,33 +191,34 @@ private static void EmitCall(ILGenerator il, MethodBase? method, InvokeSignature il.Emit(OpCodes.Ldarg_1); il.EmitCalli(OpCodes.Calli, callingConventions, signatureInfo.ReturnType, signatureInfo.ParameterTypes, optionalParameterTypes: null); + return; } - else + + // Use Call\CallVirt\NewObj + + // For CallStack reasons, don't inline target method. + // EmitCalli above and Mono interpreter do not need this. + if (backwardsCompat && RuntimeFeature.IsDynamicCodeCompiled) { - // For CallStack reasons, don't inline target method. - // EmitCalli above and Mono interpreter do not need this. - if (backwardsCompat && RuntimeFeature.IsDynamicCodeCompiled) - { #if MONO - il.Emit(OpCodes.Call, Methods.DisableInline()); + il.Emit(OpCodes.Call, Methods.DisableInline()); #else - il.Emit(OpCodes.Call, Methods.NextCallReturnAddress()); - il.Emit(OpCodes.Pop); + il.Emit(OpCodes.Call, Methods.NextCallReturnAddress()); + il.Emit(OpCodes.Pop); #endif - } + } - if (method is RuntimeConstructorInfo) - { - il.Emit(OpCodes.Newobj, (ConstructorInfo)method); - } - else if (method.IsStatic || method.DeclaringType!.IsValueType) - { - il.Emit(OpCodes.Call, (MethodInfo)method); - } - else - { - il.Emit(OpCodes.Callvirt, (MethodInfo)method); - } + if (method is RuntimeConstructorInfo rci) + { + il.Emit(OpCodes.Newobj, rci); + } + else if (method.IsStatic || method.DeclaringType!.IsValueType) + { + il.Emit(OpCodes.Call, (MethodInfo)method); + } + else + { + il.Emit(OpCodes.Callvirt, (MethodInfo)method); } } @@ -280,7 +283,7 @@ private static void EmitReturnHandling(ILGenerator il, Type returnType) /// Return the name of the dynamic method that will be created using the function pointer syntax /// of listing the parameter types and then the return type. /// - private static string GetInvokeStubName(MethodBase? method, InvokeSignatureInfo signatureInfo) + private static string GetInvokeStubName(MethodBase? method, in InvokeSignatureInfoKey signatureInfo) { if (method is not null) { @@ -290,7 +293,7 @@ private static string GetInvokeStubName(MethodBase? method, InvokeSignatureInfo return GetInvokeStubName(signatureInfo); - static string GetInvokeStubName(InvokeSignatureInfo signatureInfo) + static string GetInvokeStubName(in InvokeSignatureInfoKey signatureInfo) { const int MaxChars = 256; Span value = stackalloc char[MaxChars]; diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs index ffe8b4381516d6..df32621d1e7acc 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs @@ -207,7 +207,8 @@ internal enum InvokerArgFlags : int { IsValueType = 0x1, IsValueType_ByRef_Or_Pointer = 0x2, - IsNullableOfT = 0x4, + IsByRefForValueType = 0x4, + IsNullableOfT = 0x8, } [InlineArray(MaxStackAllocArgCount)] diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index 4a28375b00d384..3bede4d61deb71 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -12,6 +12,7 @@ using System.Threading; using System.Collections.Concurrent; using static System.Reflection.InvokerEmitUtil; +using static System.Reflection.InvokeSignatureInfo; using static System.Reflection.MethodBase; using static System.Reflection.MethodInvokerCommon; @@ -28,48 +29,34 @@ internal sealed partial class MethodBaseInvoker internal const int MaxStackAllocArgCount = 4; private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. + private readonly Type _declaringType; private readonly IntPtr _functionPointer; // This will be Zero when not using calli. private readonly Delegate _invokeFunc; private readonly InvokerArgFlags[] _invokerArgFlags; - private readonly MethodBase? _method; // This will be null when using calli. - private readonly InvokeSignatureInfo _signatureInfo; + private readonly MethodBase _method; + private readonly RuntimeType[] _parameterTypes; private readonly InvokerStrategy _strategy; private readonly bool _allocateObject; // True for constructors when using calli. // todo: CreateUninitializedCache - public MethodBaseInvoker(MethodBase method, RuntimeType[] parameterTypes) + public MethodBaseInvoker(MethodBase method, Type declaringType, RuntimeType[] parameterTypes, Type returnType) { + _method = method; + _declaringType = declaringType; + _parameterTypes = parameterTypes; _argCount = parameterTypes.Length; - if (SupportsCalli(method)) - { - _allocateObject = method is RuntimeConstructorInfo; - _functionPointer = method.MethodHandle.GetFunctionPointer(); - _method = null; - - if (CanCacheDynamicMethod(method) && !HasDefaultParameterValues(method)) - { - _signatureInfo = InvokeSignatureInfo.CreateNormalized(method, parameterTypes); - Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); - _strategy = GetInvokerStrategy(_argCount, needsByRefStrategy); - _invokeFunc = GetOrCreateInvokeFunc(_signatureInfo, _strategy, isForArrayInput: true, backwardsCompat: false); - } - else - { - _signatureInfo = InvokeSignatureInfo.Create(method, parameterTypes); - Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); - _strategy = GetInvokerStrategy(_argCount, needsByRefStrategy); - _invokeFunc = CreateInvokeFunc(method: null, _signatureInfo, _strategy, isForArrayInput: true, backwardsCompat: false); - } - } - else - { - _signatureInfo = InvokeSignatureInfo.Create(method, parameterTypes); - Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); - _strategy = GetInvokerStrategy(_argCount, needsByRefStrategy); - _invokeFunc = CreateInvokeFunc(method, _signatureInfo, _strategy, isForArrayInput: true, backwardsCompat: true); - _method = method; - } + Initialize( + isForArrayInput: true, + method, + declaringType, + parameterTypes, + returnType, + out _allocateObject, + out _functionPointer, + out _invokeFunc, + out _strategy, + out _invokerArgFlags); } internal InvokerStrategy Strategy => _strategy; @@ -88,10 +75,11 @@ internal static void ThrowTargetParameterCountException() { if (_allocateObject) { - obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); + obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); return obj; } + return ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) @@ -109,17 +97,19 @@ internal static void ThrowTargetParameterCountException() { Debug.Assert(_argCount == 1); - CheckArgument(ref parameter, 0, binder, culture, invokeAttr); + RuntimeType sigType = (RuntimeType)_parameterTypes[0]; + + bool _ = false; + CheckArgument(ref parameter, ref _, 0, binder, culture, invokeAttr); try { if (_allocateObject) { - obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); - ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); - return obj; + obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); + return ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); } - return ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); + return obj = ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -127,6 +117,47 @@ internal static void ThrowTargetParameterCountException() } } + internal unsafe object? InvokeWith1Arg( + object? obj, + BindingFlags invokeAttr, + Binder? binder, + object?[] parameters, + CultureInfo? culture) + { + Debug.Assert(_argCount == 1); + + RuntimeType sigType = (RuntimeType)_parameterTypes[0]; + + bool copyBack = false; + object? arg1 = parameters[0]; + object? copyBackArg1 = arg1; + CheckArgument(ref arg1, ref copyBack, 0, binder, culture, invokeAttr); + + try + { + if (_allocateObject) + { + obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); + ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, arg1); + } + else + { + obj = ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, arg1); + } + } + catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) + { + throw new TargetInvocationException(e); + } + + if (copyBack) + { + CopyBack(parameters, new Span(ref arg1), new Span(ref copyBack)); + } + + return obj; + } + internal unsafe object? InvokeWith4Args( object? obj, BindingFlags invokeAttr, @@ -137,28 +168,35 @@ internal static void ThrowTargetParameterCountException() Debug.Assert(_argCount <= MaxStackAllocArgCount); StackAllocatedArgumentsWithCopyBack stackArgStorage = default; - Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, _argCount); - Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); + Span copyOfArgs = (Span)stackArgStorage._args; + Span shouldCopyBack = (Span)stackArgStorage._shouldCopyBack; - CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); + for (int i = 0; i < parameters.Length; i++) + { + copyOfArgs[i] = parameters[i]; + CheckArgument(ref copyOfArgs[i], ref shouldCopyBack[i], i, binder, culture, invokeAttr); + } try { if (_allocateObject) { - obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); - ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); - return obj; + obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); + ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, copyOfArgs[0], copyOfArgs[1], copyOfArgs[2], copyOfArgs[3]); } else { - return ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + obj = ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, copyOfArgs[0], copyOfArgs[1], copyOfArgs[2], copyOfArgs[3]); } } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { throw new TargetInvocationException(e); } + + CopyBack(parameters, copyOfArgs, shouldCopyBack); + + return obj; } internal unsafe object? InvokeWithSpanArgs( @@ -191,7 +229,7 @@ internal static void ThrowTargetParameterCountException() { if (_allocateObject) { - obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); + obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); ret = obj; } @@ -224,8 +262,8 @@ internal static void ThrowTargetParameterCountException() Debug.Assert(_argCount <= MaxStackAllocArgCount); StackAllocatedArgumentsWithCopyBack stackArgStorage = default; - Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, _argCount); - Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); + Span copyOfArgs = (Span)stackArgStorage._args; + Span shouldCopyBack = (Span)stackArgStorage._shouldCopyBack; StackAllocatedByRefs byrefs = default; IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; @@ -246,7 +284,7 @@ internal static void ThrowTargetParameterCountException() { if (_allocateObject) { - obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); + obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); ret = obj; } @@ -301,7 +339,7 @@ internal static void ThrowTargetParameterCountException() { if (_allocateObject) { - obj ??= ((RuntimeType)_signatureInfo.DeclaringType!).GetUninitializedObject(); + obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); ret = obj; } @@ -348,6 +386,27 @@ internal void CopyBack(object?[] dest, Span copyOfParameters, Span should never be here."); - // Make a copy to prevent the boxed instance from being directly modified by the method. - arg = RuntimeType.AllocateValueType(sigElementType, arg); - } - + Debug.Assert(!elementType.IsNullableOfT, "A true boxed Nullable should never be here."); + // Make a copy to prevent the boxed instance from being directly modified by the method. + arg = RuntimeType.AllocateValueType(elementType, arg); return true; } return false; } - - private static InvokerStrategy GetInvokerStrategy(int argCount, bool needsByRefStrategy) - { - if (needsByRefStrategy) - { - return argCount <= 4 ? InvokerStrategy.Ref4 : InvokerStrategy.RefMany; - } - - return argCount switch - { - 0 => InvokerStrategy.Obj0, - 1 => InvokerStrategy.Obj1, - 2 or 3 or 4 => InvokerStrategy.Obj4, - _ => InvokerStrategy.ObjSpan - }; - } - - // Supporting default values would increase cache memory usage and slow down the common case - // since the default values would have to be cached as well. - internal static bool HasDefaultParameterValues(MethodBase method) - { - ReadOnlySpan parameters = method.GetParametersAsSpan(); - - for (int i = 0; i < parameters.Length; i++) - { - if (parameters[i].HasDefaultValue) - { - return true; - } - } - - return false; - } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index 3c681b24dae0a5..b35c645ba7fbdf 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -8,6 +8,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using static System.Reflection.InvokerEmitUtil; +using static System.Reflection.InvokeSignatureInfo; using static System.Reflection.MethodBase; using static System.Reflection.MethodInvokerCommon; @@ -27,12 +28,13 @@ namespace System.Reflection public sealed partial class MethodInvoker { private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. + private readonly Type _declaringType; private readonly IntPtr _functionPointer; private readonly Delegate? _invokeFunc; // todo: use GetMethodImpl and fcnptr? private readonly InvokerArgFlags[] _invokerArgFlags; + private readonly RuntimeType[] _parameterTypes; private readonly MethodBase _method; private readonly InvokerStrategy _strategy; - private readonly InvokeSignatureInfo _signatureInfo; /// /// Creates a new instance of MethodInvoker. @@ -51,64 +53,50 @@ public static MethodInvoker Create(MethodBase method) if (method is RuntimeMethodInfo rmi) { - return new MethodInvoker(rmi, rmi.ArgumentTypes, rmi.InvocationFlags); + return new MethodInvoker(rmi, rmi.ArgumentTypes, rmi.ReturnType, rmi.InvocationFlags); } if (method is RuntimeConstructorInfo rci) { - return new MethodInvoker(rci, rci.ArgumentTypes, rci.InvocationFlags); + return new MethodInvoker(rci, rci.ArgumentTypes, typeof(void), rci.InvocationFlags); } if (method is DynamicMethod dm) { - return new MethodInvoker(dm, dm.ArgumentTypes, InvocationFlags.Unknown); + return new MethodInvoker(dm, dm.ArgumentTypes, dm.ReturnType, InvocationFlags.Unknown); } throw new ArgumentException(SR.Argument_MustBeRuntimeMethod, nameof(method)); } - private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, InvocationFlags invocationFlags) + private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type returnType, InvocationFlags invocationFlags) { - if ((invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers)) == 0) - { - _argCount = parameterTypes.Length; - _functionPointer = method.MethodHandle.GetFunctionPointer(); - _method = method; - - if (SupportsCalli(method)) - { - _functionPointer = method.MethodHandle.GetFunctionPointer(); + _method = method; - if (CanCacheDynamicMethod(method)) - { - _signatureInfo = InvokeSignatureInfo.CreateNormalized(method, parameterTypes); - Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); - _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); - _invokeFunc = GetOrCreateInvokeFunc(_signatureInfo, _strategy, isForArrayInput: false, backwardsCompat: false); - } - else - { - _signatureInfo = InvokeSignatureInfo.Create(method, parameterTypes); - Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); - _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); - _invokeFunc = CreateInvokeFunc(method: null, _signatureInfo, _strategy, isForArrayInput: false, backwardsCompat: false); - } - } - else - { - _signatureInfo = InvokeSignatureInfo.Create(method, parameterTypes); - Initialize(_signatureInfo, out bool needsByRefStrategy, out _invokerArgFlags); - _strategy = GetInvokerStrategyForSpanInput(_argCount, needsByRefStrategy); - _invokeFunc = CreateInvokeFunc(method, _signatureInfo, _strategy, isForArrayInput: false, backwardsCompat: false); - _method = method; - } - } - else + if ((invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers)) != 0) { - _signatureInfo = null!; - _method = null!; - _invokerArgFlags = default!; + _declaringType = null!; + _invokeFunc = null!; + _invokerArgFlags = null!; + _parameterTypes = null!; + return; } + + _declaringType = method.DeclaringType!; + _parameterTypes = parameterTypes; + _argCount = _parameterTypes.Length; + + Initialize( + isForArrayInput: false, + method, + _declaringType, + _parameterTypes, + returnType, + out bool _, + out _functionPointer, + out _invokeFunc, + out _strategy, + out _invokerArgFlags); } /// @@ -139,12 +127,22 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Invocatio /// public object? Invoke(object? obj) { + if (_invokeFunc is null) + { + ThrowNoInvokeException(); + } + + if (!_method.IsStatic) + { + ValidateInvokeTarget(obj, _method); + } + if (_argCount != 0) { MethodBaseInvoker.ThrowTargetParameterCountException(); } - return InvokeImpl(obj, null, null, null, null); + return ((InvokeFunc_Obj0Args)_invokeFunc!)(obj, _functionPointer); } /// @@ -155,12 +153,28 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Invocatio /// public object? Invoke(object? obj, object? arg1) { + if (_invokeFunc is null) + { + ThrowNoInvokeException(); + } + + if (!_method.IsStatic) + { + ValidateInvokeTarget(obj, _method); + } + if (_argCount != 1) { MethodBaseInvoker.ThrowTargetParameterCountException(); } - return InvokeImpl(obj, arg1, null, null, null); + if (_strategy == InvokerStrategy.Ref4) + { + return InvokeWithRefArgs4(obj, new Span(new object?[] { arg1 })); + } + + CheckArgument(ref arg1, 0); + return ((InvokeFunc_Obj1Arg)_invokeFunc!)(obj, _functionPointer, arg1); } /// @@ -169,11 +183,21 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Invocatio /// The second argument for the invoked method. public object? Invoke(object? obj, object? arg1, object? arg2) { + if (_invokeFunc is null) + { + ThrowNoInvokeException(); + } + if (_argCount != 2) { MethodBaseInvoker.ThrowTargetParameterCountException(); } + if (_strategy == InvokerStrategy.Ref4) + { + return InvokeWithRefArgs4(obj, new Span(new object?[] { arg1, arg2 })); + } + return InvokeImpl(obj, arg1, arg2, null, null); } @@ -184,11 +208,21 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Invocatio /// The third argument for the invoked method. public object? Invoke(object? obj, object? arg1, object? arg2, object? arg3) { + if (_invokeFunc is null) + { + ThrowNoInvokeException(); + } + if (_argCount != 3) { MethodBaseInvoker.ThrowTargetParameterCountException(); } + if (_strategy == InvokerStrategy.Ref4) + { + return InvokeWithRefArgs4(obj, new Span(new object?[] { arg1, arg2, arg3 })); + } + return InvokeImpl(obj, arg1, arg2, arg3, null); } @@ -200,22 +234,27 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Invocatio /// The fourth argument for the invoked method. public object? Invoke(object? obj, object? arg1, object? arg2, object? arg3, object? arg4) { + if (_invokeFunc is null) + { + ThrowNoInvokeException(); + } + if (_argCount != 4) { MethodBaseInvoker.ThrowTargetParameterCountException(); } + if (_strategy == InvokerStrategy.Ref4) + { + return InvokeWithRefArgs4(obj, new Span(new object?[] { arg1, arg2, arg3, arg4 })); + } + return InvokeImpl(obj, arg1, arg2, arg3, arg4); } private object? InvokeImpl(object? obj, object? arg1, object? arg2, object? arg3, object? arg4) { - if (_invokeFunc is null) - { - ThrowForBadInvocationFlags(); - } - - if (!_signatureInfo.IsStatic) + if (!_method.IsStatic) { ValidateInvokeTarget(obj, _method); } @@ -236,7 +275,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Invocatio break; } - return ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, arg1, arg2, arg3, arg4); + return ((InvokeFunc_Obj4Args)_invokeFunc!)(obj, _functionPointer, arg1, arg2, arg3, arg4); } /// @@ -247,21 +286,32 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Invocatio /// public object? Invoke(object? obj, Span arguments) { - int argLen = arguments.Length; - if (argLen != _argCount) + if (_invokeFunc is null) + { + ThrowNoInvokeException(); + } + + if (!_method.IsStatic) + { + ValidateInvokeTarget(obj, _method); + } + + if (arguments.Length != _argCount) { MethodBaseInvoker.ThrowTargetParameterCountException(); } switch (_strategy) { + case InvokerStrategy.Obj0: + return ((InvokeFunc_Obj0Args)_invokeFunc!)(obj, _functionPointer); + case InvokerStrategy.Obj1: + object? arg1 = arguments[0]; + CheckArgument(ref arg1, 0); + return ((InvokeFunc_Obj1Arg)_invokeFunc!)(obj, _functionPointer, arg1); case InvokerStrategy.Obj4: switch (_argCount) { - case 0: - return InvokeImpl(obj, null, null, null, null); - case 1: - return InvokeImpl(obj, arguments[0], null, null, null); case 2: return InvokeImpl(obj, arguments[0], arguments[1], null, null); case 3: @@ -327,7 +377,7 @@ private void ThrowForBadInvocationFlags() } } - internal object? InvokeWithRefArgs4(object? obj, Span arguments) + internal unsafe object? InvokeWithRefArgs4(object? obj, Span arguments) { if (_invokeFunc is null) { @@ -338,16 +388,24 @@ private void ThrowForBadInvocationFlags() StackAllocatedArgumentsWithCopyBack stackArgStorage = default; Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, _argCount); - scoped Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); + Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); + StackAllocatedByRefs byrefs = default; + IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; for (int i = 0; i < _argCount; i++) { object? arg = arguments[i]; shouldCopyBack[i] = CheckArgument(ref arg, i); copyOfArgs[i] = arg; + + *(ByReference*)(pByRefFixedStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? + ByReference.Create(ref copyOfArgs[i]!.GetRawData()) : +#pragma warning disable CS9080 + ByReference.Create(ref copyOfArgs[i]); +#pragma warning restore CS9080 } - object? ret = ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + object? ret = ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); CopyBack(arguments, copyOfArgs, shouldCopyBack); return ret; } @@ -423,7 +481,7 @@ internal void CopyBack(Span dest, Span copyOfParameters, Span< [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool CheckArgument(ref object? arg, int i) { - RuntimeType sigType = (RuntimeType)_signatureInfo.ParameterTypes[i]; + RuntimeType sigType = (RuntimeType)_parameterTypes[i]; // Convert the type if necessary. // Note that Type.Missing is not supported. @@ -441,5 +499,17 @@ private bool CheckArgument(ref object? arg, int i) return false; } + + [DoesNotReturn] + private void ThrowNoInvokeException() + { + if (_method is RuntimeMethodInfo rmi) + { + rmi.ThrowNoInvokeException(); + } + + Debug.Assert(_method is RuntimeConstructorInfo); + ((RuntimeConstructorInfo)_method).ThrowNoInvokeException(); + } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs index 547d90cf9daf6f..f03fac9bedf23e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs @@ -10,7 +10,7 @@ namespace System.Reflection { internal static partial class MethodInvokerCommon { - public static bool TryGetWellKnownSignatureFor0Args(InvokeSignatureInfo signatureInfo, [NotNullWhen(true)] out Delegate? func) + public static bool TryGetWellKnownSignatureFor0Args(in InvokeSignatureInfoKey signatureInfo, [NotNullWhen(true)] out Delegate? func) { Debug.Assert(signatureInfo.ParameterTypes.Length == 0); @@ -41,7 +41,7 @@ public static bool TryGetWellKnownSignatureFor0Args(InvokeSignatureInfo signatur return false; } - public static bool TryGetWellKnownSignatureFor1Arg(InvokeSignatureInfo signatureInfo, [NotNullWhen(true)] out Delegate? func) + public static bool TryGetWellKnownSignatureFor1Arg(in InvokeSignatureInfoKey signatureInfo, [NotNullWhen(true)] out Delegate? func) { Debug.Assert(signatureInfo.ParameterTypes.Length == 1); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index 01d05dfcdf710f..ecb0f55b332504 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -17,16 +17,51 @@ internal static partial class MethodInvokerCommon private static object? s_invokerFuncsLock; internal static void Initialize( - InvokeSignatureInfo signatureInfo, - out bool needsByRefStrategy, + bool isForArrayInput, + MethodBase method, + Type declaringType, + RuntimeType[] parameterTypes, + Type returnType, + out bool allocateObject, + out IntPtr functionPointer, + out Delegate invokeFunc, + out InvokerStrategy strategy, + out InvokerArgFlags[] invokerArgFlags) + { + functionPointer = method.MethodHandle.GetFunctionPointer(); + strategy = GetStrategy(parameterTypes, out invokerArgFlags); + + if (UseCalli(method)) + { + allocateObject = method is RuntimeConstructorInfo; + if (CanCache(method)) + { + // For constructors we allocate before calling invokeFunc so invokeFunc will be cacheable. + invokeFunc = GetOrCreateInvokeFunc(isForArrayInput, strategy, declaringType, parameterTypes, returnType, method.IsStatic); + } + else + { + InvokeSignatureInfoKey signatureInfo = new(declaringType, parameterTypes, returnType, method.IsStatic); + invokeFunc = CreateInvokeFunc(isForArrayInput, method: null, signatureInfo, strategy); + } + } + else + { + // Use Call\Callvirt\Newobj path. + allocateObject = false; + InvokeSignatureInfoKey signatureInfo = new(declaringType, parameterTypes, returnType, method.IsStatic); + invokeFunc = CreateInvokeFunc(isForArrayInput, method, signatureInfo, strategy); + } + } + + private static InvokerStrategy GetStrategy( + RuntimeType[] parameterTypes, out InvokerArgFlags[] invokerFlags) { - needsByRefStrategy = false; - ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; + bool needsByRefStrategy = false; int argCount = parameterTypes.Length; invokerFlags = new InvokerArgFlags[argCount]; - // Set invokerFlags[] and needsByRefStrategy. for (int i = 0; i < argCount; i++) { RuntimeType type = (RuntimeType)parameterTypes[i]; @@ -35,9 +70,14 @@ internal static void Initialize( type = (RuntimeType)type.GetElementType(); invokerFlags[i] |= InvokerArgFlags.IsValueType_ByRef_Or_Pointer; needsByRefStrategy = true; - if (type.IsNullableOfT) + if (type.IsValueType) { - invokerFlags[i] |= InvokerArgFlags.IsNullableOfT; + invokerFlags[i] |= InvokerArgFlags.IsByRefForValueType; + + if (type.IsNullableOfT) + { + invokerFlags[i] |= InvokerArgFlags.IsNullableOfT; + } } } @@ -59,50 +99,95 @@ internal static void Initialize( } } } + + return GetInvokerStrategy(argCount, needsByRefStrategy); } - public static InvokerStrategy GetInvokerStrategyForSpanInput(int argCount, bool needsByRefStrategy) + internal static bool UseCalli(MethodBase method) { - if (needsByRefStrategy) + Type declaringType = method.DeclaringType!; + + if (method is RuntimeConstructorInfo) { - return InvokerStrategy.RefMany; + // Constructors are not polymorphic but avoid calli for constructors that require initialization through newobj. + return !ReferenceEquals(declaringType, typeof(string)) && !declaringType.IsArray; } - return argCount <= 4 ? InvokerStrategy.Obj4 : InvokerStrategy.ObjSpan; + if (declaringType.IsValueType) + { + // For value types, calli is not supported for virtual methods (e.g. ToString()). + return !method.IsVirtual; + } + + // If not polymorphic and thus can be called with a calli instruction. + return !method.IsVirtual || declaringType.IsSealed || method.IsFinal; } - internal static Delegate CreateInvokeFunc(MethodBase? method, InvokeSignatureInfo signatureInfo, InvokerStrategy strategy, bool isForArrayInput, bool backwardsCompat) + internal static bool CanCache(MethodBase method) { - Delegate? invokeFunc; + return CanCacheDynamicMethod(method) && + !HasDefaultParameterValues(method); - if (!TryCreateWellKnownInvokeFunc(method, signatureInfo, strategy, out invokeFunc)) + static bool CanCacheDynamicMethod(MethodBase method) => + // The cache method's DeclaringType and other collectible parameters would be referenced. + !method.DeclaringType!.Assembly.IsCollectible && + // An instance method on a value type needs to be unbox which requires its type in IL, so caching would not be very sharable. + !(method.DeclaringType!.IsValueType && !method.IsStatic); + + // Supporting default values would increase cache memory usage and slow down the common case + // since the default values would have to be cached as well. + static bool HasDefaultParameterValues(MethodBase method) { - if (isForArrayInput) + ReadOnlySpan parameters = method.GetParametersAsSpan(); + + for (int i = 0; i < parameters.Length; i++) { - invokeFunc = strategy switch + if (parameters[i].HasDefaultValue) { - InvokerStrategy.Obj0 => CreateInvokeDelegate_Obj0Args(method, signatureInfo, backwardsCompat), - InvokerStrategy.Obj1 => CreateInvokeDelegate_Obj1Arg(method, signatureInfo, backwardsCompat), - InvokerStrategy.Obj4 or InvokerStrategy.ObjSpan => CreateInvokeDelegate_ObjSpanArgs(method, signatureInfo, backwardsCompat), - _ => CreateInvokeDelegate_RefArgs(method, signatureInfo, backwardsCompat) - }; + return true; + } } - else + + return false; + } + } + + private static InvokerStrategy GetInvokerStrategy(int argCount, bool needsByRefStrategy) + { + if (needsByRefStrategy) + { + return argCount <= 4 ? InvokerStrategy.Ref4 : InvokerStrategy.RefMany; + } + + return argCount switch + { + 0 => InvokerStrategy.Obj0, + 1 => InvokerStrategy.Obj1, + 2 or 3 or 4 => InvokerStrategy.Obj4, + _ => InvokerStrategy.ObjSpan + }; + } + + internal static Delegate CreateInvokeFunc(bool isForArrayInput, MethodBase? method, in InvokeSignatureInfoKey signatureInfo, InvokerStrategy strategy) + { + Delegate? invokeFunc; + bool backwardsCompat = isForArrayInput && method is not null; + + if (!TryCreateWellKnownInvokeFunc(method, signatureInfo, strategy, out invokeFunc)) + { + invokeFunc = strategy switch { - invokeFunc = strategy switch - { - InvokerStrategy.Obj0 => CreateInvokeDelegate_Obj0Args(method, signatureInfo, backwardsCompat), - InvokerStrategy.Obj1 => CreateInvokeDelegate_Obj1Arg(method, signatureInfo, backwardsCompat), - InvokerStrategy.Obj4 => CreateInvokeDelegate_Obj4Args(method, signatureInfo, backwardsCompat), - InvokerStrategy.ObjSpan => CreateInvokeDelegate_ObjSpanArgs(method, signatureInfo, backwardsCompat), - _ => CreateInvokeDelegate_RefArgs(method, signatureInfo, backwardsCompat) - }; - } + InvokerStrategy.Obj0 => CreateInvokeDelegate_Obj0Args(method, signatureInfo, backwardsCompat), + InvokerStrategy.Obj1 => CreateInvokeDelegate_Obj1Arg(method, signatureInfo, backwardsCompat), + InvokerStrategy.Obj4 => CreateInvokeDelegate_Obj4Args(method, signatureInfo, backwardsCompat), + InvokerStrategy.ObjSpan => CreateInvokeDelegate_ObjSpanArgs(method, signatureInfo, backwardsCompat), + _ => CreateInvokeDelegate_RefArgs(method, signatureInfo, backwardsCompat) + }; } return invokeFunc; - static bool TryCreateWellKnownInvokeFunc(MethodBase? method, InvokeSignatureInfo signatureInfo, InvokerStrategy strategy, [NotNullWhen(true)] out Delegate? wellKnown) + static bool TryCreateWellKnownInvokeFunc(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, InvokerStrategy strategy, [NotNullWhen(true)] out Delegate? wellKnown) { if (method is null) { @@ -123,59 +208,54 @@ static bool TryCreateWellKnownInvokeFunc(MethodBase? method, InvokeSignatureInfo } } - internal static bool CanCacheDynamicMethod(MethodBase method) => - // The cache method's DeclaringType and other collectible parameters would be referenced. - !method.IsCollectible && - // Value types need to be unboxed which requires its type, so a cached value would not be very sharable. - !(method.DeclaringType!.IsValueType && !method.IsStatic); - - /// - /// Determines if the method is not polymorphic and thus can be called with a calli instruction. - /// - internal static bool SupportsCalli(MethodBase method) - { - return method.IsStatic || - method.DeclaringType!.IsSealed || - method.IsFinal || - ( - method is ConstructorInfo && - // A string cannot be allocated with an uninitialized value, so we use NewObj. - !ReferenceEquals(method.DeclaringType, typeof(string)) - ); - } - internal static Delegate GetOrCreateInvokeFunc( - InvokeSignatureInfo signatureInfo, - InvokerStrategy strategy, bool isForArrayInput, - bool backwardsCompat) + InvokerStrategy strategy, + Type declaringType, + RuntimeType[] parameterTypes, + Type returnType, + bool isStatic) { - // Get the cached dynamic method. - Delegate invokeFunc = s_invokerFuncs[signatureInfo]; - if (invokeFunc is null) + InvokeSignatureInfoKey key = InvokeSignatureInfoKey.CreateNormalized(declaringType, parameterTypes, returnType, isStatic); + + int hashcode = key.AlternativeGetHashCode(); + Delegate invokeFunc; + unsafe + { + invokeFunc = s_invokerFuncs.GetValue(hashcode, key, &InvokeSignatureInfoKey.AlternativeEquals); + } + + if (invokeFunc is not null) + { + return invokeFunc; + } + + if (s_invokerFuncsLock is null) + { + Interlocked.CompareExchange(ref s_invokerFuncsLock!, new object(), null); + } + + // To minimize the lock scope, create the new delegate outside the lock even though it may not be used. + Delegate newInvokeFunc = CreateInvokeFunc(isForArrayInput, method: null, key, strategy); + bool lockTaken = false; + try { - if (s_invokerFuncsLock is null) + Monitor.Enter(s_invokerFuncsLock, ref lockTaken); + unsafe { - Interlocked.CompareExchange(ref s_invokerFuncsLock!, new object(), null); + invokeFunc = s_invokerFuncs.GetValue(hashcode, key, &InvokeSignatureInfoKey.AlternativeEquals); } - - bool lockTaken = false; - try + if (invokeFunc is null) { - Monitor.Enter(s_invokerFuncsLock, ref lockTaken); - invokeFunc = s_invokerFuncs[signatureInfo]; - if (invokeFunc is null) - { - invokeFunc = CreateInvokeFunc(method: null, signatureInfo, strategy, isForArrayInput, backwardsCompat); - s_invokerFuncs[signatureInfo] = invokeFunc; - } + s_invokerFuncs[InvokeSignatureInfo.Create(key)] = newInvokeFunc; + invokeFunc = newInvokeFunc; } - finally + } + finally + { + if (lockTaken) { - if (lockTaken) - { - Monitor.Exit(s_invokerFuncsLock); - } + Monitor.Exit(s_invokerFuncsLock); } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs index 4c24beb1a21fe1..8c2018491a05c8 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs @@ -130,7 +130,7 @@ internal void ThrowNoInvokeException() _ = Invoker.Strategy switch { MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, invokeAttr), - MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters![0], culture), + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters!, culture), @@ -162,7 +162,7 @@ public override object Invoke(BindingFlags invokeAttr, Binder? binder, object?[] return Invoker.Strategy switch { MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj: null, invokeAttr)!, - MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj: null, invokeAttr, binder, parameters![0], culture)!, + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj: null, invokeAttr, binder, parameters!, culture)!, MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj: null, invokeAttr, binder, parameters!, culture)!, MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj: null, invokeAttr, binder, parameters!, culture)!, MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj: null, invokeAttr, binder, parameters!, culture)!, diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs index 53ca4ffb3b714a..8cead1e1636c88 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs @@ -123,7 +123,7 @@ internal void ThrowNoInvokeException() return Invoker.Strategy switch { MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, invokeAttr), - MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters![0], culture), + MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters!, culture), diff --git a/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorCommonTests.cs b/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorCommonTests.cs index 5c71f79da014c1..beb6966f87774b 100644 --- a/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorCommonTests.cs +++ b/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorCommonTests.cs @@ -118,6 +118,14 @@ public void Invoke_ParameterWrongType_ThrowsArgumentException() AssertExtensions.Throws(null, () => (ClassWith3Constructors)Invoke(constructors[1], new object[] { "hello" })); } + [Fact] + public void Invoke_String() + { + ConstructorInfo c = typeof(string).GetConstructor(BindingFlags.Public | BindingFlags.Instance, new Type[] { typeof(char[]), typeof(int), typeof(int) }); + string s = (string)Invoke(c, new object[] { "Hello".ToCharArray(), 0, 5 }); + Assert.Equal("Hello", s); + } + [Fact] public void Invoke_ExistingInstance() { diff --git a/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs b/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs index f5313bde579844..cd9a61af207aeb 100644 --- a/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs +++ b/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs @@ -77,6 +77,96 @@ public void Args_5() Assert.Equal("12345", ((TestClass)invoker.Invoke(new Span(new object[] { "1", "2", "3", "4", "5" })))._args); } + [Fact] + public void Args_ByRef1() + { + string argValue = "Value"; + ConstructorInvoker invoker = ConstructorInvoker.Create(typeof(TestClass).GetConstructor( + new Type[] { typeof(string).MakeByRefType() })); + + // Although no copy-back, verify we can call. + TestClass obj = (TestClass)invoker.Invoke(argValue); + Assert.Equal("Value", obj._args); + + // The Span version supports copy-back. + object[] args = new object[] { argValue }; + invoker.Invoke(new Span(args)); + Assert.Equal("Hello1", args[0]); + } + + [Fact] + public void Args_ByRef2() + { + string argValue = "Value"; + ConstructorInvoker invoker = ConstructorInvoker.Create(typeof(TestClass).GetConstructor( + new Type[] { typeof(string).MakeByRefType(), typeof(string).MakeByRefType() })); + + // Although no copy-back, verify we can call. + TestClass obj = (TestClass)invoker.Invoke(argValue, argValue); + Assert.Equal("ValueValue", obj._args); + + // The Span version supports copy-back. + object[] args = new object[] { argValue, argValue }; + invoker.Invoke(new Span(args)); + Assert.Equal("Hello1", args[0]); + Assert.Equal("Hello2", args[1]); + } + + [Fact] + public void Args_ByRef3() + { + string argValue = "Value"; + ConstructorInvoker invoker = ConstructorInvoker.Create(typeof(TestClass).GetConstructor( + new Type[] { typeof(string).MakeByRefType(), typeof(string).MakeByRefType(), typeof(string).MakeByRefType() })); + + // Although no copy-back, verify we can call. + TestClass obj = (TestClass)invoker.Invoke(argValue, argValue, argValue); + Assert.Equal("ValueValueValue", obj._args); + + // The Span version supports copy-back. + object[] args = new object[] { argValue, argValue, argValue }; + invoker.Invoke(new Span(args)); + Assert.Equal("Hello1", args[0]); + Assert.Equal("Hello2", args[1]); + Assert.Equal("Hello3", args[2]); + } + + [Fact] + public void Args_ByRef4() + { + string argValue = "Value"; + ConstructorInvoker invoker = ConstructorInvoker.Create(typeof(TestClass).GetConstructor( + new Type[] { typeof(string).MakeByRefType(), typeof(string).MakeByRefType(), typeof(string).MakeByRefType(), typeof(string).MakeByRefType() })); + + // Although no copy-back, verify we can call. + TestClass obj = (TestClass)invoker.Invoke(argValue, argValue, argValue, argValue); + Assert.Equal("ValueValueValueValue", obj._args); + + // The Span version supports copy-back. + object[] args = new object[] { argValue, argValue, argValue, argValue }; + invoker.Invoke(new Span(args)); + Assert.Equal("Hello1", args[0]); + Assert.Equal("Hello2", args[1]); + Assert.Equal("Hello3", args[2]); + Assert.Equal("Hello4", args[3]); + } + + [Fact] + public void Args_ByRef5() + { + string argValue = "Value"; + ConstructorInvoker invoker = ConstructorInvoker.Create(typeof(TestClass).GetConstructor( + new Type[] { typeof(string).MakeByRefType(), typeof(string).MakeByRefType(), typeof(string).MakeByRefType(), typeof(string).MakeByRefType(), typeof(string).MakeByRefType() })); + + object[] args = new object[] { argValue, argValue, argValue, argValue, argValue }; + invoker.Invoke(new Span(args)); + Assert.Equal("Hello1", args[0]); + Assert.Equal("Hello2", args[1]); + Assert.Equal("Hello3", args[2]); + Assert.Equal("Hello4", args[3]); + Assert.Equal("Hello5", args[4]); + } + [Fact] public void Args_0_Extra_Throws() { @@ -192,6 +282,46 @@ private class TestClass public void SomeMethod() { } + public TestClass(ref string arg1) + { + _args = arg1; + arg1 = "Hello1"; + } + + public TestClass(ref string arg1, ref string arg2) + { + _args = arg1 + arg2; + arg1 = "Hello1"; + arg2 = "Hello2"; + } + + public TestClass(ref string arg1, ref string arg2, ref string arg3) + { + _args = arg1 + arg2 + arg3; + arg1 = "Hello1"; + arg2 = "Hello2"; + arg3 = "Hello3"; + } + + public TestClass(ref string arg1, ref string arg2, ref string arg3, ref string arg4) + { + _args = arg1 + arg2 + arg3 + arg4; + arg1 = "Hello1"; + arg2 = "Hello2"; + arg3 = "Hello3"; + arg4 = "Hello4"; + } + + public TestClass(ref string arg1, ref string arg2, ref string arg3, ref string arg4, ref string arg5) + { + _args = arg1 + arg2 + arg3 + arg4 + arg5; + arg1 = "Hello1"; + arg2 = "Hello2"; + arg3 = "Hello3"; + arg4 = "Hello4"; + arg5 = "Hello5"; + } + public TestClass(string arg1) { _args = arg1; diff --git a/src/libraries/System.Runtime/tests/System.Reflection.Tests/MethodInvokerTests.cs b/src/libraries/System.Runtime/tests/System.Reflection.Tests/MethodInvokerTests.cs index 94d701507eac1d..d8b648750b294e 100644 --- a/src/libraries/System.Runtime/tests/System.Reflection.Tests/MethodInvokerTests.cs +++ b/src/libraries/System.Runtime/tests/System.Reflection.Tests/MethodInvokerTests.cs @@ -138,22 +138,90 @@ public void Args_Span_NotEnoughArgs_Throws() } [Fact] - public void Args_ByRef() + public void Args_ByRef1() { + object obj = new TestClass(); string argValue = "Value"; - MethodInvoker invoker = MethodInvoker.Create(typeof(TestClass).GetMethod(nameof(TestClass.Args_ByRef))); + MethodInvoker invoker = MethodInvoker.Create(typeof(TestClass).GetMethod(nameof(TestClass.RefArgs_1))); // Although no copy-back, verify we can call. - Assert.Equal("Hello", invoker.Invoke(obj: null, argValue)); + Assert.Equal(1, invoker.Invoke(obj, argValue)); // The Span version supports copy-back. object[] args = new object[] { argValue }; - invoker.Invoke(obj: null, new Span(args)); - Assert.Equal("Hello", args[0]); + invoker.Invoke(obj, new Span(args)); + Assert.Equal("Hello1", args[0]); + } - args[0] = null; - invoker.Invoke(obj: null, new Span(args)); - Assert.Equal("Hello", args[0]); + [Fact] + public void Args_ByRef2() + { + object obj = new TestClass(); + string argValue = "Value"; + MethodInvoker invoker = MethodInvoker.Create(typeof(TestClass).GetMethod(nameof(TestClass.RefArgs_2))); + + // Although no copy-back, verify we can call. + Assert.Equal(2, invoker.Invoke(obj, argValue, argValue)); + + // The Span version supports copy-back. + object[] args = new object[] { argValue, argValue }; + invoker.Invoke(obj, new Span(args)); + Assert.Equal("Hello1", args[0]); + Assert.Equal("Hello2", args[1]); + } + + [Fact] + public void Args_ByRef3() + { + object obj = new TestClass(); + string argValue = "Value"; + MethodInvoker invoker = MethodInvoker.Create(typeof(TestClass).GetMethod(nameof(TestClass.RefArgs_3))); + + // Although no copy-back, verify we can call. + Assert.Equal(3, invoker.Invoke(obj, argValue, argValue, argValue)); + + // The Span version supports copy-back. + object[] args = new object[] { argValue, argValue, argValue }; + invoker.Invoke(obj, new Span(args)); + Assert.Equal("Hello1", args[0]); + Assert.Equal("Hello2", args[1]); + Assert.Equal("Hello3", args[2]); + } + + [Fact] + public void Args_ByRef4() + { + object obj = new TestClass(); + string argValue = "Value"; + MethodInvoker invoker = MethodInvoker.Create(typeof(TestClass).GetMethod(nameof(TestClass.RefArgs_4))); + + // Although no copy-back, verify we can call. + Assert.Equal(4, invoker.Invoke(obj, argValue, argValue, argValue, argValue)); + + // The Span version supports copy-back. + object[] args = new object[] { argValue, argValue, argValue, argValue }; + invoker.Invoke(obj, new Span(args)); + Assert.Equal("Hello1", args[0]); + Assert.Equal("Hello2", args[1]); + Assert.Equal("Hello3", args[2]); + Assert.Equal("Hello4", args[3]); + } + + [Fact] + public void Args_ByRef5() + { + object obj = new TestClass(); + string argValue = "Value"; + MethodInvoker invoker = MethodInvoker.Create(typeof(TestClass).GetMethod(nameof(TestClass.RefArgs_5))); + + // The Span version supports copy-back. + object[] args = new object[] { argValue, argValue, argValue, argValue, argValue }; + invoker.Invoke(obj, new Span(args)); + Assert.Equal("Hello1", args[0]); + Assert.Equal("Hello2", args[1]); + Assert.Equal("Hello3", args[2]); + Assert.Equal("Hello4", args[3]); + Assert.Equal("Hello5", args[4]); } [Fact] @@ -308,10 +376,44 @@ private class TestClass public static string Args_4(string arg1, string arg2, string arg3, string arg4) => arg1 + arg2 + arg3 + arg4; public static string Args_5(string arg1, string arg2, string arg3, string arg4, string arg5) => arg1 + arg2 + arg3 + arg4 + arg5; - public static string Args_ByRef(ref string arg) + public int RefArgs_1(ref string arg1) + { + arg1 = "Hello1"; + return 1; + } + + public int RefArgs_2(ref string arg1, ref string arg2) + { + arg1 = "Hello1"; + arg2 = "Hello2"; + return 2; + } + + public int RefArgs_3(ref string arg1, ref string arg2, ref string arg3) + { + arg1 = "Hello1"; + arg2 = "Hello2"; + arg3 = "Hello3"; + return 3; + } + + public int RefArgs_4(ref string arg1, ref string arg2, ref string arg3, ref string arg4) + { + arg1 = "Hello1"; + arg2 = "Hello2"; + arg3 = "Hello3"; + arg4 = "Hello4"; + return 4; + } + + public int RefArgs_5(ref string arg1, ref string arg2, ref string arg3, ref string arg4, ref string arg5) { - arg = "Hello"; - return arg; + arg1 = "Hello1"; + arg2 = "Hello2"; + arg3 = "Hello3"; + arg4 = "Hello4"; + arg5 = "Hello5"; + return 5; } public static unsafe void Args_ByPointer(int* arg) diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/BindingFlagsDoNotWrap.cs b/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/BindingFlagsDoNotWrap.cs index 1f03bebb2ee3ae..5169a7c32e97bd 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/BindingFlagsDoNotWrap.cs +++ b/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/BindingFlagsDoNotWrap.cs @@ -39,14 +39,6 @@ public static void ConstructorInvokeStringCtor() TestDoNotWrap((bf) => c.Invoke(bf, null, new object[] { null, 0, 0 }, null)); } - [Fact] - public static void ConstructorInvokeStringCtor_Success() - { - ConstructorInfo c = typeof(string).GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, new Type[] { typeof(char[]), typeof(int), typeof(int) }, null); - string s = (string)c.Invoke(default, null, new object[] { "Hello".ToCharArray(), 0, 5 }, null); - Assert.Equal("Hello", s); - } - [Fact] public static void ConstructorInvokeStringCtorTwoArgs() { @@ -54,14 +46,6 @@ public static void ConstructorInvokeStringCtorTwoArgs() TestDoNotWrap((bf) => c.Invoke(bf, null, new object[] { null, 0, 0 }, null)); } - [Fact] - public static void ConstructorInvokeStringCtorTwoArgs_Success() - { - ConstructorInfo c = typeof(string).GetConstructor(BindingFlags.Public | BindingFlags.Instance, new Type[] { typeof(char[]), typeof(int), typeof(int) }); - string s = (string)c.Invoke(invokeAttr: default, null, new object[] { "Hello".ToCharArray(), 0, 5 }, null); - Assert.Equal("Hello", s); - } - [Fact] public static void ConstructorInvokeUsingMethodInfoInvoke() { From 34d9669b457b69bf5bab649583b2602fbe206d02 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Thu, 14 Nov 2024 17:31:29 -0600 Subject: [PATCH 06/24] Add more well-known signatures --- .../System/Reflection/InvokeSignatureInfo.cs | 86 +++++---- ...MethodInvokerCommon.WellKnownSignatures.cs | 168 ++++++++++++++++-- 2 files changed, 212 insertions(+), 42 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs index cc3fb5af624ec4..12dc919637f55e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using static System.Reflection.MethodBase; namespace System.Reflection @@ -14,13 +15,13 @@ internal sealed class InvokeSignatureInfo internal readonly Type _returnType; internal readonly bool _isStatic; - public static InvokeSignatureInfo Create(in InvokeSignatureInfoKey InvokeSignatureInfoKey) + public static InvokeSignatureInfo Create(in InvokeSignatureInfoKey key) { return new InvokeSignatureInfo( - InvokeSignatureInfoKey._declaringType, - InvokeSignatureInfoKey._parameterTypes, - InvokeSignatureInfoKey._returnType, - InvokeSignatureInfoKey._isStatic); + key._declaringType, + key._parameterTypes, + key._returnType, + key._isStatic); } public InvokeSignatureInfo(Type declaringType, Type[] parameterTypes, Type returnType, bool isStatic) @@ -97,9 +98,9 @@ internal readonly ref struct InvokeSignatureInfoKey public static InvokeSignatureInfoKey CreateNormalized(Type declaringType, Type[] parameterTypes, Type returnType, bool isStatic) { return new InvokeSignatureInfoKey( - isStatic ? typeof(void) : NormalizeType(declaringType), + isStatic ? typeof(void) : MakeNormalized(declaringType), GetNormalizedParameterTypes(parameterTypes), - NormalizeType(returnType), + MakeNormalized(returnType), isStatic); } @@ -137,10 +138,7 @@ public static bool AlternativeEquals(in InvokeSignatureInfoKey @this, InvokeSign return true; } - public int AlternativeGetHashCode() => InvokeSignatureInfo.GetHashCode( - _declaringType, - _parameterTypes, - _returnType); + public int AlternativeGetHashCode() => InvokeSignatureInfo.GetHashCode(_declaringType, _parameterTypes, _returnType); /// /// Return an array of normalized types for a calli signature. @@ -156,40 +154,64 @@ private static Type[] GetNormalizedParameterTypes(Type[] parameterTypes) Type[]? normalizedParameterTypes = null; - // Check if we can re-use the existing array if it is already normalized. for (int i = 0; i < parameterTypes.Length; i++) { - if (!IsNormalized(parameterTypes[i])) + // Check if we can re-use the existing array if it is already normalized. + if (TryMakeNormalized(parameterTypes[i], out Type normalizedType)) { + // Once we found a type that needs normalization, we need to create a new array + // and copy the normalized types into it. normalizedParameterTypes = new Type[parameterTypes.Length]; + for (int j = 0; j < i; j++) + { + normalizedParameterTypes[j] = parameterTypes[j]; + } + + normalizedParameterTypes[i] = normalizedType; + + for (int j = i + 1; j < parameterTypes.Length; j++) + { + normalizedParameterTypes[j] = MakeNormalized(parameterTypes[j]); + } + break; } } - if (normalizedParameterTypes is null) - { - return parameterTypes; - } + return normalizedParameterTypes is null ? parameterTypes : normalizedParameterTypes; + } - for (int i = 0; i < parameterTypes.Length; i++) + /// + /// Normalize the type for a calli signature. + /// + private static bool TryMakeNormalized(Type type, out Type normalizedType) + { + // Todo:We can't normalize enums since the type would be lost. + //if (type.IsEnum) + //{ + // normalizedType = type.GetEnumUnderlyingType(); + // return true; + //} + + if (type.IsValueType || + type.IsByRef || + type.IsPointer || + type.IsFunctionPointer) { - normalizedParameterTypes[i] = NormalizeType(parameterTypes[i]); + // These can't be normalized. + normalizedType = type; + return false; } - return normalizedParameterTypes; + // All other reference types are normalized to object. + normalizedType = typeof(object); + return true; } - /// - /// Normalize the type for a calli signature. - /// - private static Type NormalizeType(Type type) => IsNormalized(type) ? type : typeof(object); - - private static bool IsNormalized(Type type) => - type == typeof(object) || - type == typeof(void) || - type.IsValueType || - type.IsByRef || - type.IsPointer || - type.IsFunctionPointer; + private static Type MakeNormalized(Type type) + { + TryMakeNormalized(type, out Type normalizedType); + return normalizedType; + } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs index f03fac9bedf23e..70c2f76bb3f7bd 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs @@ -14,9 +14,10 @@ public static bool TryGetWellKnownSignatureFor0Args(in InvokeSignatureInfoKey si { Debug.Assert(signatureInfo.ParameterTypes.Length == 0); + func = null!; + if (signatureInfo.DeclaringType != typeof(object)) { - func = null!; return false; } @@ -26,28 +27,98 @@ public static bool TryGetWellKnownSignatureFor0Args(in InvokeSignatureInfoKey si { func = new InvokeFunc_Obj0Args(CallInstanceVoid); } + else if (returnType == typeof(bool)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(byte)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(char)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(DateTime)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(DateTimeOffset)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(decimal)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(double)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(float)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(Guid)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } else if (returnType == typeof(int)) { func = new InvokeFunc_Obj0Args(CallInstanceAny); } + else if (returnType == typeof(IntPtr)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(long)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } else if (returnType == typeof(object)) { func = new InvokeFunc_Obj0Args(CallInstanceAny); } + else if (returnType == typeof(short)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(sbyte)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(string)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(ushort)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(uint)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(UIntPtr)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } + else if (returnType == typeof(ulong)) + { + func = new InvokeFunc_Obj0Args(CallInstanceAny); + } - // todo: add more types - - func = null!; - return false; + return func != null; } public static bool TryGetWellKnownSignatureFor1Arg(in InvokeSignatureInfoKey signatureInfo, [NotNullWhen(true)] out Delegate? func) { Debug.Assert(signatureInfo.ParameterTypes.Length == 1); + func = null!; + if (signatureInfo.DeclaringType != typeof(object) || signatureInfo.ReturnType != typeof(void)) { - func = null!; return false; } @@ -60,11 +131,88 @@ public static bool TryGetWellKnownSignatureFor1Arg(in InvokeSignatureInfoKey sig { func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); } + else if (arg1Type == typeof(bool)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(byte)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(char)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(DateTime)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(DateTimeOffset)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(decimal)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(double)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(float)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(Guid)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(int)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(IntPtr)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(long)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(object)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(short)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(sbyte)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(string)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(ushort)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(uint)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(UIntPtr)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } + else if (arg1Type == typeof(ulong)) + { + func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + } - // todo: add more types - - func = null!; - return false; + return func != null; } private static unsafe object? CallInstanceVoid(object? obj, IntPtr functionPointer) { ((delegate* managed)functionPointer)(obj); return null; } From e57a58cf3ac6993521665e4e88a84b1bb6a24d3e Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Sat, 16 Nov 2024 10:16:13 -0600 Subject: [PATCH 07/24] Initial mono; keep interpreted path --- .../System.Private.CoreLib.csproj | 1 + .../Reflection/ConstructorInvoker.CoreCLR.cs | 26 ++ .../Reflection/Emit/DynamicMethod.CoreCLR.cs | 4 +- .../Reflection/MethodBaseInvoker.CoreCLR.cs | 39 +++ .../Reflection/MethodInvoker.CoreCLR.cs | 30 ++ .../Reflection/MethodInvokerCommon.CoreCLR.cs | 14 + .../RuntimeConstructorInfo.CoreCLR.cs | 2 +- .../Reflection/RuntimeMethodInfo.CoreCLR.cs | 2 +- .../src/System/RuntimeType.CoreCLR.cs | 185 ------------- src/coreclr/vm/reflectioninvocation.cpp | 49 +++- .../System.Private.CoreLib.Shared.projitems | 1 + .../src/System/Reflection/CerHashtable.cs | 191 +++++++++++++ .../System/Reflection/ConstructorInvoker.cs | 54 ++-- .../System/Reflection/InvokeSignatureInfo.cs | 7 - .../src/System/Reflection/InvokerEmitUtil.cs | 12 +- .../System/Reflection/MethodBaseInvoker.cs | 82 +++--- .../src/System/Reflection/MethodInvoker.cs | 13 +- ...MethodInvokerCommon.WellKnownSignatures.cs | 262 +++++------------- .../System/Reflection/MethodInvokerCommon.cs | 123 ++++---- .../Reflection/RuntimeConstructorInfo.cs | 4 +- .../System/Reflection/RuntimeMethodInfo.cs | 2 +- .../ConstructorInfoTests.cs | 3 +- .../ConstructorInvokerTests.cs | 5 +- .../System.Private.CoreLib.csproj | 1 + .../Reflection/ConstructorInvoker.Mono.cs | 23 +- .../Reflection/MethodBaseInvoker.Mono.cs | 34 ++- .../System/Reflection/MethodInvoker.Mono.cs | 29 +- .../Reflection/MethodInvokerCommon.Mono.cs | 12 + .../Reflection/RuntimeMethodInfo.Mono.cs | 22 +- 29 files changed, 656 insertions(+), 576 deletions(-) create mode 100644 src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.CoreCLR.cs create mode 100644 src/libraries/System.Private.CoreLib/src/System/Reflection/CerHashtable.cs create mode 100644 src/mono/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.Mono.cs diff --git a/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj index f4109a290f9206..6a611625d15c5f 100644 --- a/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj +++ b/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj @@ -179,6 +179,7 @@ + diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs index 00dc216baa645f..02cc575715e13e 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs @@ -1,9 +1,35 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using static System.Reflection.InvokerEmitUtil; +using static System.Reflection.MethodBase; +using static System.RuntimeType; + namespace System.Reflection { public partial class ConstructorInvoker { + private readonly CreateUninitializedCache? _allocator; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private object CreateUninitializedObject() => _allocator!.CreateUninitializedObject(_declaringType); + + private bool ShouldAllocate => _allocator is not null; + + private unsafe Delegate CreateInvokeDelegateForInterpreted() + { + Debug.Assert(MethodInvokerCommon.UseInterpretedPath); + Debug.Assert(_strategy == InvokerStrategy.Ref4 || _strategy == InvokerStrategy.RefMany); + + return (InvokeFunc_RefArgs)InterpretedInvoke; + } + + private unsafe object? InterpretedInvoke(object? obj, IntPtr _, IntPtr* args) + { + return RuntimeMethodHandle.InvokeMethod(obj, (void**)args, _method.Signature, isConstructor: obj is null); + } } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs index 8bd448e5c67515..4f2ded1f1d6a49 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs @@ -90,7 +90,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - return _invoker ??= new MethodBaseInvoker(this, DeclaringType!, Signature.Arguments, ReturnType); + return _invoker ??= new MethodBaseInvoker(this, Signature.Arguments, ReturnType); } } @@ -135,7 +135,7 @@ Signature LazyCreateSignature() object? retValue = Invoker.Strategy switch { - MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, invokeAttr), + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWithNoArgs(obj, invokeAttr), MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs index 6db7675907b581..ec4bb4fa72e99c 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs @@ -1,11 +1,50 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics; using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using static System.Reflection.InvokerEmitUtil; +using static System.Reflection.MethodBase; +using static System.RuntimeType; namespace System.Reflection { internal partial class MethodBaseInvoker { + private readonly CreateUninitializedCache? _allocator; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private object CreateUninitializedObject() => _allocator!.CreateUninitializedObject(_declaringType); + + private bool ShouldAllocate => _allocator is not null; + + private unsafe Delegate CreateInvokeDelegateForInterpreted() + { + Debug.Assert(MethodInvokerCommon.UseInterpretedPath); + Debug.Assert(_strategy == InvokerStrategy.Ref4 || _strategy == InvokerStrategy.RefMany); + + if (_method is RuntimeMethodInfo) + { + return (InvokeFunc_RefArgs)InterpretedInvoke_Method; + } + + if (_method is RuntimeConstructorInfo) + { + return (InvokeFunc_RefArgs)InterpretedInvoke_Constructor; + } + + Debug.Assert(_method is DynamicMethod); + return (InvokeFunc_RefArgs)InterpretedInvoke_DynamicMethod; + } + + private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr _, IntPtr* args) => + RuntimeMethodHandle.InvokeMethod(obj, (void**)args, ((RuntimeMethodInfo)_method).Signature, isConstructor: false); + + private unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr _, IntPtr* args) => + RuntimeMethodHandle.InvokeMethod(obj, (void**)args, ((RuntimeConstructorInfo)_method).Signature, isConstructor: obj is null); + + private unsafe object? InterpretedInvoke_DynamicMethod(object? obj, IntPtr _, IntPtr* args) => + RuntimeMethodHandle.InvokeMethod(obj, (void**)args, ((DynamicMethod)_method).Signature, isConstructor: false); } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs index 966e47bdba9e87..5d9c06299639ae 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvoker.CoreCLR.cs @@ -1,11 +1,41 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics; using System.Reflection.Emit; +using static System.Reflection.InvokerEmitUtil; +using static System.Reflection.MethodBase; namespace System.Reflection { public partial class MethodInvoker { + private unsafe Delegate CreateInvokeDelegateForInterpreted() + { + Debug.Assert(MethodInvokerCommon.UseInterpretedPath); + Debug.Assert(_strategy == InvokerStrategy.Ref4 || _strategy == InvokerStrategy.RefMany); + + if (_method is RuntimeMethodInfo) + { + return (InvokeFunc_RefArgs)InterpretedInvoke_Method; + } + + if (_method is RuntimeConstructorInfo) + { + return (InvokeFunc_RefArgs)InterpretedInvoke_Constructor; + } + + Debug.Assert(_method is DynamicMethod); + return (InvokeFunc_RefArgs)InterpretedInvoke_DynamicMethod; + } + + private unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr _, IntPtr* args) => + RuntimeMethodHandle.InvokeMethod(obj, (void**)args, ((RuntimeConstructorInfo)_method).Signature, isConstructor: obj is null); + + private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr _, IntPtr* args) => + RuntimeMethodHandle.InvokeMethod(obj, (void**)args, ((RuntimeMethodInfo)_method).Signature, isConstructor: false); + + private unsafe object? InterpretedInvoke_DynamicMethod(object? obj, IntPtr _, IntPtr* args) => + RuntimeMethodHandle.InvokeMethod(obj, (void**)args, ((DynamicMethod)_method).Signature, isConstructor: false); } } diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.CoreCLR.cs new file mode 100644 index 00000000000000..e00439484be24a --- /dev/null +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.CoreCLR.cs @@ -0,0 +1,14 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Runtime.CompilerServices; + +namespace System.Reflection +{ + internal static partial class MethodInvokerCommon + { + // For CoreClr, we may be able to remove the interpreted path; it is not used in the CoreCLR implementation + // unless the feature switch is enabled. Unlike Mono, there are no interpreted-only platforms. + internal static bool UseInterpretedPath => LocalAppContextSwitches.ForceInterpretedInvoke || !RuntimeFeature.IsDynamicCodeSupported; + } +} diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs index f3c0cba2882ada..1ef2c045bb60f6 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.CoreCLR.cs @@ -52,7 +52,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - return m_invoker ??= new MethodBaseInvoker(this, DeclaringType!, ArgumentTypes, GetReturnType()); + return m_invoker ??= new MethodBaseInvoker(this, ArgumentTypes, GetReturnType()); } } #endregion diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs index 5cf292f047b254..3b2c8eabab0f2f 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs @@ -51,7 +51,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - return m_invoker ??= new MethodBaseInvoker(this, DeclaringType!, ArgumentTypes, ReturnType); + return m_invoker ??= new MethodBaseInvoker(this, ArgumentTypes, ReturnType); } } #endregion diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs index 322473919728c7..074c7a0c015cd9 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs @@ -4368,188 +4368,3 @@ public override string ToString() } #endregion } - -namespace System.Reflection -{ - // Reliable hashtable thread safe for multiple readers and single writer. Note that the reliability goes together with thread - // safety. Thread safety for multiple readers requires atomic update of the state that also makes the table - // reliable in the presence of asynchronous exceptions. - internal struct CerHashtable where K : class - { - private sealed class Table - { - // Note that m_keys and m_values arrays are immutable to allow lock-free reads. A new instance - // of CerHashtable has to be allocated to grow the size of the hashtable. - internal K[] m_keys; - internal V[] m_values; - internal int m_count; - - internal Table(int size) - { - size = HashHelpers.GetPrime(size); - m_keys = new K[size]; - m_values = new V[size]; - } - - internal void Insert(K key, V value) - { - int hashcode = GetHashCodeHelper(key); - if (hashcode < 0) - hashcode = ~hashcode; - - K[] keys = m_keys; - int index = hashcode % keys.Length; - - while (true) - { - K hit = keys[index]; - - if (hit == null) - { - m_count++; - m_values[index] = value; - - // This volatile write has to be last. It is going to publish the result atomically. - // - // Note that incrementing the count or setting the value does not do any harm without setting the key. The inconsistency will be ignored - // and it will go away completely during next rehash. - Volatile.Write(ref keys[index], key); - - break; - } - else - { - Debug.Assert(!hit.Equals(key), "Key was already in CerHashtable! Potential race condition (or bug) in the Reflection cache?"); - - index++; - if (index >= keys.Length) - index -= keys.Length; - } - } - } - } - - private Table m_Table; - - private const int MinSize = 7; - - private static int GetHashCodeHelper(K key) - { - // For strings we don't want the key to differ across domains as CerHashtable might be shared. - if (key is not string sKey) - { - return key.GetHashCode(); - } - else - { - return sKey.GetNonRandomizedHashCode(); - } - } - - private void Rehash(int newSize) - { - Table newTable = new Table(newSize); - - Table oldTable = m_Table; - if (oldTable != null) - { - K[] keys = oldTable.m_keys; - V[] values = oldTable.m_values; - - for (int i = 0; i < keys.Length; i++) - { - K key = keys[i]; - - if (key != null) - { - newTable.Insert(key, values[i]); - } - } - } - - // Publish the new table atomically - Volatile.Write(ref m_Table, newTable); - } - - internal V this[K key] - { - get - { - Table table = Volatile.Read(ref m_Table); - if (table == null) - return default!; - - int hashcode = GetHashCodeHelper(key); - if (hashcode < 0) - hashcode = ~hashcode; - - K[] keys = table.m_keys; - int index = hashcode % keys.Length; - - while (true) - { - // This volatile read has to be first. It is reading the atomically published result. - K hit = Volatile.Read(ref keys[index]); - - if (hit != null) - { - if (hit.Equals(key)) - return table.m_values[index]; - - index++; - if (index >= keys.Length) - index -= keys.Length; - } - else - { - return default!; - } - } - } - set - { - Table table = m_Table; - - if (table != null) - { - int requiredSize = 2 * (table.m_count + 1); - if (requiredSize >= table.m_keys.Length) - Rehash(requiredSize); - } - else - { - Rehash(MinSize); - } - - m_Table.Insert(key, value); - } - } - - public unsafe V GetValue(int hashcode, in TAlternativeKey alternative, delegate* equals) where TAlternativeKey : allows ref struct - { - Table table = m_Table; - if (table is null) - return default!; - if (hashcode < 0) - hashcode = ~hashcode; - K[] keys = table.m_keys; - int index = hashcode % keys.Length; - while (true) - { - K hit = Volatile.Read(ref keys[index]); - if (hit != null) - { - if (equals(alternative, hit)) - return table.m_values[index]; - index++; - if (index >= keys.Length) - index -= keys.Length; - } - else - { - return default!; - } - } - } - } -} diff --git a/src/coreclr/vm/reflectioninvocation.cpp b/src/coreclr/vm/reflectioninvocation.cpp index 7d3651dcfe1147..c681e2b9763666 100644 --- a/src/coreclr/vm/reflectioninvocation.cpp +++ b/src/coreclr/vm/reflectioninvocation.cpp @@ -316,6 +316,25 @@ FCIMPL4(Object*, RuntimeMethodHandle::InvokeMethod, BOOL fCtorOfVariableSizedObject = FALSE; + if (FC_ACCESS_BOOL(fConstructor)) + { + // If we are invoking a constructor on an array then we must + // handle this specially. + if (ownerType.IsArray()) { + gc.retVal = InvokeArrayConstructor(ownerType, + args, + gc.pSig->NumFixedArgs()); + goto Done; + } + + // Variable sized objects, like String instances, allocate themselves + // so they are a special case. + MethodTable * pMT = ownerType.AsMethodTable(); + fCtorOfVariableSizedObject = pMT->HasComponentSize(); + if (!fCtorOfVariableSizedObject) + gc.retVal = pMT->Allocate(); + } + { ArgIteratorForMethodInvoke argit(&gc.pSig, fCtorOfVariableSizedObject); @@ -404,7 +423,17 @@ FCIMPL4(Object*, RuntimeMethodHandle::InvokeMethod, if (!pMeth->IsStatic() && !fCtorOfVariableSizedObject) { PVOID pThisPtr; - if (!pMeth->GetMethodTable()->IsValueType()) + if (FC_ACCESS_BOOL(fConstructor)) + { + // Copy "this" pointer: only unbox if type is value type and method is not unboxing stub + if (ownerType.IsValueType() && !pMeth->IsUnboxingStub()) { + // Note that we create a true boxed nullabe and then convert it to a T below + pThisPtr = gc.retVal->GetData(); + } + else + pThisPtr = OBJECTREFToObject(gc.retVal); + } + else if (!pMeth->GetMethodTable()->IsValueType()) pThisPtr = OBJECTREFToObject(gc.target); else { if (pMeth->IsUnboxingStub()) @@ -516,6 +545,19 @@ FCIMPL4(Object*, RuntimeMethodHandle::InvokeMethod, CallDescrWorkerWithHandler(&callDescrData); // It is still illegal to do a GC here. The return type might have/contain GC pointers. + if (FC_ACCESS_BOOL(fConstructor)) + { + // We have a special case for Strings...The object is returned... + if (fCtorOfVariableSizedObject) { + PVOID pReturnValue = &callDescrData.returnValue; + gc.retVal = *(OBJECTREF *)pReturnValue; + } + + // If it is a Nullable, box it using Nullable conventions. + // TODO: this double allocates on constructions which is wasteful + gc.retVal = Nullable::NormalizeBox(gc.retVal); + } + else if (hasValueTypeReturn || hasRefReturnAndNeedsBoxing) { _ASSERTE(gc.retVal != NULL); @@ -565,10 +607,6 @@ FCIMPL4(Object*, RuntimeMethodHandle::InvokeMethod, gc.retVal = InvokeUtil::CreateObjectAfterInvoke(refReturnTargetTH, pReturnedReference); } - else if (fConstructor) - { - gc.retVal = ObjectToOBJECTREF(target); - } else { gc.retVal = InvokeUtil::CreateObjectAfterInvoke(retTH, &callDescrData.returnValue); @@ -579,6 +617,7 @@ FCIMPL4(Object*, RuntimeMethodHandle::InvokeMethod, } +Done: ; HELPER_METHOD_FRAME_END(); diff --git a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems index 4480693e02e8ad..6a2d0c54660fc6 100644 --- a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems +++ b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems @@ -667,6 +667,7 @@ + diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/CerHashtable.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/CerHashtable.cs new file mode 100644 index 00000000000000..540681113ac854 --- /dev/null +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/CerHashtable.cs @@ -0,0 +1,191 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections; +using System.Diagnostics; +using System.Threading; + +namespace System.Reflection +{ + // Reliable hashtable thread safe for multiple readers and single writer. Note that the reliability goes together with thread + // safety. Thread safety for multiple readers requires atomic update of the state that also makes the table + // reliable in the presence of asynchronous exceptions. + internal struct CerHashtable where K : class + { + private sealed class Table + { + // Note that m_keys and m_values arrays are immutable to allow lock-free reads. A new instance + // of CerHashtable has to be allocated to grow the size of the hashtable. + internal K[] m_keys; + internal V[] m_values; + internal int m_count; + + internal Table(int size) + { + size = HashHelpers.GetPrime(size); + m_keys = new K[size]; + m_values = new V[size]; + } + + internal void Insert(K key, V value) + { + int hashcode = GetHashCodeHelper(key); + if (hashcode < 0) + hashcode = ~hashcode; + + K[] keys = m_keys; + int index = hashcode % keys.Length; + + while (true) + { + K hit = keys[index]; + + if (hit == null) + { + m_count++; + m_values[index] = value; + + // This volatile write has to be last. It is going to publish the result atomically. + // + // Note that incrementing the count or setting the value does not do any harm without setting the key. The inconsistency will be ignored + // and it will go away completely during next rehash. + Volatile.Write(ref keys[index], key); + + break; + } + else + { + Debug.Assert(!hit.Equals(key), "Key was already in CerHashtable! Potential race condition (or bug) in the Reflection cache?"); + + index++; + if (index >= keys.Length) + index -= keys.Length; + } + } + } + } + + private Table m_Table; + + private const int MinSize = 7; + + private static int GetHashCodeHelper(K key) + { + // For strings we don't want the key to differ across domains as CerHashtable might be shared. + if (key is not string sKey) + { + return key.GetHashCode(); + } + else + { + return sKey.GetNonRandomizedHashCode(); + } + } + + private void Rehash(int newSize) + { + Table newTable = new Table(newSize); + + Table oldTable = m_Table; + if (oldTable != null) + { + K[] keys = oldTable.m_keys; + V[] values = oldTable.m_values; + + for (int i = 0; i < keys.Length; i++) + { + K key = keys[i]; + + if (key != null) + { + newTable.Insert(key, values[i]); + } + } + } + + // Publish the new table atomically + Volatile.Write(ref m_Table, newTable); + } + + internal V this[K key] + { + get + { + Table table = Volatile.Read(ref m_Table); + if (table == null) + return default!; + + int hashcode = GetHashCodeHelper(key); + if (hashcode < 0) + hashcode = ~hashcode; + + K[] keys = table.m_keys; + int index = hashcode % keys.Length; + + while (true) + { + // This volatile read has to be first. It is reading the atomically published result. + K hit = Volatile.Read(ref keys[index]); + + if (hit != null) + { + if (hit.Equals(key)) + return table.m_values[index]; + + index++; + if (index >= keys.Length) + index -= keys.Length; + } + else + { + return default!; + } + } + } + set + { + Table table = m_Table; + + if (table != null) + { + int requiredSize = 2 * (table.m_count + 1); + if (requiredSize >= table.m_keys.Length) + Rehash(requiredSize); + } + else + { + Rehash(MinSize); + } + + m_Table.Insert(key, value); + } + } + + public unsafe V GetValue(int hashcode, in TAlternativeKey alternative, delegate* equals) where TAlternativeKey : allows ref struct + { + Table table = m_Table; + if (table is null) + return default!; + if (hashcode < 0) + hashcode = ~hashcode; + K[] keys = table.m_keys; + int index = hashcode % keys.Length; + while (true) + { + K hit = Volatile.Read(ref keys[index]); + if (hit != null) + { + if (equals(alternative, hit)) + return table.m_values[index]; + index++; + if (index >= keys.Length) + index -= keys.Length; + } + else + { + return default!; + } + } + } + } +} diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index 6ff52c5a6d272f..125548a8afb61e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -12,6 +12,7 @@ using static System.Reflection.InvokeSignatureInfo; using static System.Reflection.MethodBase; using static System.Reflection.MethodInvokerCommon; +using static System.RuntimeType; namespace System.Reflection { @@ -29,14 +30,13 @@ namespace System.Reflection public sealed partial class ConstructorInvoker { private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. - private readonly Type _declaringType; + private readonly RuntimeType _declaringType; private readonly IntPtr _functionPointer; private readonly Delegate _invokeFunc; // todo: use GetMethodImpl and fcnptr? private readonly InvokerArgFlags[] _invokerArgFlags; private readonly RuntimeConstructorInfo _method; private readonly RuntimeType[] _parameterTypes; private readonly InvokerStrategy _strategy; - private readonly bool _allocateObject; /// /// Creates a new instance of ConstructorInvoker. @@ -74,23 +74,29 @@ private ConstructorInvoker(RuntimeConstructorInfo constructor) return; } - _declaringType = constructor.DeclaringType!; + _declaringType = (RuntimeType)constructor.DeclaringType!; _parameterTypes = constructor.ArgumentTypes; _argCount = _parameterTypes.Length; MethodBase _ = constructor; - Debug.Assert(constructor.IsStatic == false); + Initialize( - isForArrayInput: false, + isForInvokerClasses: true, constructor, - _declaringType, _parameterTypes, returnType: typeof(void), - out _allocateObject, out _functionPointer, - out _invokeFunc, + out _invokeFunc!, out _strategy, out _invokerArgFlags); + + _invokeFunc ??= CreateInvokeDelegateForInterpreted(); + +#if MONO + _shouldAllocate = _functionPointer != IntPtr.Zero; +#else + _allocator = _functionPointer != IntPtr.Zero ? _declaringType.GetOrCreateCacheEntry() : null; +#endif } /// @@ -120,9 +126,9 @@ public object Invoke() MethodBaseInvoker.ThrowTargetParameterCountException(); } - if (_allocateObject) + if (ShouldAllocate) { - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + object obj = CreateUninitializedObject(); ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); return obj; } @@ -157,9 +163,9 @@ public object Invoke(object? arg1) return InvokeWithRefArgs4(new Span(new object?[] { arg1 })); } - if (_allocateObject) + if (ShouldAllocate) { - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + object obj = CreateUninitializedObject(); ((InvokeFunc_Obj1Arg)_invokeFunc)(obj, _functionPointer, arg1); return obj; } @@ -262,9 +268,9 @@ private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4 break; } - if (_allocateObject) + if (ShouldAllocate) { - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + object obj = CreateUninitializedObject(); ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, arg1, arg2, arg3, arg4); return obj; } @@ -292,9 +298,9 @@ public object Invoke(Span arguments) switch (_strategy) { case InvokerStrategy.Obj0: - if (_allocateObject) + if (ShouldAllocate) { - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + object obj = CreateUninitializedObject(); ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); return obj; } @@ -303,9 +309,9 @@ public object Invoke(Span arguments) object? arg1 = arguments[0]; CheckArgument(ref arg1, 0); - if (_allocateObject) + if (ShouldAllocate) { - object obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + object obj = CreateUninitializedObject(); ((InvokeFunc_Obj1Arg)_invokeFunc)(obj, _functionPointer, arg1); return obj; } @@ -359,9 +365,9 @@ internal unsafe object InvokeWithSpanArgs(Span arguments) copyOfArgs[i] = arg; } - if (_allocateObject) + if (ShouldAllocate) { - obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + obj = CreateUninitializedObject(); ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); } else @@ -408,9 +414,9 @@ internal unsafe object InvokeWithRefArgs4(Span arguments) } object obj; - if (_allocateObject) + if (ShouldAllocate) { - obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + obj = CreateUninitializedObject(); ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); } else @@ -459,9 +465,9 @@ internal unsafe object InvokeWithRefArgsMany(Span arguments) ByReference.Create(ref Unsafe.AsRef(pStorage + i)); } - if (_allocateObject) + if (ShouldAllocate) { - obj = ((RuntimeType)_method.DeclaringType!).GetUninitializedObject(); + obj = CreateUninitializedObject(); ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); } else diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs index 12dc919637f55e..e3b3db635d3b15 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs @@ -186,13 +186,6 @@ private static Type[] GetNormalizedParameterTypes(Type[] parameterTypes) /// private static bool TryMakeNormalized(Type type, out Type normalizedType) { - // Todo:We can't normalize enums since the type would be lost. - //if (type.IsEnum) - //{ - // normalizedType = type.GetEnumUnderlyingType(); - // return true; - //} - if (type.IsValueType || type.IsByRef || type.IsPointer || diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index 41292645bc7f3b..c4d8dddbc026ce 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -18,7 +18,7 @@ internal static class InvokerEmitUtil internal delegate object? InvokeFunc_ObjSpanArgs(object? obj, IntPtr functionPointer, Span arguments); internal unsafe delegate object? InvokeFunc_RefArgs(object? obj, IntPtr functionPointer, IntPtr* refArguments); - public static unsafe InvokeFunc_Obj0Args CreateInvokeDelegate_Obj0Args(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_Obj0Args CreateInvokeDelegateForObj0Args(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr)]); ILGenerator il = dm.GetILGenerator(); @@ -29,7 +29,7 @@ public static unsafe InvokeFunc_Obj0Args CreateInvokeDelegate_Obj0Args(MethodBas return (InvokeFunc_Obj0Args)dm.CreateDelegate(typeof(InvokeFunc_Obj0Args), target: null); } - public static unsafe InvokeFunc_Obj1Arg CreateInvokeDelegate_Obj1Arg(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_Obj1Arg CreateInvokeDelegateForObj1Arg(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(object)]); ILGenerator il = dm.GetILGenerator(); @@ -45,7 +45,7 @@ public static unsafe InvokeFunc_Obj1Arg CreateInvokeDelegate_Obj1Arg(MethodBase? return (InvokeFunc_Obj1Arg)dm.CreateDelegate(typeof(InvokeFunc_Obj1Arg), target: null); } - public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegateForObj4Args(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(object), typeof(object), typeof(object), typeof(object)]); ILGenerator il = dm.GetILGenerator(); @@ -78,7 +78,7 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegate_Obj4Args(MethodBas return (InvokeFunc_Obj4Args)dm.CreateDelegate(typeof(InvokeFunc_Obj4Args), target: null); } - public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegateForObjSpanArgs(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(Span)]); ILGenerator il = dm.GetILGenerator(); @@ -103,7 +103,7 @@ public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegate_ObjSpanArgs(Met return (InvokeFunc_ObjSpanArgs)dm.CreateDelegate(typeof(InvokeFunc_ObjSpanArgs), target: null); } - public static unsafe InvokeFunc_RefArgs CreateInvokeDelegate_RefArgs(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_RefArgs CreateInvokeDelegateForRefArgs(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(IntPtr*)]); ILGenerator il = dm.GetILGenerator(); @@ -194,8 +194,6 @@ private static void EmitCall(ILGenerator il, MethodBase? method, in InvokeSignat return; } - // Use Call\CallVirt\NewObj - // For CallStack reasons, don't inline target method. // EmitCalli above and Mono interpreter do not need this. if (backwardsCompat && RuntimeFeature.IsDynamicCodeCompiled) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index 3bede4d61deb71..7017304b11c7b0 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -15,6 +15,7 @@ using static System.Reflection.InvokeSignatureInfo; using static System.Reflection.MethodBase; using static System.Reflection.MethodInvokerCommon; +using static System.RuntimeType; namespace System.Reflection { @@ -29,34 +30,40 @@ internal sealed partial class MethodBaseInvoker internal const int MaxStackAllocArgCount = 4; private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. - private readonly Type _declaringType; + private readonly RuntimeType _declaringType; private readonly IntPtr _functionPointer; // This will be Zero when not using calli. private readonly Delegate _invokeFunc; private readonly InvokerArgFlags[] _invokerArgFlags; private readonly MethodBase _method; private readonly RuntimeType[] _parameterTypes; private readonly InvokerStrategy _strategy; - private readonly bool _allocateObject; // True for constructors when using calli. - // todo: CreateUninitializedCache - public MethodBaseInvoker(MethodBase method, Type declaringType, RuntimeType[] parameterTypes, Type returnType) + public MethodBaseInvoker(MethodBase method, RuntimeType[] parameterTypes, Type returnType) { _method = method; - _declaringType = declaringType; + _declaringType = (RuntimeType)method.DeclaringType!; _parameterTypes = parameterTypes; _argCount = parameterTypes.Length; Initialize( - isForArrayInput: true, + isForInvokerClasses: false, method, - declaringType, parameterTypes, returnType, - out _allocateObject, out _functionPointer, - out _invokeFunc, + out _invokeFunc!, out _strategy, out _invokerArgFlags); + + _invokeFunc ??= CreateInvokeDelegateForInterpreted(); + +#if MONO + _shouldAllocate = _functionPointer != IntPtr.Zero && method is RuntimeConstructorInfo; +#else + _allocator = _functionPointer != IntPtr.Zero && method is RuntimeConstructorInfo ? + _declaringType.GetOrCreateCacheEntry() : + null; +#endif } internal InvokerStrategy Strategy => _strategy; @@ -67,15 +74,15 @@ internal static void ThrowTargetParameterCountException() throw new TargetParameterCountException(SR.Arg_ParmCnt); } - internal unsafe object? InvokeWith0Args(object? obj, BindingFlags invokeAttr) + internal unsafe object? InvokeWithNoArgs(object? obj, BindingFlags invokeAttr) { Debug.Assert(_argCount == 0); try { - if (_allocateObject) + if (ShouldAllocate) { - obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); + obj ??= CreateUninitializedObject(); ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); return obj; } @@ -104,10 +111,11 @@ internal static void ThrowTargetParameterCountException() try { - if (_allocateObject) + if (ShouldAllocate) { - obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); - return ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); + obj ??= CreateUninitializedObject(); + ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); + return obj; } return obj = ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); } @@ -135,9 +143,9 @@ internal static void ThrowTargetParameterCountException() try { - if (_allocateObject) + if (ShouldAllocate) { - obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); + obj ??= CreateUninitializedObject(); ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, arg1); } else @@ -179,9 +187,9 @@ internal static void ThrowTargetParameterCountException() try { - if (_allocateObject) + if (ShouldAllocate) { - obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); + obj ??= CreateUninitializedObject(); ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, copyOfArgs[0], copyOfArgs[1], copyOfArgs[2], copyOfArgs[3]); } else @@ -222,14 +230,13 @@ internal static void ThrowTargetParameterCountException() try { GCFrameRegistration.RegisterForGCReporting(®ArgStorage); - CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); try { - if (_allocateObject) + if (ShouldAllocate) { - obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); + obj ??= CreateUninitializedObject(); ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); ret = obj; } @@ -282,9 +289,9 @@ internal static void ThrowTargetParameterCountException() object? ret; try { - if (_allocateObject) + if (ShouldAllocate) { - obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); + obj ??= CreateUninitializedObject(); ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); ret = obj; } @@ -337,9 +344,9 @@ internal static void ThrowTargetParameterCountException() try { - if (_allocateObject) + if (ShouldAllocate) { - obj ??= ((RuntimeType)_declaringType).GetUninitializedObject(); + obj ??= CreateUninitializedObject(); ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); ret = obj; } @@ -386,27 +393,6 @@ internal void CopyBack(object?[] dest, Span copyOfParameters, Span parameters, Span copyOfParameters, diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index b35c645ba7fbdf..a92b8c6ae1dfeb 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -28,9 +28,8 @@ namespace System.Reflection public sealed partial class MethodInvoker { private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. - private readonly Type _declaringType; private readonly IntPtr _functionPointer; - private readonly Delegate? _invokeFunc; // todo: use GetMethodImpl and fcnptr? + private readonly Delegate? _invokeFunc; private readonly InvokerArgFlags[] _invokerArgFlags; private readonly RuntimeType[] _parameterTypes; private readonly MethodBase _method; @@ -75,28 +74,26 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu if ((invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers)) != 0) { - _declaringType = null!; _invokeFunc = null!; _invokerArgFlags = null!; _parameterTypes = null!; return; } - _declaringType = method.DeclaringType!; _parameterTypes = parameterTypes; _argCount = _parameterTypes.Length; Initialize( - isForArrayInput: false, + isForInvokerClasses: true, method, - _declaringType, _parameterTypes, returnType, - out bool _, out _functionPointer, - out _invokeFunc, + out _invokeFunc!, out _strategy, out _invokerArgFlags); + + _invokeFunc ??= CreateInvokeDelegateForInterpreted(); } /// diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs index 70c2f76bb3f7bd..85d36bebd9804a 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs @@ -2,221 +2,113 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Reflection.Emit; using static System.Reflection.InvokerEmitUtil; namespace System.Reflection { internal static partial class MethodInvokerCommon { - public static bool TryGetWellKnownSignatureFor0Args(in InvokeSignatureInfoKey signatureInfo, [NotNullWhen(true)] out Delegate? func) + /// + /// Returns a delegate that can be used to invoke a method with no arguments which are typically property getters. + /// + public static Delegate? GetWellKnownSignatureFor0Args(in InvokeSignatureInfoKey signatureInfo) { Debug.Assert(signatureInfo.ParameterTypes.Length == 0); - func = null!; - if (signatureInfo.DeclaringType != typeof(object)) { - return false; + // Only reference types are supported. + return null; } - Type returnType = signatureInfo.ReturnType; + Type retType = signatureInfo.ReturnType; - if (returnType == typeof(void)) - { - func = new InvokeFunc_Obj0Args(CallInstanceVoid); - } - else if (returnType == typeof(bool)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(byte)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(char)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(DateTime)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(DateTimeOffset)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(decimal)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(double)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(float)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(Guid)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(int)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(IntPtr)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(long)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(object)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(short)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(sbyte)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(string)) + if (!ReferenceEquals(retType.Assembly, typeof(object).Assembly)) { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(ushort)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(uint)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(UIntPtr)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); - } - else if (returnType == typeof(ulong)) - { - func = new InvokeFunc_Obj0Args(CallInstanceAny); + // We can only hard-code types in this assembly. + return null; } - return func != null; + if (retType == typeof(bool)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(byte)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(char)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(DateTime)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(DateTimeOffset)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(decimal)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(double)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(float)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(Guid)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(int)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(IntPtr)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(long)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(object)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(sbyte)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(short)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(uint)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(UIntPtr)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(ulong)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(ushort)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(void)) return new InvokeFunc_Obj0Args(CallAction0); + // System.Diagnostics.Tracing is used during startup. + if (retType == typeof(System.Diagnostics.Tracing.EventKeywords)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(System.Diagnostics.Tracing.EventLevel)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(System.Diagnostics.Tracing.EventOpcode)) return new InvokeFunc_Obj0Args(CallFunc0); + if (retType == typeof(System.Diagnostics.Tracing.EventTask)) return new InvokeFunc_Obj0Args(CallFunc0); + + return null; } - public static bool TryGetWellKnownSignatureFor1Arg(in InvokeSignatureInfoKey signatureInfo, [NotNullWhen(true)] out Delegate? func) + /// + /// Returns a delegate that can be used to invoke a method with a single argument and no return which are typically property setters. + /// + public static Delegate? GetWellKnownSignatureFor1Arg(in InvokeSignatureInfoKey signatureInfo) { Debug.Assert(signatureInfo.ParameterTypes.Length == 1); - func = null!; - if (signatureInfo.DeclaringType != typeof(object) || signatureInfo.ReturnType != typeof(void)) { - return false; + // Only reference types and methods with no return are supported. + return null; } - Type arg1Type = signatureInfo.ParameterTypes[0]; - if (arg1Type == typeof(int)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(object)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(bool)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(byte)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(char)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(DateTime)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(DateTimeOffset)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(decimal)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(double)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(float)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(Guid)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(int)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(IntPtr)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(long)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(object)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(short)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(sbyte)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(string)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(ushort)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(uint)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(UIntPtr)) - { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); - } - else if (arg1Type == typeof(ulong)) + Type argType = signatureInfo.ParameterTypes[0]; + + if (!ReferenceEquals(argType.Assembly, typeof(object).Assembly)) { - func = new InvokeFunc_Obj1Arg(CallInstanceAnyVoid); + // We can only hard-code types in this assembly. + return null; } - return func != null; + if (argType == typeof(bool)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(byte)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(char)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(DateTime)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(DateTimeOffset)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(decimal)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(double)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(float)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(Guid)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(int)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(IntPtr)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(long)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(object)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(sbyte)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(short)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(uint)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(UIntPtr)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(ulong)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(ushort)) return new InvokeFunc_Obj1Arg(CallAction1); + // System.Diagnostics.Tracing is used during startup. + if (argType == typeof(Diagnostics.Tracing.EventKeywords)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(Diagnostics.Tracing.EventLevel)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(Diagnostics.Tracing.EventOpcode)) return new InvokeFunc_Obj1Arg(CallAction1); + if (argType == typeof(Diagnostics.Tracing.EventTask)) return new InvokeFunc_Obj1Arg(CallAction1); + + return null; } - private static unsafe object? CallInstanceVoid(object? obj, IntPtr functionPointer) { ((delegate* managed)functionPointer)(obj); return null; } - private static unsafe object? CallInstanceAny(object? obj, IntPtr functionPointer) => ((delegate* managed)functionPointer)(obj); - private static unsafe object? CallInstanceAnyVoid(object? obj, IntPtr functionPointer, object? arg1) { ((delegate* managed)functionPointer)(obj, (TArg1)arg1!); return null; } + private static unsafe object? CallAction0(object? o, IntPtr f) { ((delegate* managed)f)(o); return null; } + private static unsafe object? CallAction1(object? o, IntPtr f, object? a) { ((delegate* managed)f)(o, (TArg1)a!); return null; } + private static unsafe object? CallFunc0(object? o, IntPtr f) => ((delegate* managed)f)(o); } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index ecb0f55b332504..1089d590f785fd 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -2,12 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.Reflection.Emit; -using System.Runtime.CompilerServices; using System.Threading; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; +using static System.RuntimeType; namespace System.Reflection { @@ -17,50 +16,47 @@ internal static partial class MethodInvokerCommon private static object? s_invokerFuncsLock; internal static void Initialize( - bool isForArrayInput, + bool isForInvokerClasses, MethodBase method, - Type declaringType, RuntimeType[] parameterTypes, Type returnType, - out bool allocateObject, out IntPtr functionPointer, - out Delegate invokeFunc, + out Delegate? invokeFunc, out InvokerStrategy strategy, out InvokerArgFlags[] invokerArgFlags) { - functionPointer = method.MethodHandle.GetFunctionPointer(); - strategy = GetStrategy(parameterTypes, out invokerArgFlags); + invokerArgFlags = GetInvokerArgFlags(parameterTypes, out bool needsByRefStrategy); + strategy = GetInvokerStrategy(parameterTypes.Length, needsByRefStrategy); + RuntimeType declaringType = (RuntimeType)method.DeclaringType!; if (UseCalli(method)) { - allocateObject = method is RuntimeConstructorInfo; + functionPointer = method.MethodHandle.GetFunctionPointer(); if (CanCache(method)) { - // For constructors we allocate before calling invokeFunc so invokeFunc will be cacheable. - invokeFunc = GetOrCreateInvokeFunc(isForArrayInput, strategy, declaringType, parameterTypes, returnType, method.IsStatic); + InvokeSignatureInfoKey key = InvokeSignatureInfoKey.CreateNormalized(declaringType, parameterTypes, returnType, method.IsStatic); + invokeFunc = GetWellKnownInvokeFunc(key, strategy); + invokeFunc ??= GetOrCreateInvokeFunc(isForInvokerClasses, key, strategy); } else { InvokeSignatureInfoKey signatureInfo = new(declaringType, parameterTypes, returnType, method.IsStatic); - invokeFunc = CreateInvokeFunc(isForArrayInput, method: null, signatureInfo, strategy); + invokeFunc = CreateInvokeFunc(isForInvokerClasses, method: null, signatureInfo, strategy); } } else { - // Use Call\Callvirt\Newobj path. - allocateObject = false; + functionPointer = IntPtr.Zero; InvokeSignatureInfoKey signatureInfo = new(declaringType, parameterTypes, returnType, method.IsStatic); - invokeFunc = CreateInvokeFunc(isForArrayInput, method, signatureInfo, strategy); + invokeFunc = CreateInvokeFunc(isForInvokerClasses, method, signatureInfo, strategy); } } - private static InvokerStrategy GetStrategy( - RuntimeType[] parameterTypes, - out InvokerArgFlags[] invokerFlags) + private static InvokerArgFlags[] GetInvokerArgFlags(RuntimeType[] parameterTypes, out bool needsByRefStrategy) { - bool needsByRefStrategy = false; + needsByRefStrategy = false; int argCount = parameterTypes.Length; - invokerFlags = new InvokerArgFlags[argCount]; + InvokerArgFlags[] invokerFlags = new InvokerArgFlags[argCount]; for (int i = 0; i < argCount; i++) { @@ -100,16 +96,21 @@ private static InvokerStrategy GetStrategy( } } - return GetInvokerStrategy(argCount, needsByRefStrategy); + return invokerFlags; } internal static bool UseCalli(MethodBase method) { + if (UseInterpretedPath) + { + return false; + } + Type declaringType = method.DeclaringType!; if (method is RuntimeConstructorInfo) { - // Constructors are not polymorphic but avoid calli for constructors that require initialization through newobj. + // Strings and arrays require initialization through newobj. return !ReferenceEquals(declaringType, typeof(string)) && !declaringType.IsArray; } @@ -123,10 +124,9 @@ internal static bool UseCalli(MethodBase method) return !method.IsVirtual || declaringType.IsSealed || method.IsFinal; } - internal static bool CanCache(MethodBase method) + private static bool CanCache(MethodBase method) { - return CanCacheDynamicMethod(method) && - !HasDefaultParameterValues(method); + return CanCacheDynamicMethod(method) && !HasDefaultParameterValues(method); static bool CanCacheDynamicMethod(MethodBase method) => // The cache method's DeclaringType and other collectible parameters would be referenced. @@ -154,8 +154,9 @@ static bool HasDefaultParameterValues(MethodBase method) private static InvokerStrategy GetInvokerStrategy(int argCount, bool needsByRefStrategy) { - if (needsByRefStrategy) + if (needsByRefStrategy || UseInterpretedPath) { + // Always use the native interpreted invoke. return argCount <= 4 ? InvokerStrategy.Ref4 : InvokerStrategy.RefMany; } @@ -168,55 +169,47 @@ private static InvokerStrategy GetInvokerStrategy(int argCount, bool needsByRefS }; } - internal static Delegate CreateInvokeFunc(bool isForArrayInput, MethodBase? method, in InvokeSignatureInfoKey signatureInfo, InvokerStrategy strategy) + internal static Delegate? CreateInvokeFunc(bool isForInvokerClasses, MethodBase? method, in InvokeSignatureInfoKey signatureInfo, InvokerStrategy strategy) { - Delegate? invokeFunc; - bool backwardsCompat = isForArrayInput && method is not null; - - if (!TryCreateWellKnownInvokeFunc(method, signatureInfo, strategy, out invokeFunc)) + if (UseInterpretedPath) { - invokeFunc = strategy switch - { - InvokerStrategy.Obj0 => CreateInvokeDelegate_Obj0Args(method, signatureInfo, backwardsCompat), - InvokerStrategy.Obj1 => CreateInvokeDelegate_Obj1Arg(method, signatureInfo, backwardsCompat), - InvokerStrategy.Obj4 => CreateInvokeDelegate_Obj4Args(method, signatureInfo, backwardsCompat), - InvokerStrategy.ObjSpan => CreateInvokeDelegate_ObjSpanArgs(method, signatureInfo, backwardsCompat), - _ => CreateInvokeDelegate_RefArgs(method, signatureInfo, backwardsCompat) - }; + // The interpreted invoke function is created by the invoker classes since each one has different logic. + return null; } - return invokeFunc; + bool backwardsCompat = method is null ? false : !isForInvokerClasses; - static bool TryCreateWellKnownInvokeFunc(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, InvokerStrategy strategy, [NotNullWhen(true)] out Delegate? wellKnown) + // // IL Path + return strategy switch { - if (method is null) - { - // Check if the method has a well-known signature that can be invoked directly using calli and a function pointer. - switch (strategy) - { - case InvokerStrategy.Obj0: - if (TryGetWellKnownSignatureFor0Args(signatureInfo, out wellKnown)) return true; - break; - case InvokerStrategy.Obj1: - if (TryGetWellKnownSignatureFor1Arg(signatureInfo, out wellKnown)) return true; - break; - } - } + InvokerStrategy.Obj0 => CreateInvokeDelegateForObj0Args(method, signatureInfo, backwardsCompat), + InvokerStrategy.Obj1 => CreateInvokeDelegateForObj1Arg(method, signatureInfo, backwardsCompat), + InvokerStrategy.Obj4 => CreateInvokeDelegateForObj4Args(method, signatureInfo, backwardsCompat), + InvokerStrategy.ObjSpan => CreateInvokeDelegateForObjSpanArgs(method, signatureInfo, backwardsCompat), + _ => CreateInvokeDelegateForRefArgs(method, signatureInfo, backwardsCompat) + }; + } - wellKnown = null; - return false; + internal static Delegate? GetWellKnownInvokeFunc(in InvokeSignatureInfoKey signatureInfo, InvokerStrategy strategy) + { + // Check if the method has a well-known signature that can be invoked directly using calli and a function pointer. + switch (strategy) + { + case InvokerStrategy.Obj0: + return GetWellKnownSignatureFor0Args(signatureInfo); + case InvokerStrategy.Obj1: + return GetWellKnownSignatureFor1Arg(signatureInfo); } + + return null; } internal static Delegate GetOrCreateInvokeFunc( - bool isForArrayInput, - InvokerStrategy strategy, - Type declaringType, - RuntimeType[] parameterTypes, - Type returnType, - bool isStatic) + bool isForInvokerClasses, + InvokeSignatureInfoKey key, + InvokerStrategy strategy) { - InvokeSignatureInfoKey key = InvokeSignatureInfoKey.CreateNormalized(declaringType, parameterTypes, returnType, isStatic); + Debug.Assert(!UseInterpretedPath); int hashcode = key.AlternativeGetHashCode(); Delegate invokeFunc; @@ -236,7 +229,7 @@ internal static Delegate GetOrCreateInvokeFunc( } // To minimize the lock scope, create the new delegate outside the lock even though it may not be used. - Delegate newInvokeFunc = CreateInvokeFunc(isForArrayInput, method: null, key, strategy); + Delegate newInvokeFunc = CreateInvokeFunc(isForInvokerClasses, method: null, key, strategy)!; bool lockTaken = false; try { @@ -263,7 +256,7 @@ internal static Delegate GetOrCreateInvokeFunc( } /// - /// Confirm member invocation has an instance and is of the correct type + /// Confirm member invocation has an instance and is of the correct type. /// internal static void ValidateInvokeTarget(object? target, MethodBase method) { diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs index 8c2018491a05c8..b9cd77454c71f7 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs @@ -129,7 +129,7 @@ internal void ThrowNoInvokeException() _ = Invoker.Strategy switch { - MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, invokeAttr), + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWithNoArgs(obj, invokeAttr), MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), @@ -161,7 +161,7 @@ public override object Invoke(BindingFlags invokeAttr, Binder? binder, object?[] return Invoker.Strategy switch { - MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj: null, invokeAttr)!, + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWithNoArgs(obj: null, invokeAttr)!, MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj: null, invokeAttr, binder, parameters!, culture)!, MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj: null, invokeAttr, binder, parameters!, culture)!, MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj: null, invokeAttr, binder, parameters!, culture)!, diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs index 8cead1e1636c88..8605830ac63011 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs @@ -122,7 +122,7 @@ internal void ThrowNoInvokeException() return Invoker.Strategy switch { - MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWith0Args(obj, invokeAttr), + MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWithNoArgs(obj, invokeAttr), MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), diff --git a/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInfoTests.cs b/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInfoTests.cs index 37498347ac48fe..ed7194f1015d0d 100644 --- a/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInfoTests.cs +++ b/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInfoTests.cs @@ -177,7 +177,8 @@ public ClassWith3Constructors(int intValue, string stringValue) public static class ClassWithStaticConstructor { - static ClassWithStaticConstructor() { } + public static int _intValue; + static ClassWithStaticConstructor() { _intValue++; } } public struct StructWith1Constructor diff --git a/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs b/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs index cd9a61af207aeb..f940193f0aed0b 100644 --- a/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs +++ b/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs @@ -270,8 +270,9 @@ public void Invoke_StaticConstructor_NullObject_NullParameters() ConstructorInfo[] constructors = GetConstructors(typeof(ClassWithStaticConstructor)); Assert.Equal(1, constructors.Length); - // Invoker classes do not support calling class constructors; use standard reflection for that. - Assert.Throws(() => Invoke(constructors[0], null, new object[] { })); + int before = ClassWithStaticConstructor._intValue; + Invoke(constructors[0], null, new object[] { }); + Assert.Equal(before + 1, ClassWithStaticConstructor._intValue); } private class TestClass diff --git a/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj index 8f6fbf18070cd1..adeb6cdf77f8ce 100644 --- a/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj +++ b/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj @@ -197,6 +197,7 @@ + diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs index e829600332e34d..2feeaa892485f0 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs @@ -1,16 +1,33 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using static System.Reflection.InvokerEmitUtil; +using static System.Reflection.MethodBase; + namespace System.Reflection { public partial class ConstructorInvoker { - internal unsafe ConstructorInvoker(RuntimeConstructorInfo constructor) : this(constructor, constructor.ArgumentTypes) + private bool _shouldAllocate; + private bool ShouldAllocate => _shouldAllocate; + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2072:UnrecognizedReflectionPattern", Justification = "Internal reflection implementation")] + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2077:UnrecognizedReflectionPattern", Justification = "Internal reflection implementation")] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private object CreateUninitializedObject() => RuntimeHelpers.GetUninitializedObject(_declaringType); + + private unsafe Delegate CreateInvokeDelegateForInterpreted() { - _invokeFunc_RefArgs = InterpretedInvoke; + Debug.Assert(MethodInvokerCommon.UseInterpretedPath); + Debug.Assert(_strategy == InvokerStrategy.Ref4 || _strategy == InvokerStrategy.RefMany); + return (InvokeFunc_RefArgs)InterpretedInvoke; } - private unsafe object? InterpretedInvoke(object? obj, IntPtr *args) + private unsafe object? InterpretedInvoke(object? obj, IntPtr _, IntPtr* args) { object? o = _method.InternalInvoke(obj, args, out Exception? exc); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs index 47703e4221a7b3..10ee472f1ecb93 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs @@ -1,21 +1,39 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; +using static System.Reflection.InvokerEmitUtil; +using static System.Reflection.MethodBase; + namespace System.Reflection { internal partial class MethodBaseInvoker { - internal unsafe MethodBaseInvoker(RuntimeMethodInfo method) : this(method, method.ArgumentTypes) - { - _invokeFunc_RefArgs = InterpretedInvoke_Method; - } + private bool _shouldAllocate; + private bool ShouldAllocate => _shouldAllocate; - internal unsafe MethodBaseInvoker(RuntimeConstructorInfo constructor) : this(constructor, constructor.ArgumentTypes) + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2072:UnrecognizedReflectionPattern", Justification = "Internal reflection implementation")] + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2077:UnrecognizedReflectionPattern", Justification = "Internal reflection implementation")] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private object CreateUninitializedObject() => RuntimeHelpers.GetUninitializedObject(_declaringType); + + private unsafe Delegate CreateInvokeDelegateForInterpreted() { - _invokeFunc_RefArgs = InterpretedInvoke_Constructor; + Debug.Assert(MethodInvokerCommon.UseInterpretedPath); + Debug.Assert(_strategy == InvokerStrategy.Ref4 || _strategy == InvokerStrategy.RefMany); + + if (_method is RuntimeMethodInfo) + { + return (InvokeFunc_RefArgs)InterpretedInvoke_Method; + } + + Debug.Assert(_method is RuntimeConstructorInfo); + return (InvokeFunc_RefArgs)InterpretedInvoke_Constructor; } - private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr *args) + private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr _, IntPtr* args) { object? o = ((RuntimeMethodInfo)_method).InternalInvoke(obj, args, out Exception? exc); @@ -25,7 +43,7 @@ internal unsafe MethodBaseInvoker(RuntimeConstructorInfo constructor) : this(con return o; } - internal unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr* args) + internal unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr _, IntPtr* args) { object? o = ((RuntimeConstructorInfo)_method).InternalInvoke(obj, args, out Exception? exc); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodInvoker.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodInvoker.Mono.cs index 1b20c8bdf76fd6..a3e5dd9339a4cf 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodInvoker.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodInvoker.Mono.cs @@ -1,31 +1,30 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics; using System.Reflection.Emit; +using static System.Reflection.InvokerEmitUtil; +using static System.Reflection.MethodBase; namespace System.Reflection { public partial class MethodInvoker { - private unsafe MethodInvoker(RuntimeMethodInfo method) : this(method, method.ArgumentTypes) + private unsafe Delegate CreateInvokeDelegateForInterpreted() { - _invokeFunc_RefArgs = InterpretedInvoke_Method; - _invocationFlags = method.ComputeAndUpdateInvocationFlags(); - } + Debug.Assert(MethodInvokerCommon.UseInterpretedPath); + Debug.Assert(_strategy == InvokerStrategy.Ref4 || _strategy == InvokerStrategy.RefMany); - private unsafe MethodInvoker(DynamicMethod method) : this(method.GetRuntimeMethodInfo(), method.ArgumentTypes) - { - _invokeFunc_RefArgs = InterpretedInvoke_Method; - // No _invocationFlags for DynamicMethod. - } + if (_method is RuntimeMethodInfo) + { + return (InvokeFunc_RefArgs)InterpretedInvoke_Method; + } - private unsafe MethodInvoker(RuntimeConstructorInfo constructor) : this(constructor, constructor.ArgumentTypes) - { - _invokeFunc_RefArgs = InterpretedInvoke_Constructor; - _invocationFlags = constructor.ComputeAndUpdateInvocationFlags(); + Debug.Assert(_method is RuntimeConstructorInfo); + return (InvokeFunc_RefArgs)InterpretedInvoke_Constructor; } - private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr *args) + private unsafe object? InterpretedInvoke_Method(object? obj, IntPtr _, IntPtr *args) { object? o = ((RuntimeMethodInfo)_method).InternalInvoke(obj, args, out Exception? exc); @@ -35,7 +34,7 @@ private unsafe MethodInvoker(RuntimeConstructorInfo constructor) : this(construc return o; } - private unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr *args) + private unsafe object? InterpretedInvoke_Constructor(object? obj, IntPtr _, IntPtr *args) { object? o = ((RuntimeConstructorInfo)_method).InternalInvoke(obj, args, out Exception? exc); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.Mono.cs new file mode 100644 index 00000000000000..917b8aa9e2dc38 --- /dev/null +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.Mono.cs @@ -0,0 +1,12 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Runtime.CompilerServices; + +namespace System.Reflection +{ + internal static partial class MethodInvokerCommon + { + internal static bool UseInterpretedPath => LocalAppContextSwitches.ForceInterpretedInvoke || !RuntimeFeature.IsDynamicCodeSupported; + } +} diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.Mono.cs index 4eb998b149412c..2d3162d83bfb9a 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.Mono.cs @@ -151,13 +151,19 @@ internal sealed unsafe partial class RuntimeMethodInfo : MethodInfo private string? toString; private RuntimeType[]? parameterTypes; private MethodBaseInvoker? invoker; + private InvocationFlags invocationFlags; internal InvocationFlags InvocationFlags { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - InvocationFlags flags = Invoker._invocationFlags; + InvocationFlags flags = invocationFlags; + if (flags == InvocationFlags.Unknown) + { + invocationFlags = flags = ComputeInvocationFlags(); + } + Debug.Assert((flags & InvocationFlags.Initialized) == InvocationFlags.Initialized); return flags; } @@ -168,8 +174,7 @@ private MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - invoker ??= new MethodBaseInvoker(this); - return invoker; + return invoker ??= new MethodBaseInvoker(this, ArgumentTypes, ReturnType); } } @@ -717,13 +722,19 @@ internal sealed unsafe partial class RuntimeConstructorInfo : ConstructorInfo private string? toString; private RuntimeType[]? parameterTypes; private MethodBaseInvoker? invoker; + private InvocationFlags invocationFlags; internal InvocationFlags InvocationFlags { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - InvocationFlags flags = Invoker._invocationFlags; + InvocationFlags flags = invocationFlags; + if (flags == InvocationFlags.Unknown) + { + invocationFlags = flags = ComputeInvocationFlags(); + } + Debug.Assert((flags & InvocationFlags.Initialized) == InvocationFlags.Initialized); return flags; } @@ -734,8 +745,7 @@ internal MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - invoker ??= new MethodBaseInvoker(this); - return invoker; + return invoker ??= new MethodBaseInvoker(this, ArgumentTypes, DeclaringType); } } From 517e5d593e09e0cb10f7e0160324946fe54455b9 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Sun, 17 Nov 2024 15:56:57 -0600 Subject: [PATCH 08/24] Initial mono; keep interpreted path #2 --- .../Reflection/Emit/DynamicMethod.CoreCLR.cs | 2 +- .../Reflection/MethodBaseInvoker.CoreCLR.cs | 2 +- .../System/Reflection/InvokeEmitTests.cs | 4 +- .../System/Reflection/ConstructorInvoker.cs | 14 +++- .../System/Reflection/InvokeSignatureInfo.cs | 25 +++--- .../src/System/Reflection/InvokerEmitUtil.cs | 4 +- .../System/Reflection/MethodBaseInvoker.cs | 77 ++++++++++++++----- .../src/System/Reflection/MethodInvoker.cs | 5 ++ .../System/Reflection/MethodInvokerCommon.cs | 26 +++---- .../Reflection/RuntimeConstructorInfo.cs | 4 +- .../System/Reflection/RuntimeMethodInfo.cs | 2 +- .../Reflection/MethodBaseInvoker.Mono.cs | 2 +- 12 files changed, 111 insertions(+), 56 deletions(-) diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs index 4f2ded1f1d6a49..61dce1500552c6 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.CoreCLR.cs @@ -139,7 +139,7 @@ Signature LazyCreateSignature() MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters, culture), _ => Invoker.InvokeWithManyRefArgs(obj, invokeAttr, binder, parameters!, culture) }; diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs index ec4bb4fa72e99c..74eeaadd95c947 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.CoreCLR.cs @@ -15,7 +15,7 @@ internal partial class MethodBaseInvoker private readonly CreateUninitializedCache? _allocator; [MethodImpl(MethodImplOptions.AggressiveInlining)] - private object CreateUninitializedObject() => _allocator!.CreateUninitializedObject(_declaringType); + private object CreateUninitializedObject() => _allocator!.CreateUninitializedObject(_declaringType!); private bool ShouldAllocate => _allocator is not null; diff --git a/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs b/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs index 149be11a982597..73469cdd51406a 100644 --- a/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs +++ b/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs @@ -16,7 +16,7 @@ public static void VerifyInvokeIsUsingEmit_Method() Exception exInner = ex.InnerException; Assert.Contains("Here", exInner.ToString()); - Assert.Contains("InvokeStub_TestClassThatThrows", exInner.ToString()); + Assert.Contains("InvokeStub_ (Object, IntPtr)", exInner.ToString()); Assert.DoesNotContain("InterpretedInvoke_Method", exInner.ToString()); } @@ -28,7 +28,7 @@ public static void VerifyInvokeIsUsingEmit_Constructor() Exception exInner = ex.InnerException; Assert.Contains("Here", exInner.ToString()); - Assert.Contains("InvokeStub_TestClassThatThrows", exInner.ToString()); + Assert.Contains("MethodInvokerCommon.CallAction0(Object o, IntPtr f)", exInner.ToString()); Assert.DoesNotContain("InterpretedInvoke_Constructor", exInner.ToString()); } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index 125548a8afb61e..6a643427975adb 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -65,7 +65,7 @@ private ConstructorInvoker(RuntimeConstructorInfo constructor) { _method = constructor; - if ((constructor.InvocationFlags & InvocationFlags.NoInvoke) != 0) + if ((constructor.InvocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers | InvocationFlags.NoConstructorInvoke)) != 0) { _declaringType = null!; _invokeFunc = null!; @@ -92,11 +92,14 @@ private ConstructorInvoker(RuntimeConstructorInfo constructor) _invokeFunc ??= CreateInvokeDelegateForInterpreted(); + if (_functionPointer != IntPtr.Zero) + { #if MONO - _shouldAllocate = _functionPointer != IntPtr.Zero; + _shouldAllocate = true; #else - _allocator = _functionPointer != IntPtr.Zero ? _declaringType.GetOrCreateCacheEntry() : null; + _allocator = _declaringType.GetOrCreateCacheEntry(); #endif + } } /// @@ -133,6 +136,11 @@ public object Invoke() return obj; } + if (_strategy == InvokerStrategy.Ref4) + { + return InvokeWithRefArgs4(Span.Empty); + } + return ((InvokeFunc_Obj0Args)_invokeFunc)(obj: null, _functionPointer)!; } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs index e3b3db635d3b15..ea1fbffdba285e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs @@ -10,7 +10,7 @@ namespace System.Reflection { internal sealed class InvokeSignatureInfo { - internal readonly Type _declaringType; + internal readonly Type? _declaringType; internal readonly Type[] _parameterTypes; internal readonly Type _returnType; internal readonly bool _isStatic; @@ -24,7 +24,7 @@ public static InvokeSignatureInfo Create(in InvokeSignatureInfoKey key) key._isStatic); } - public InvokeSignatureInfo(Type declaringType, Type[] parameterTypes, Type returnType, bool isStatic) + public InvokeSignatureInfo(Type? declaringType, Type[] parameterTypes, Type returnType, bool isStatic) { _declaringType = declaringType; _parameterTypes = parameterTypes; @@ -66,18 +66,19 @@ public override bool Equals(object? other) public override int GetHashCode() => GetHashCode(_declaringType, _parameterTypes, _returnType); - public static int GetHashCode(Type declaringType, Type[] parameterTypes, Type returnType) + public static int GetHashCode(Type? declaringType, Type[] parameterTypes, Type returnType) { - int hashcode = declaringType.GetHashCode(); - hashcode = int.RotateLeft(hashcode, 5); + int hashcode = 0; + if (declaringType is not null) + { + hashcode = int.RotateLeft(declaringType.GetHashCode(), 5); + } - hashcode ^= returnType.GetHashCode(); - hashcode = int.RotateLeft(hashcode, 5); + hashcode = int.RotateLeft(hashcode ^ returnType.GetHashCode(), 5); for (int i = 0; i < parameterTypes.Length; i++) { - hashcode ^= parameterTypes[i].GetHashCode(); - hashcode = int.RotateLeft(hashcode, 5); + hashcode = int.RotateLeft(hashcode ^ parameterTypes[i].GetHashCode(), 5); } // We don't include _isStatic in the hashcode because it is already included with _declaringType==typeof(void). @@ -90,7 +91,7 @@ public static int GetHashCode(Type declaringType, Type[] parameterTypes, Type re /// internal readonly ref struct InvokeSignatureInfoKey { - internal readonly Type _declaringType; + internal readonly Type? _declaringType; internal readonly Type[] _parameterTypes; internal readonly Type _returnType; internal readonly bool _isStatic; @@ -104,7 +105,7 @@ public static InvokeSignatureInfoKey CreateNormalized(Type declaringType, Type[] isStatic); } - public InvokeSignatureInfoKey(Type declaringType, Type[] parameterTypes, Type returnType, bool isStatic) + public InvokeSignatureInfoKey(Type? declaringType, Type[] parameterTypes, Type returnType, bool isStatic) { _declaringType = declaringType; _parameterTypes = parameterTypes; @@ -112,7 +113,7 @@ public InvokeSignatureInfoKey(Type declaringType, Type[] parameterTypes, Type re _isStatic = isStatic; } - public Type DeclaringType => _declaringType; + public Type? DeclaringType => _declaringType; public Type[] ParameterTypes => _parameterTypes; public Type ReturnType => _returnType; public bool IsStatic => _isStatic; diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index c4d8dddbc026ce..7943227619b8b2 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -165,12 +165,12 @@ private static DynamicMethod CreateDynamicMethod(MethodBase? method, in InvokeSi skipVisibility: true); // Supports creating the delegate immediately when calling CreateDelegate(). } - private static void EmitLdargForInstance(ILGenerator il, MethodBase? method, bool isStatic, Type declaringType) + private static void EmitLdargForInstance(ILGenerator il, MethodBase? method, bool isStatic, Type? declaringType) { if (method is not RuntimeConstructorInfo && !isStatic) { il.Emit(OpCodes.Ldarg_0); - if (declaringType.IsValueType) + if (declaringType!.IsValueType) { il.Emit(OpCodes.Unbox, declaringType); } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index 7017304b11c7b0..7b41b6825f1a5c 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; @@ -10,7 +9,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading; -using System.Collections.Concurrent; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.InvokeSignatureInfo; using static System.Reflection.MethodBase; @@ -30,7 +28,7 @@ internal sealed partial class MethodBaseInvoker internal const int MaxStackAllocArgCount = 4; private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. - private readonly RuntimeType _declaringType; + private readonly RuntimeType? _declaringType; private readonly IntPtr _functionPointer; // This will be Zero when not using calli. private readonly Delegate _invokeFunc; private readonly InvokerArgFlags[] _invokerArgFlags; @@ -41,7 +39,7 @@ internal sealed partial class MethodBaseInvoker public MethodBaseInvoker(MethodBase method, RuntimeType[] parameterTypes, Type returnType) { _method = method; - _declaringType = (RuntimeType)method.DeclaringType!; + _declaringType = (RuntimeType?)_method.DeclaringType; _parameterTypes = parameterTypes; _argCount = parameterTypes.Length; @@ -57,13 +55,14 @@ public MethodBaseInvoker(MethodBase method, RuntimeType[] parameterTypes, Type r _invokeFunc ??= CreateInvokeDelegateForInterpreted(); + if (_functionPointer != IntPtr.Zero && method is RuntimeConstructorInfo) + { #if MONO - _shouldAllocate = _functionPointer != IntPtr.Zero && method is RuntimeConstructorInfo; + _shouldAllocate = true; #else - _allocator = _functionPointer != IntPtr.Zero && method is RuntimeConstructorInfo ? - _declaringType.GetOrCreateCacheEntry() : - null; + _allocator = _declaringType!.GetOrCreateCacheEntry(); #endif + } } internal InvokerStrategy Strategy => _strategy; @@ -111,13 +110,20 @@ internal static void ThrowTargetParameterCountException() try { - if (ShouldAllocate) + if (_strategy == InvokerStrategy.Obj1) { - obj ??= CreateUninitializedObject(); - ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); - return obj; + if (ShouldAllocate) + { + obj ??= CreateUninitializedObject(); + ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); + return obj; + } + + return obj = ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); } - return obj = ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); + + // This method may be called directly, and the interpreted path needs to use the byref strategies. + return InvokeWith1Arg(obj, parameter); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -125,6 +131,28 @@ internal static void ThrowTargetParameterCountException() } } + private unsafe object? InvokeWith1Arg(object? obj, object? parameter) + { + Debug.Assert(UseInterpretedPath); + Debug.Assert(_strategy == InvokerStrategy.Ref4); + + StackAllocatedByRefs byrefs = default; + IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; + + *(ByReference*)(pByRefFixedStorage) = (_invokerArgFlags[0] & InvokerArgFlags.IsValueType) != 0 ? + ByReference.Create(ref parameter!.GetRawData()) : + ByReference.Create(ref Unsafe.AsRef(ref parameter)); + + if (ShouldAllocate) + { + obj ??= CreateUninitializedObject(); + ((InvokeFunc_RefArgs) _invokeFunc) (obj, _functionPointer, pByRefFixedStorage); + return obj; + } + + return ((InvokeFunc_RefArgs) _invokeFunc) (obj, _functionPointer, pByRefFixedStorage); + } + internal unsafe object? InvokeWith1Arg( object? obj, BindingFlags invokeAttr, @@ -263,11 +291,26 @@ internal static void ThrowTargetParameterCountException() object? obj, BindingFlags invokeAttr, Binder? binder, - object?[] parameters, + object?[]? parameters, CultureInfo? culture) { Debug.Assert(_argCount <= MaxStackAllocArgCount); + if (_argCount == 0) + { + // This method may be called from the interpreted path for a property getter with parameters==null. + Debug.Assert(UseInterpretedPath); + Debug.Assert(_strategy == InvokerStrategy.Ref4); + try + { + return ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, refArguments: null); + } + catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) + { + throw new TargetInvocationException(e); + } + } + StackAllocatedArgumentsWithCopyBack stackArgStorage = default; Span copyOfArgs = (Span)stackArgStorage._args; Span shouldCopyBack = (Span)stackArgStorage._shouldCopyBack; @@ -281,9 +324,7 @@ internal static void ThrowTargetParameterCountException() { *(ByReference*)(pByRefFixedStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? ByReference.Create(ref copyOfArgs[i]!.GetRawData()) : -#pragma warning disable CS9080 - ByReference.Create(ref copyOfArgs[i]); -#pragma warning restore CS9080 + ByReference.Create(ref Unsafe.AsRef(ref copyOfArgs[i])); } object? ret; @@ -305,7 +346,7 @@ internal static void ThrowTargetParameterCountException() throw new TargetInvocationException(e); } - CopyBack(parameters, copyOfArgs, shouldCopyBack); + CopyBack(parameters!, copyOfArgs, shouldCopyBack); return ret; } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index a92b8c6ae1dfeb..6fc9156a2ef824 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -139,6 +139,11 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu MethodBaseInvoker.ThrowTargetParameterCountException(); } + if (_strategy == InvokerStrategy.Ref4) + { + return InvokeWithRefArgs4(obj, Span.Empty); + } + return ((InvokeFunc_Obj0Args)_invokeFunc!)(obj, _functionPointer); } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index 1089d590f785fd..e03e8f15949956 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -27,27 +27,31 @@ internal static void Initialize( { invokerArgFlags = GetInvokerArgFlags(parameterTypes, out bool needsByRefStrategy); strategy = GetInvokerStrategy(parameterTypes.Length, needsByRefStrategy); - RuntimeType declaringType = (RuntimeType)method.DeclaringType!; - if (UseCalli(method)) + if (UseInterpretedPath) + { + functionPointer = IntPtr.Zero; + invokeFunc = null; // This will be created differently by each invoker class. + } + else if (UseCalli(method)) { functionPointer = method.MethodHandle.GetFunctionPointer(); if (CanCache(method)) { - InvokeSignatureInfoKey key = InvokeSignatureInfoKey.CreateNormalized(declaringType, parameterTypes, returnType, method.IsStatic); + InvokeSignatureInfoKey key = InvokeSignatureInfoKey.CreateNormalized((RuntimeType)method.DeclaringType!, parameterTypes, returnType, method.IsStatic); invokeFunc = GetWellKnownInvokeFunc(key, strategy); invokeFunc ??= GetOrCreateInvokeFunc(isForInvokerClasses, key, strategy); } else { - InvokeSignatureInfoKey signatureInfo = new(declaringType, parameterTypes, returnType, method.IsStatic); + InvokeSignatureInfoKey signatureInfo = new((RuntimeType)method.DeclaringType!, parameterTypes, returnType, method.IsStatic); invokeFunc = CreateInvokeFunc(isForInvokerClasses, method: null, signatureInfo, strategy); } } else { functionPointer = IntPtr.Zero; - InvokeSignatureInfoKey signatureInfo = new(declaringType, parameterTypes, returnType, method.IsStatic); + InvokeSignatureInfoKey signatureInfo = new((RuntimeType?)method.DeclaringType, parameterTypes, returnType, method.IsStatic); invokeFunc = CreateInvokeFunc(isForInvokerClasses, method, signatureInfo, strategy); } } @@ -101,7 +105,9 @@ private static InvokerArgFlags[] GetInvokerArgFlags(RuntimeType[] parameterTypes internal static bool UseCalli(MethodBase method) { - if (UseInterpretedPath) + Debug.Assert(!UseInterpretedPath); + + if (method is DynamicMethod) { return false; } @@ -156,7 +162,6 @@ private static InvokerStrategy GetInvokerStrategy(int argCount, bool needsByRefS { if (needsByRefStrategy || UseInterpretedPath) { - // Always use the native interpreted invoke. return argCount <= 4 ? InvokerStrategy.Ref4 : InvokerStrategy.RefMany; } @@ -171,15 +176,10 @@ private static InvokerStrategy GetInvokerStrategy(int argCount, bool needsByRefS internal static Delegate? CreateInvokeFunc(bool isForInvokerClasses, MethodBase? method, in InvokeSignatureInfoKey signatureInfo, InvokerStrategy strategy) { - if (UseInterpretedPath) - { - // The interpreted invoke function is created by the invoker classes since each one has different logic. - return null; - } + Debug.Assert(!UseInterpretedPath); bool backwardsCompat = method is null ? false : !isForInvokerClasses; - // // IL Path return strategy switch { InvokerStrategy.Obj0 => CreateInvokeDelegateForObj0Args(method, signatureInfo, backwardsCompat), diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs index b9cd77454c71f7..0d476495cac45c 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs @@ -133,7 +133,7 @@ internal void ThrowNoInvokeException() MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters, culture), _ => Invoker.InvokeWithManyRefArgs(obj, invokeAttr, binder, parameters!, culture) }; @@ -165,7 +165,7 @@ public override object Invoke(BindingFlags invokeAttr, Binder? binder, object?[] MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj: null, invokeAttr, binder, parameters!, culture)!, MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj: null, invokeAttr, binder, parameters!, culture)!, MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj: null, invokeAttr, binder, parameters!, culture)!, - MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj: null, invokeAttr, binder, parameters!, culture)!, + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj: null, invokeAttr, binder, parameters, culture)!, _ => Invoker.InvokeWithManyRefArgs(obj : null, invokeAttr, binder, parameters!, culture)! }; } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs index 8605830ac63011..0c48a8ff09134b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs @@ -126,7 +126,7 @@ internal void ThrowNoInvokeException() MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters, culture), _ => Invoker.InvokeWithManyRefArgs(obj, invokeAttr, binder, parameters!, culture) }; } diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs index 10ee472f1ecb93..43e4d4611a9e0e 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs @@ -17,7 +17,7 @@ internal partial class MethodBaseInvoker [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2072:UnrecognizedReflectionPattern", Justification = "Internal reflection implementation")] [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2077:UnrecognizedReflectionPattern", Justification = "Internal reflection implementation")] [MethodImpl(MethodImplOptions.AggressiveInlining)] - private object CreateUninitializedObject() => RuntimeHelpers.GetUninitializedObject(_declaringType); + private object CreateUninitializedObject() => RuntimeHelpers.GetUninitializedObject(_declaringType!); private unsafe Delegate CreateInvokeDelegateForInterpreted() { From c7b5336f76f7373cac7fc0f838dc31130cb2f50e Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Mon, 18 Nov 2024 11:23:15 -0600 Subject: [PATCH 09/24] Address build and some test issues --- .../tests/StackFrameTests.cs | 10 ++++++---- .../src/System/Reflection/MethodBaseInvoker.cs | 1 - .../src/System/Reflection/MethodInvoker.cs | 2 +- .../src/System/Reflection/MethodInvokerCommon.cs | 6 +++--- .../System.Reflection.Tests/ConstructorInvokerTests.cs | 5 ++--- .../src/System/Reflection/ConstructorInvoker.Mono.cs | 1 - .../src/System/Reflection/MethodBaseInvoker.Mono.cs | 1 - 7 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/libraries/System.Diagnostics.StackTrace/tests/StackFrameTests.cs b/src/libraries/System.Diagnostics.StackTrace/tests/StackFrameTests.cs index b8f225f33d8cf0..9ef82ab13795f4 100644 --- a/src/libraries/System.Diagnostics.StackTrace/tests/StackFrameTests.cs +++ b/src/libraries/System.Diagnostics.StackTrace/tests/StackFrameTests.cs @@ -37,10 +37,12 @@ public void Ctor_FNeedFileInfo(bool fNeedFileInfo) [Theory] [ActiveIssue("https://github.com/mono/mono/issues/15183", TestRuntimes.Mono)] - [InlineData(StackFrame.OFFSET_UNKNOWN)] - [InlineData(0)] - [InlineData(1)] - public void Ctor_SkipFrames(int skipFrames) + [InlineData(StackFrame.OFFSET_UNKNOWN, false)] + [InlineData(0, false)] + [InlineData(1, false)] + // This is highly dependent on reflection implementation and may not be consistent across runtimes. + // The extra 'bool _' parameter is to avoid a reflection optimization that would have added an extra frame. + public void Ctor_SkipFrames(int skipFrames, bool _) { var stackFrame = new StackFrame(skipFrames); VerifyStackFrame(stackFrame, true, skipFrames, typeof(StackFrameTests).GetMethod(nameof(Ctor_SkipFrames)), isCurrentFrame: skipFrames == 0); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index 7b41b6825f1a5c..29a938d673ba6d 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -166,7 +166,6 @@ internal static void ThrowTargetParameterCountException() bool copyBack = false; object? arg1 = parameters[0]; - object? copyBackArg1 = arg1; CheckArgument(ref arg1, ref copyBack, 0, binder, culture, invokeAttr); try diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index 6fc9156a2ef824..6c6b98def6c05a 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -72,7 +72,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu { _method = method; - if ((invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers)) != 0) + if ((invocationFlags & (InvocationFlags.NoInvoke | InvocationFlags.ContainsStackPointers | InvocationFlags.NoConstructorInvoke)) != 0) { _invokeFunc = null!; _invokerArgFlags = null!; diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index e03e8f15949956..78c6449ebb328a 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -112,12 +112,12 @@ internal static bool UseCalli(MethodBase method) return false; } - Type declaringType = method.DeclaringType!; + RuntimeType declaringType = (RuntimeType)method.DeclaringType!; if (method is RuntimeConstructorInfo) { - // Strings and arrays require initialization through newobj. - return !ReferenceEquals(declaringType, typeof(string)) && !declaringType.IsArray; + // Strings, arrays and Nullable require initialization through newobj. + return !ReferenceEquals(declaringType, typeof(string)) && !declaringType.IsArray && !declaringType.IsNullableOfT; } if (declaringType.IsValueType) diff --git a/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs b/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs index f940193f0aed0b..cd9a61af207aeb 100644 --- a/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs +++ b/src/libraries/System.Runtime/tests/System.Reflection.Tests/ConstructorInvokerTests.cs @@ -270,9 +270,8 @@ public void Invoke_StaticConstructor_NullObject_NullParameters() ConstructorInfo[] constructors = GetConstructors(typeof(ClassWithStaticConstructor)); Assert.Equal(1, constructors.Length); - int before = ClassWithStaticConstructor._intValue; - Invoke(constructors[0], null, new object[] { }); - Assert.Equal(before + 1, ClassWithStaticConstructor._intValue); + // Invoker classes do not support calling class constructors; use standard reflection for that. + Assert.Throws(() => Invoke(constructors[0], null, new object[] { })); } private class TestClass diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs index 2feeaa892485f0..fc91c8cf2e9df1 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs @@ -15,7 +15,6 @@ public partial class ConstructorInvoker private bool _shouldAllocate; private bool ShouldAllocate => _shouldAllocate; - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2072:UnrecognizedReflectionPattern", Justification = "Internal reflection implementation")] [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2077:UnrecognizedReflectionPattern", Justification = "Internal reflection implementation")] [MethodImpl(MethodImplOptions.AggressiveInlining)] private object CreateUninitializedObject() => RuntimeHelpers.GetUninitializedObject(_declaringType); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs index 43e4d4611a9e0e..714e3b2fb4d1ef 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.Mono.cs @@ -14,7 +14,6 @@ internal partial class MethodBaseInvoker private bool _shouldAllocate; private bool ShouldAllocate => _shouldAllocate; - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2072:UnrecognizedReflectionPattern", Justification = "Internal reflection implementation")] [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2077:UnrecognizedReflectionPattern", Justification = "Internal reflection implementation")] [MethodImpl(MethodImplOptions.AggressiveInlining)] private object CreateUninitializedObject() => RuntimeHelpers.GetUninitializedObject(_declaringType!); From eb37b878b854e5bb9232b9ec792f4b24b161a1ed Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Mon, 18 Nov 2024 14:44:12 -0600 Subject: [PATCH 10/24] Address a test issue with generics --- .../src/System/Reflection/MethodInvokerCommon.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index 78c6449ebb328a..125288bbe20f5b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -114,10 +114,16 @@ internal static bool UseCalli(MethodBase method) RuntimeType declaringType = (RuntimeType)method.DeclaringType!; + if (declaringType.IsGenericType) + { + // Generic types require newobj\call\callvirt. + return false; + } + if (method is RuntimeConstructorInfo) { - // Strings, arrays and Nullable require initialization through newobj. - return !ReferenceEquals(declaringType, typeof(string)) && !declaringType.IsArray && !declaringType.IsNullableOfT; + // Strings and arrays require initialization through newobj. + return !ReferenceEquals(declaringType, typeof(string)) && !declaringType.IsArray; } if (declaringType.IsValueType) From b0f8a58e194078b459e12078c375610b8443a4e3 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Fri, 22 Nov 2024 10:48:50 -0600 Subject: [PATCH 11/24] Misc cleanup; disable well-known method impl for now --- .../Reflection/RuntimeMethodInfo.CoreCLR.cs | 2 +- .../System/Reflection/ConstructorInvoker.cs | 65 ++++++-- .../src/System/Reflection/InvokerEmitUtil.cs | 89 +++++++---- .../System/Reflection/MethodBaseInvoker.cs | 140 +++++++++++------- .../src/System/Reflection/MethodInvoker.cs | 88 ++++++----- ...MethodInvokerCommon.WellKnownSignatures.cs | 24 ++- .../System/Reflection/MethodInvokerCommon.cs | 115 ++++++-------- .../Reflection/RuntimeConstructorInfo.cs | 15 +- 8 files changed, 320 insertions(+), 218 deletions(-) diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs index 3b2c8eabab0f2f..9e8a362aeb3645 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.CoreCLR.cs @@ -311,7 +311,7 @@ internal void InvokePropertySetter(object? obj, BindingFlags invokeAttr, Binder? throw new TargetParameterCountException(SR.Arg_ParmCnt); } - Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameter, culture); + Invoker.InvokePropertySetter(obj, invokeAttr, binder, parameter, culture); } #endregion diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index 6a643427975adb..c13f2a4e6b3d5e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -145,7 +145,7 @@ public object Invoke() } /// - /// Invokes the constructor using the specified parameters. + /// Invokes the constructor using the specified arguments. /// /// /// The first argument for the invoked method. @@ -168,7 +168,7 @@ public object Invoke(object? arg1) if (_strategy == InvokerStrategy.Ref4) { - return InvokeWithRefArgs4(new Span(new object?[] { arg1 })); + return InvokeWithRefArgs4(arg1); } if (ShouldAllocate) @@ -198,7 +198,7 @@ public object Invoke(object? arg1, object? arg2) if (_strategy == InvokerStrategy.Ref4) { - return InvokeWithRefArgs4(new Span(new object?[] { arg1, arg2 })); + return InvokeWithRefArgs4(arg1, arg2); } return InvokeImpl(arg1, arg2, null, null); @@ -222,7 +222,7 @@ public object Invoke(object? arg1, object? arg2, object? arg3) if (_strategy == InvokerStrategy.Ref4) { - return InvokeWithRefArgs4(new Span(new object?[] { arg1, arg2, arg3 })); + return InvokeWithRefArgs4(arg1, arg2, arg3); } return InvokeImpl(arg1, arg2, arg3, null); @@ -247,7 +247,7 @@ public object Invoke(object? arg1, object? arg2, object? arg3, object? arg4) if (_strategy == InvokerStrategy.Ref4) { - return InvokeWithRefArgs4(new Span(new object?[] { arg1, arg2, arg3, arg4 })); + return InvokeWithRefArgs4(arg1, arg2, arg3, arg4); } return InvokeImpl(arg1, arg2, arg3, arg4); @@ -255,11 +255,6 @@ public object Invoke(object? arg1, object? arg2, object? arg3, object? arg4) private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4) { - if (_invokeFunc is null) - { - _method.ThrowNoInvokeException(); - } - switch (_argCount) { case 4: @@ -345,7 +340,8 @@ public object Invoke(Span arguments) } } - internal unsafe object InvokeWithSpanArgs(Span arguments) + // Version with no copy-back. + private unsafe object InvokeWithSpanArgs(Span arguments) { if (_invokeFunc is null) { @@ -356,7 +352,6 @@ internal unsafe object InvokeWithSpanArgs(Span arguments) Span copyOfArgs; GCFrameRegistration regArgStorage; - IntPtr* pArgStorage = stackalloc IntPtr[_argCount]; NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr)); copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); @@ -393,7 +388,45 @@ internal unsafe object InvokeWithSpanArgs(Span arguments) return obj; } - internal unsafe object InvokeWithRefArgs4(Span arguments) + // Version with no copy-back + private unsafe object InvokeWithRefArgs4(object? arg1, object? arg2 = null, object? arg3 = null, object? arg4 = null) + { + if (_invokeFunc is null) + { + _method.ThrowNoInvokeException(); + } + + StackAllocatedArguments stackStorage = new(arg1, arg2, arg3, arg4); + Span arguments = ((Span)(stackStorage._args)).Slice(0, _argCount); + StackAllocatedByRefs byrefs = default; + IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; + + for (int i = 0; i < _argCount; i++) + { + CheckArgument(ref arguments[i], i); + + *(ByReference*)(pByRefFixedStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? + ByReference.Create(ref arguments[i]!.GetRawData()) : +#pragma warning disable CS9080 + ByReference.Create(ref arguments[i]); +#pragma warning restore CS9080 + } + + object obj; + if (ShouldAllocate) + { + obj = CreateUninitializedObject(); + ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); + } + else + { + obj = ((InvokeFunc_RefArgs)_invokeFunc)(obj: null, _functionPointer, pByRefFixedStorage)!; + } + + return obj; + } + + private unsafe object InvokeWithRefArgs4(Span arguments) { if (_invokeFunc is null) { @@ -436,7 +469,7 @@ internal unsafe object InvokeWithRefArgs4(Span arguments) return obj; } - internal unsafe object InvokeWithRefArgsMany(Span arguments) + private unsafe object InvokeWithRefArgsMany(Span arguments) { if (_invokeFunc is null) { @@ -495,8 +528,8 @@ internal unsafe object InvokeWithRefArgsMany(Span arguments) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - // Copy modified values out. This is only done with ByRef parameters. - internal void CopyBack(Span dest, ReadOnlySpan copyOfParameters, ReadOnlySpan shouldCopyBack) + // Copy modified values out. This is only done with ByRef arguments. + private void CopyBack(Span dest, ReadOnlySpan copyOfParameters, ReadOnlySpan shouldCopyBack) { for (int i = 0; i < dest.Length; i++) { diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index 7943227619b8b2..6b8763579feeed 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -18,39 +18,39 @@ internal static class InvokerEmitUtil internal delegate object? InvokeFunc_ObjSpanArgs(object? obj, IntPtr functionPointer, Span arguments); internal unsafe delegate object? InvokeFunc_RefArgs(object? obj, IntPtr functionPointer, IntPtr* refArguments); - public static unsafe InvokeFunc_Obj0Args CreateInvokeDelegateForObj0Args(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_Obj0Args CreateInvokeDelegateForObj0Args(MethodBase? method, bool callCtorAsMethod, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, method, signatureInfo.IsStatic, signatureInfo.DeclaringType); - EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); + EmitLdargForInstance(il, method, callCtorAsMethod, signatureInfo); + EmitCall(il, method, callCtorAsMethod, signatureInfo, backwardsCompat); EmitReturnHandling(il, method is RuntimeConstructorInfo ? method.DeclaringType! : signatureInfo.ReturnType); return (InvokeFunc_Obj0Args)dm.CreateDelegate(typeof(InvokeFunc_Obj0Args), target: null); } - public static unsafe InvokeFunc_Obj1Arg CreateInvokeDelegateForObj1Arg(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_Obj1Arg CreateInvokeDelegateForObj1Arg(MethodBase? method, bool callCtorAsMethod, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(object)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, method, signatureInfo.IsStatic, signatureInfo.DeclaringType); + EmitLdargForInstance(il, method, callCtorAsMethod, signatureInfo); Debug.Assert(signatureInfo.ParameterTypes.Length == 1); il.Emit(OpCodes.Ldarg_2); UnboxSpecialType(il, (RuntimeType)signatureInfo.ParameterTypes[0]); - EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); - EmitReturnHandling(il, method is RuntimeConstructorInfo ? method.DeclaringType! : signatureInfo.ReturnType); + EmitCall(il, method, callCtorAsMethod, signatureInfo, backwardsCompat); + EmitReturnHandling(il, GetReturnType(method, callCtorAsMethod, signatureInfo)); return (InvokeFunc_Obj1Arg)dm.CreateDelegate(typeof(InvokeFunc_Obj1Arg), target: null); } - public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegateForObj4Args(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegateForObj4Args(MethodBase? method, bool callCtorAsMethod, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(object), typeof(object), typeof(object), typeof(object)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, method, signatureInfo.IsStatic, signatureInfo.DeclaringType); + EmitLdargForInstance(il, method, callCtorAsMethod, signatureInfo); ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; for (int i = 0; i < parameterTypes.Length; i++) @@ -73,17 +73,17 @@ public static unsafe InvokeFunc_Obj4Args CreateInvokeDelegateForObj4Args(MethodB UnboxSpecialType(il, parameterType); } - EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); - EmitReturnHandling(il, method is RuntimeConstructorInfo ? method.DeclaringType! : signatureInfo.ReturnType); + EmitCall(il, method, callCtorAsMethod, signatureInfo, backwardsCompat); + EmitReturnHandling(il, GetReturnType(method, callCtorAsMethod, signatureInfo)); return (InvokeFunc_Obj4Args)dm.CreateDelegate(typeof(InvokeFunc_Obj4Args), target: null); } - public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegateForObjSpanArgs(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegateForObjSpanArgs(MethodBase? method, bool callCtorAsMethod, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(Span)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, method, signatureInfo.IsStatic, signatureInfo.DeclaringType); + EmitLdargForInstance(il, method, callCtorAsMethod, signatureInfo); ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; for (int i = 0; i < parameterTypes.Length; i++) @@ -98,17 +98,17 @@ public static unsafe InvokeFunc_ObjSpanArgs CreateInvokeDelegateForObjSpanArgs(M UnboxSpecialType(il, parameterType); } - EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); - EmitReturnHandling(il, method is RuntimeConstructorInfo ? method.DeclaringType! : signatureInfo.ReturnType); + EmitCall(il, method, callCtorAsMethod, signatureInfo, backwardsCompat); + EmitReturnHandling(il, GetReturnType(method, callCtorAsMethod, signatureInfo)); return (InvokeFunc_ObjSpanArgs)dm.CreateDelegate(typeof(InvokeFunc_ObjSpanArgs), target: null); } - public static unsafe InvokeFunc_RefArgs CreateInvokeDelegateForRefArgs(MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) + public static unsafe InvokeFunc_RefArgs CreateInvokeDelegateForRefArgs(MethodBase? method, bool callCtorAsMethod, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { DynamicMethod dm = CreateDynamicMethod(method, signatureInfo, [typeof(object), typeof(IntPtr), typeof(IntPtr*)]); ILGenerator il = dm.GetILGenerator(); - EmitLdargForInstance(il, method, signatureInfo.IsStatic, signatureInfo.DeclaringType); + EmitLdargForInstance(il, method, callCtorAsMethod, signatureInfo); ReadOnlySpan parameterTypes = signatureInfo.ParameterTypes; for (int i = 0; i < parameterTypes.Length; i++) @@ -129,8 +129,8 @@ public static unsafe InvokeFunc_RefArgs CreateInvokeDelegateForRefArgs(MethodBas } } - EmitCall(il, method, signatureInfo, signatureInfo.IsStatic, backwardsCompat); - EmitReturnHandling(il, method is RuntimeConstructorInfo ? method.DeclaringType! : signatureInfo.ReturnType); + EmitCall(il, method, callCtorAsMethod, signatureInfo, backwardsCompat); + EmitReturnHandling(il, GetReturnType(method, callCtorAsMethod, signatureInfo)); return (InvokeFunc_RefArgs)dm.CreateDelegate(typeof(InvokeFunc_RefArgs), target: null); } @@ -165,26 +165,37 @@ private static DynamicMethod CreateDynamicMethod(MethodBase? method, in InvokeSi skipVisibility: true); // Supports creating the delegate immediately when calling CreateDelegate(). } - private static void EmitLdargForInstance(ILGenerator il, MethodBase? method, bool isStatic, Type? declaringType) + private static void EmitLdargForInstance(ILGenerator il, MethodBase? method, bool callCtorAsMethod, in InvokeSignatureInfoKey signatureInfo) { - if (method is not RuntimeConstructorInfo && !isStatic) + if (method is RuntimeConstructorInfo) + { + if (callCtorAsMethod) + { + EmitLdArg0(signatureInfo); + } + } + else if (!signatureInfo.IsStatic) + { + EmitLdArg0(signatureInfo); + } + + void EmitLdArg0(in InvokeSignatureInfoKey signatureInfo) { il.Emit(OpCodes.Ldarg_0); - if (declaringType!.IsValueType) + if (signatureInfo.DeclaringType!.IsValueType) { - il.Emit(OpCodes.Unbox, declaringType); + il.Emit(OpCodes.Unbox, signatureInfo.DeclaringType); } } } - private static void EmitCall(ILGenerator il, MethodBase? method, in InvokeSignatureInfoKey signatureInfo, bool isStatic, bool backwardsCompat) + private static void EmitCall(ILGenerator il, MethodBase? method, bool callCtorAsMethod, in InvokeSignatureInfoKey signatureInfo, bool backwardsCompat) { if (method is null) { // Use calli - CallingConventions callingConventions = CallingConventions.Standard; - if (!isStatic) + if (!signatureInfo.IsStatic) { callingConventions |= CallingConventions.HasThis; } @@ -208,7 +219,15 @@ private static void EmitCall(ILGenerator il, MethodBase? method, in InvokeSignat if (method is RuntimeConstructorInfo rci) { - il.Emit(OpCodes.Newobj, rci); + if (callCtorAsMethod) + { + il.Emit(OpCodes.Call, rci); + il.Emit(OpCodes.Ldnull); + } + else + { + il.Emit(OpCodes.Newobj, rci); + } } else if (method.IsStatic || method.DeclaringType!.IsValueType) { @@ -220,6 +239,22 @@ private static void EmitCall(ILGenerator il, MethodBase? method, in InvokeSignat } } + private static Type GetReturnType(MethodBase? method, bool callCtorAsMethod, in InvokeSignatureInfoKey signatureInfo) + { + if (method is RuntimeConstructorInfo rci) + { + if (callCtorAsMethod) + { + // We return null in in this case. + return typeof(object); + } + + return rci.DeclaringType!; + } + + return signatureInfo.ReturnType; + } + private static void EmitReturnHandling(ILGenerator il, Type returnType) { if (returnType == typeof(void)) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index 29a938d673ba6d..338652c9ce10bb 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -31,12 +31,13 @@ internal sealed partial class MethodBaseInvoker private readonly RuntimeType? _declaringType; private readonly IntPtr _functionPointer; // This will be Zero when not using calli. private readonly Delegate _invokeFunc; + private volatile MethodBaseInvoker? _invokerForCallingCtorAsMethod; private readonly InvokerArgFlags[] _invokerArgFlags; private readonly MethodBase _method; private readonly RuntimeType[] _parameterTypes; private readonly InvokerStrategy _strategy; - public MethodBaseInvoker(MethodBase method, RuntimeType[] parameterTypes, Type returnType) + public MethodBaseInvoker(MethodBase method, RuntimeType[] parameterTypes, Type returnType, bool callCtorAsMethod = false) { _method = method; _declaringType = (RuntimeType?)_method.DeclaringType; @@ -65,6 +66,48 @@ public MethodBaseInvoker(MethodBase method, RuntimeType[] parameterTypes, Type r } } + // A clone constructor for calling a constructor as a method where the incoming obj parameter is specified. + private MethodBaseInvoker(MethodBaseInvoker other) + { + Debug.Assert(other._method is RuntimeConstructorInfo); + + _argCount = other._argCount; + _declaringType = other._declaringType; + _functionPointer = other._functionPointer; + _invokeFunc = other._invokeFunc; + _invokerArgFlags = other._invokerArgFlags; + _method = other._method; + _parameterTypes = other._parameterTypes; + _strategy = other._strategy; + + if (_functionPointer != IntPtr.Zero) + { +#if MONO + _shouldAllocate = false; +#else + _allocator = null; +#endif + } + else + { + InvokeSignatureInfoKey signatureInfo = new((RuntimeType?)_method.DeclaringType, _parameterTypes, returnType: typeof(void), isStatic: false); + _invokeFunc = CreateIlInvokeFunc(isForInvokerClasses: false, _method, callCtorAsMethod: true, signatureInfo, _strategy); + } + } + + public MethodBaseInvoker GetInvokerForCallingCtorAsMethod() + { + Debug.Assert(_method is RuntimeConstructorInfo); + + MethodBaseInvoker? invoker = _invokerForCallingCtorAsMethod; + if (invoker is null) + { + _invokerForCallingCtorAsMethod = invoker = new MethodBaseInvoker(this); + } + + return invoker; + } + internal InvokerStrategy Strategy => _strategy; [DoesNotReturn] @@ -81,7 +124,8 @@ internal static void ThrowTargetParameterCountException() { if (ShouldAllocate) { - obj ??= CreateUninitializedObject(); + Debug.Assert(obj is null); + obj = CreateUninitializedObject(); ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); return obj; } @@ -94,36 +138,27 @@ internal static void ThrowTargetParameterCountException() } } - internal unsafe object? InvokeWith1Arg( + internal unsafe object? InvokePropertySetter( object? obj, BindingFlags invokeAttr, Binder? binder, - object? parameter, + object? arg, CultureInfo? culture) { Debug.Assert(_argCount == 1); - RuntimeType sigType = (RuntimeType)_parameterTypes[0]; - bool _ = false; - CheckArgument(ref parameter, ref _, 0, binder, culture, invokeAttr); + CheckArgument(ref arg, ref _, 0, binder, culture, invokeAttr); try { if (_strategy == InvokerStrategy.Obj1) { - if (ShouldAllocate) - { - obj ??= CreateUninitializedObject(); - ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); - return obj; - } - - return obj = ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, parameter); + return ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, arg); } // This method may be called directly, and the interpreted path needs to use the byref strategies. - return InvokeWith1Arg(obj, parameter); + return InvokePropertySetter(obj, arg); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { @@ -131,7 +166,8 @@ internal static void ThrowTargetParameterCountException() } } - private unsafe object? InvokeWith1Arg(object? obj, object? parameter) + // Slower path that removes the stack allocs from the caller. + private unsafe object? InvokePropertySetter(object? obj, object? arg) { Debug.Assert(UseInterpretedPath); Debug.Assert(_strategy == InvokerStrategy.Ref4); @@ -140,15 +176,8 @@ internal static void ThrowTargetParameterCountException() IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; *(ByReference*)(pByRefFixedStorage) = (_invokerArgFlags[0] & InvokerArgFlags.IsValueType) != 0 ? - ByReference.Create(ref parameter!.GetRawData()) : - ByReference.Create(ref Unsafe.AsRef(ref parameter)); - - if (ShouldAllocate) - { - obj ??= CreateUninitializedObject(); - ((InvokeFunc_RefArgs) _invokeFunc) (obj, _functionPointer, pByRefFixedStorage); - return obj; - } + ByReference.Create(ref arg!.GetRawData()) : + ByReference.Create(ref Unsafe.AsRef(ref arg)); return ((InvokeFunc_RefArgs) _invokeFunc) (obj, _functionPointer, pByRefFixedStorage); } @@ -157,22 +186,21 @@ internal static void ThrowTargetParameterCountException() object? obj, BindingFlags invokeAttr, Binder? binder, - object?[] parameters, + object?[] arguments, CultureInfo? culture) { Debug.Assert(_argCount == 1); - RuntimeType sigType = (RuntimeType)_parameterTypes[0]; - bool copyBack = false; - object? arg1 = parameters[0]; + object? arg1 = arguments[0]; CheckArgument(ref arg1, ref copyBack, 0, binder, culture, invokeAttr); try { if (ShouldAllocate) { - obj ??= CreateUninitializedObject(); + Debug.Assert(obj is null); + obj = CreateUninitializedObject(); ((InvokeFunc_Obj1Arg)_invokeFunc)!(obj, _functionPointer, arg1); } else @@ -187,7 +215,7 @@ internal static void ThrowTargetParameterCountException() if (copyBack) { - CopyBack(parameters, new Span(ref arg1), new Span(ref copyBack)); + CopyBack(arguments, new Span(ref arg1), new Span(ref copyBack)); } return obj; @@ -197,7 +225,7 @@ internal static void ThrowTargetParameterCountException() object? obj, BindingFlags invokeAttr, Binder? binder, - object?[] parameters, + object?[] arguments, CultureInfo? culture) { Debug.Assert(_argCount <= MaxStackAllocArgCount); @@ -206,9 +234,9 @@ internal static void ThrowTargetParameterCountException() Span copyOfArgs = (Span)stackArgStorage._args; Span shouldCopyBack = (Span)stackArgStorage._shouldCopyBack; - for (int i = 0; i < parameters.Length; i++) + for (int i = 0; i < arguments.Length; i++) { - copyOfArgs[i] = parameters[i]; + copyOfArgs[i] = arguments[i]; CheckArgument(ref copyOfArgs[i], ref shouldCopyBack[i], i, binder, culture, invokeAttr); } @@ -216,7 +244,8 @@ internal static void ThrowTargetParameterCountException() { if (ShouldAllocate) { - obj ??= CreateUninitializedObject(); + Debug.Assert(obj is null); + obj = CreateUninitializedObject(); ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, copyOfArgs[0], copyOfArgs[1], copyOfArgs[2], copyOfArgs[3]); } else @@ -229,7 +258,7 @@ internal static void ThrowTargetParameterCountException() throw new TargetInvocationException(e); } - CopyBack(parameters, copyOfArgs, shouldCopyBack); + CopyBack(arguments, copyOfArgs, shouldCopyBack); return obj; } @@ -238,7 +267,7 @@ internal static void ThrowTargetParameterCountException() object? obj, BindingFlags invokeAttr, Binder? binder, - object?[] parameters, + object?[] arguments, CultureInfo? culture) { Debug.Assert(_argCount > MaxStackAllocArgCount); @@ -257,13 +286,14 @@ internal static void ThrowTargetParameterCountException() try { GCFrameRegistration.RegisterForGCReporting(®ArgStorage); - CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); + CheckArguments(arguments, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); try { if (ShouldAllocate) { - obj ??= CreateUninitializedObject(); + Debug.Assert(obj is null); + obj = CreateUninitializedObject(); ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); ret = obj; } @@ -277,7 +307,7 @@ internal static void ThrowTargetParameterCountException() throw new TargetInvocationException(e); } - CopyBack(parameters, copyOfArgs, shouldCopyBack); + CopyBack(arguments, copyOfArgs, shouldCopyBack); return ret; } finally @@ -290,14 +320,14 @@ internal static void ThrowTargetParameterCountException() object? obj, BindingFlags invokeAttr, Binder? binder, - object?[]? parameters, + object?[]? arguments, CultureInfo? culture) { Debug.Assert(_argCount <= MaxStackAllocArgCount); if (_argCount == 0) { - // This method may be called from the interpreted path for a property getter with parameters==null. + // This method may be called from the interpreted path for a property getter with arguments==null. Debug.Assert(UseInterpretedPath); Debug.Assert(_strategy == InvokerStrategy.Ref4); try @@ -317,7 +347,7 @@ internal static void ThrowTargetParameterCountException() StackAllocatedByRefs byrefs = default; IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; - CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); + CheckArguments(arguments, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); for (int i = 0; i < _argCount; i++) { @@ -331,7 +361,8 @@ internal static void ThrowTargetParameterCountException() { if (ShouldAllocate) { - obj ??= CreateUninitializedObject(); + Debug.Assert(obj is null); + obj = CreateUninitializedObject(); ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); ret = obj; } @@ -345,7 +376,7 @@ internal static void ThrowTargetParameterCountException() throw new TargetInvocationException(e); } - CopyBack(parameters!, copyOfArgs, shouldCopyBack); + CopyBack(arguments!, copyOfArgs, shouldCopyBack); return ret; } @@ -353,7 +384,7 @@ internal static void ThrowTargetParameterCountException() object? obj, BindingFlags invokeAttr, Binder? binder, - object?[] parameters, + object?[] arguments, CultureInfo? culture) { Debug.Assert(_argCount > MaxStackAllocArgCount); @@ -373,7 +404,7 @@ internal static void ThrowTargetParameterCountException() GCFrameRegistration.RegisterForGCReporting(®ArgStorage); GCFrameRegistration.RegisterForGCReporting(®ByRefStorage); - CheckArguments(parameters, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); + CheckArguments(arguments, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); for (int i = 0; i < _argCount; i++) { @@ -386,7 +417,8 @@ internal static void ThrowTargetParameterCountException() { if (ShouldAllocate) { - obj ??= CreateUninitializedObject(); + Debug.Assert(obj is null); + obj = CreateUninitializedObject(); ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); ret = obj; } @@ -400,7 +432,7 @@ internal static void ThrowTargetParameterCountException() throw new TargetInvocationException(e); } - CopyBack(parameters, copyOfArgs, shouldCopyBack); + CopyBack(arguments, copyOfArgs, shouldCopyBack); } finally { @@ -411,7 +443,7 @@ internal static void ThrowTargetParameterCountException() return ret; } - // Copy modified values out. This is done with ByRef, Type.Missing and parameters changed by the Binder. + // Copy modified values out. This is done with ByRef, Type.Missing and arguments changed by the Binder. [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void CopyBack(object?[] dest, Span copyOfParameters, Span shouldCopyBack) { @@ -478,16 +510,16 @@ internal void CheckArgument( [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void CheckArguments( - ReadOnlySpan parameters, + ReadOnlySpan arguments, Span copyOfParameters, Span shouldCopyBack, Binder? binder, CultureInfo? culture, BindingFlags invokeAttr) { - for (int i = 0; i < parameters.Length; i++) + for (int i = 0; i < arguments.Length; i++) { - object? arg = parameters[i]; + object? arg = arguments[i]; RuntimeType sigType = (RuntimeType)_parameterTypes[i]; // Convert a Type.Missing to the default value. diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index 6c6b98def6c05a..53cee36356c8c0 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -172,7 +172,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu if (_strategy == InvokerStrategy.Ref4) { - return InvokeWithRefArgs4(obj, new Span(new object?[] { arg1 })); + return InvokeWithRefArgs4(obj, new Span(ref arg1)); } CheckArgument(ref arg1, 0); @@ -190,6 +190,11 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu ThrowNoInvokeException(); } + if (!_method.IsStatic) + { + ValidateInvokeTarget(obj, _method); + } + if (_argCount != 2) { MethodBaseInvoker.ThrowTargetParameterCountException(); @@ -197,7 +202,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu if (_strategy == InvokerStrategy.Ref4) { - return InvokeWithRefArgs4(obj, new Span(new object?[] { arg1, arg2 })); + return InvokeWithRefArgs4(obj, arg1, arg2); } return InvokeImpl(obj, arg1, arg2, null, null); @@ -215,6 +220,11 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu ThrowNoInvokeException(); } + if (!_method.IsStatic) + { + ValidateInvokeTarget(obj, _method); + } + if (_argCount != 3) { MethodBaseInvoker.ThrowTargetParameterCountException(); @@ -222,7 +232,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu if (_strategy == InvokerStrategy.Ref4) { - return InvokeWithRefArgs4(obj, new Span(new object?[] { arg1, arg2, arg3 })); + return InvokeWithRefArgs4(obj, arg1, arg2, arg3); } return InvokeImpl(obj, arg1, arg2, arg3, null); @@ -241,6 +251,11 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu ThrowNoInvokeException(); } + if (!_method.IsStatic) + { + ValidateInvokeTarget(obj, _method); + } + if (_argCount != 4) { MethodBaseInvoker.ThrowTargetParameterCountException(); @@ -248,7 +263,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu if (_strategy == InvokerStrategy.Ref4) { - return InvokeWithRefArgs4(obj, new Span(new object?[] { arg1, arg2, arg3, arg4 })); + return InvokeWithRefArgs4(obj, arg1, arg2, arg3, arg4); } return InvokeImpl(obj, arg1, arg2, arg3, arg4); @@ -256,11 +271,6 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu private object? InvokeImpl(object? obj, object? arg1, object? arg2, object? arg3, object? arg4) { - if (!_method.IsStatic) - { - ValidateInvokeTarget(obj, _method); - } - switch (_argCount) { case 4: @@ -332,25 +342,9 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu } } - [DoesNotReturn] - private void ThrowForBadInvocationFlags() + // Version with no copy-back + private unsafe object? InvokeWithSpanArgs(object? obj, Span arguments) { - if (_method is RuntimeMethodInfo rmi) - { - rmi.ThrowNoInvokeException(); - } - - Debug.Assert(_method is RuntimeConstructorInfo); - ((RuntimeConstructorInfo)_method).ThrowNoInvokeException(); - } - - internal unsafe object? InvokeWithSpanArgs(object? obj, Span arguments) - { - if (_invokeFunc is null) - { - ThrowForBadInvocationFlags(); - } - Span copyOfArgs; GCFrameRegistration regArgStorage; @@ -370,7 +364,7 @@ private void ThrowForBadInvocationFlags() copyOfArgs[i] = arg; } - return ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + return ((InvokeFunc_ObjSpanArgs)_invokeFunc!)(obj, _functionPointer, copyOfArgs); // No need to call CopyBack here since there are no ref values. } finally @@ -379,13 +373,30 @@ private void ThrowForBadInvocationFlags() } } - internal unsafe object? InvokeWithRefArgs4(object? obj, Span arguments) + // Version with no copy-back + private unsafe object? InvokeWithRefArgs4(object? obj, object? arg1, object? arg2, object? arg3 = null, object? arg4 = null) { - if (_invokeFunc is null) + StackAllocatedArguments stackStorage = new(arg1, arg2, arg3, arg4); + Span arguments = ((Span)(stackStorage._args)).Slice(0, _argCount); + StackAllocatedByRefs byrefs = default; + IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; + + for (int i = 0; i < _argCount; i++) { - ThrowForBadInvocationFlags(); + CheckArgument(ref arguments[i], i); + + *(ByReference*)(pByRefFixedStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? + ByReference.Create(ref arguments[i]!.GetRawData()) : +#pragma warning disable CS9080 + ByReference.Create(ref arguments[i]); +#pragma warning restore CS9080 } + return ((InvokeFunc_RefArgs)_invokeFunc!)(obj, _functionPointer, pByRefFixedStorage); + } + + private unsafe object? InvokeWithRefArgs4(object? obj, Span arguments) + { Debug.Assert(_argCount <= MaxStackAllocArgCount); StackAllocatedArgumentsWithCopyBack stackArgStorage = default; @@ -407,18 +418,13 @@ private void ThrowForBadInvocationFlags() #pragma warning restore CS9080 } - object? ret = ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); + object? ret = ((InvokeFunc_RefArgs)_invokeFunc!)(obj, _functionPointer, pByRefFixedStorage); CopyBack(arguments, copyOfArgs, shouldCopyBack); return ret; } - internal unsafe object? InvokeWithRefArgsMany(object? obj, Span arguments) + private unsafe object? InvokeWithRefArgsMany(object? obj, Span arguments) { - if (_invokeFunc is null) - { - ThrowForBadInvocationFlags(); - } - Span copyOfArgs; GCFrameRegistration regArgStorage; @@ -447,7 +453,7 @@ private void ThrowForBadInvocationFlags() ByReference.Create(ref Unsafe.AsRef(pStorage + i)); } - object? ret = ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); + object? ret = ((InvokeFunc_RefArgs)_invokeFunc!)(obj, _functionPointer, pByRefStorage); CopyBack(arguments, copyOfArgs, shouldCopyBack); return ret; } @@ -459,8 +465,8 @@ private void ThrowForBadInvocationFlags() } [MethodImpl(MethodImplOptions.AggressiveInlining)] - // Copy modified values out. This is only done with ByRef parameters. - internal void CopyBack(Span dest, Span copyOfParameters, Span shouldCopyBack) + // Copy modified values out. This is only done with ByRef arguments. + private void CopyBack(Span dest, Span copyOfParameters, Span shouldCopyBack) { for (int i = 0; i < dest.Length; i++) { diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs index 85d36bebd9804a..b0cd109291691b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs @@ -15,6 +15,14 @@ internal static partial class MethodInvokerCommon { Debug.Assert(signatureInfo.ParameterTypes.Length == 0); + return null; + + // This approach uses function pointers to call an instance method, which isn't supported + // due to the HasThis calling convention not present in the function pointer signature and + // currently no support by the delegate* syntax to specify that calling convention. + // Todo: change to hard-coding the startup-specific types and methods. + + /* if (signatureInfo.DeclaringType != typeof(object)) { // Only reference types are supported. @@ -56,6 +64,7 @@ internal static partial class MethodInvokerCommon if (retType == typeof(System.Diagnostics.Tracing.EventTask)) return new InvokeFunc_Obj0Args(CallFunc0); return null; + */ } /// @@ -65,6 +74,14 @@ internal static partial class MethodInvokerCommon { Debug.Assert(signatureInfo.ParameterTypes.Length == 1); + return null; + + // This approach uses function pointers to call an instance method, which isn't supported + // due to the HasThis calling convention not present in the function pointer signature and + // currently no support by the delegate* syntax to specify that calling convention. + // Todo: change to hard-coding the startup-specific types and methods. + + /* if (signatureInfo.DeclaringType != typeof(object) || signatureInfo.ReturnType != typeof(void)) { // Only reference types and methods with no return are supported. @@ -105,10 +122,11 @@ internal static partial class MethodInvokerCommon if (argType == typeof(Diagnostics.Tracing.EventTask)) return new InvokeFunc_Obj1Arg(CallAction1); return null; + */ } - private static unsafe object? CallAction0(object? o, IntPtr f) { ((delegate* managed)f)(o); return null; } - private static unsafe object? CallAction1(object? o, IntPtr f, object? a) { ((delegate* managed)f)(o, (TArg1)a!); return null; } - private static unsafe object? CallFunc0(object? o, IntPtr f) => ((delegate* managed)f)(o); + //private static unsafe object? CallAction0(object? o, IntPtr f) { ((delegate* managed)f)(o); return null; } + //private static unsafe object? CallAction1(object? o, IntPtr f, object? a) { ((delegate* managed)f)(o, (TArg1)a!); return null; } + //private static unsafe object? CallFunc0(object? o, IntPtr f) => ((delegate* managed)f)(o); } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index 125288bbe20f5b..e89444cfec93da 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -30,29 +30,22 @@ internal static void Initialize( if (UseInterpretedPath) { + // The caller will create the invokeFunc; each of the 3 invoker classes have a different implementation. + invokeFunc = null; functionPointer = IntPtr.Zero; - invokeFunc = null; // This will be created differently by each invoker class. } else if (UseCalli(method)) { + InvokeSignatureInfoKey key = InvokeSignatureInfoKey.CreateNormalized((RuntimeType)method.DeclaringType!, parameterTypes, returnType, method.IsStatic); + invokeFunc = GetWellKnownInvokeFunc(key, strategy); + invokeFunc ??= GetOrCreateInvokeFunc(isForInvokerClasses, key, strategy); functionPointer = method.MethodHandle.GetFunctionPointer(); - if (CanCache(method)) - { - InvokeSignatureInfoKey key = InvokeSignatureInfoKey.CreateNormalized((RuntimeType)method.DeclaringType!, parameterTypes, returnType, method.IsStatic); - invokeFunc = GetWellKnownInvokeFunc(key, strategy); - invokeFunc ??= GetOrCreateInvokeFunc(isForInvokerClasses, key, strategy); - } - else - { - InvokeSignatureInfoKey signatureInfo = new((RuntimeType)method.DeclaringType!, parameterTypes, returnType, method.IsStatic); - invokeFunc = CreateInvokeFunc(isForInvokerClasses, method: null, signatureInfo, strategy); - } } else { - functionPointer = IntPtr.Zero; InvokeSignatureInfoKey signatureInfo = new((RuntimeType?)method.DeclaringType, parameterTypes, returnType, method.IsStatic); - invokeFunc = CreateInvokeFunc(isForInvokerClasses, method, signatureInfo, strategy); + invokeFunc = CreateIlInvokeFunc(isForInvokerClasses, method, callCtorAsMethod: false, signatureInfo, strategy); + functionPointer = IntPtr.Zero; } } @@ -103,64 +96,48 @@ private static InvokerArgFlags[] GetInvokerArgFlags(RuntimeType[] parameterTypes return invokerFlags; } - internal static bool UseCalli(MethodBase method) + private static bool UseCalli(MethodBase method) { - Debug.Assert(!UseInterpretedPath); - - if (method is DynamicMethod) - { - return false; - } - - RuntimeType declaringType = (RuntimeType)method.DeclaringType!; - - if (declaringType.IsGenericType) - { - // Generic types require newobj\call\callvirt. - return false; - } - - if (method is RuntimeConstructorInfo) - { - // Strings and arrays require initialization through newobj. - return !ReferenceEquals(declaringType, typeof(string)) && !declaringType.IsArray; - } + return SupportsCalli(method) && CanCache(method); - if (declaringType.IsValueType) + static bool SupportsCalli(MethodBase method) { - // For value types, calli is not supported for virtual methods (e.g. ToString()). - return !method.IsVirtual; - } - - // If not polymorphic and thus can be called with a calli instruction. - return !method.IsVirtual || declaringType.IsSealed || method.IsFinal; - } + if (method is DynamicMethod) + { + return false; + } - private static bool CanCache(MethodBase method) - { - return CanCacheDynamicMethod(method) && !HasDefaultParameterValues(method); + RuntimeType declaringType = (RuntimeType)method.DeclaringType!; - static bool CanCacheDynamicMethod(MethodBase method) => - // The cache method's DeclaringType and other collectible parameters would be referenced. - !method.DeclaringType!.Assembly.IsCollectible && - // An instance method on a value type needs to be unbox which requires its type in IL, so caching would not be very sharable. - !(method.DeclaringType!.IsValueType && !method.IsStatic); + if (declaringType.IsGenericType || method.IsGenericMethod) + { + // Generic types require newobj\call\callvirt. + return false; + } - // Supporting default values would increase cache memory usage and slow down the common case - // since the default values would have to be cached as well. - static bool HasDefaultParameterValues(MethodBase method) - { - ReadOnlySpan parameters = method.GetParametersAsSpan(); + if (method is RuntimeConstructorInfo) + { + // Strings and arrays require initialization through newobj. + return !ReferenceEquals(declaringType, typeof(string)) && !declaringType.IsArray; + } - for (int i = 0; i < parameters.Length; i++) + if (declaringType.IsValueType) { - if (parameters[i].HasDefaultValue) - { - return true; - } + // For value types, calli is not supported for virtual methods (e.g. ToString()). + return !method.IsVirtual; } - return false; + // If not polymorphic and thus can be called with a calli instruction. + return !method.IsVirtual || declaringType.IsSealed || method.IsFinal; + } + + static bool CanCache(MethodBase method) + { + return + // The cache method's DeclaringType and other collectible parameters would be referenced. + !method.DeclaringType!.Assembly.IsCollectible && + // An instance method on a value type needs to be unbox which requires its type in IL, so caching would not be very sharable. + !(method.DeclaringType!.IsValueType && !method.IsStatic); } } @@ -180,7 +157,7 @@ private static InvokerStrategy GetInvokerStrategy(int argCount, bool needsByRefS }; } - internal static Delegate? CreateInvokeFunc(bool isForInvokerClasses, MethodBase? method, in InvokeSignatureInfoKey signatureInfo, InvokerStrategy strategy) + internal static Delegate CreateIlInvokeFunc(bool isForInvokerClasses, MethodBase? method, bool callCtorAsMethod, in InvokeSignatureInfoKey signatureInfo, InvokerStrategy strategy) { Debug.Assert(!UseInterpretedPath); @@ -188,11 +165,11 @@ private static InvokerStrategy GetInvokerStrategy(int argCount, bool needsByRefS return strategy switch { - InvokerStrategy.Obj0 => CreateInvokeDelegateForObj0Args(method, signatureInfo, backwardsCompat), - InvokerStrategy.Obj1 => CreateInvokeDelegateForObj1Arg(method, signatureInfo, backwardsCompat), - InvokerStrategy.Obj4 => CreateInvokeDelegateForObj4Args(method, signatureInfo, backwardsCompat), - InvokerStrategy.ObjSpan => CreateInvokeDelegateForObjSpanArgs(method, signatureInfo, backwardsCompat), - _ => CreateInvokeDelegateForRefArgs(method, signatureInfo, backwardsCompat) + InvokerStrategy.Obj0 => CreateInvokeDelegateForObj0Args(method, callCtorAsMethod, signatureInfo, backwardsCompat), + InvokerStrategy.Obj1 => CreateInvokeDelegateForObj1Arg(method, callCtorAsMethod, signatureInfo, backwardsCompat), + InvokerStrategy.Obj4 => CreateInvokeDelegateForObj4Args(method, callCtorAsMethod, signatureInfo, backwardsCompat), + InvokerStrategy.ObjSpan => CreateInvokeDelegateForObjSpanArgs(method, callCtorAsMethod, signatureInfo, backwardsCompat), + _ => CreateInvokeDelegateForRefArgs(method, callCtorAsMethod, signatureInfo, backwardsCompat) }; } @@ -235,7 +212,7 @@ internal static Delegate GetOrCreateInvokeFunc( } // To minimize the lock scope, create the new delegate outside the lock even though it may not be used. - Delegate newInvokeFunc = CreateInvokeFunc(isForInvokerClasses, method: null, key, strategy)!; + Delegate newInvokeFunc = CreateIlInvokeFunc(isForInvokerClasses, method: null, callCtorAsMethod: false, key, strategy)!; bool lockTaken = false; try { diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs index 0d476495cac45c..39b621f8b25f8d 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs @@ -127,14 +127,15 @@ internal void ThrowNoInvokeException() return null; } - _ = Invoker.Strategy switch + MethodBaseInvoker invoker = Invoker.GetInvokerForCallingCtorAsMethod(); + _ = invoker.Strategy switch { - MethodBase.InvokerStrategy.Obj0 => Invoker.InvokeWithNoArgs(obj, invokeAttr), - MethodBase.InvokerStrategy.Obj1 => Invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.Obj4 => Invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.ObjSpan => Invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), - MethodBase.InvokerStrategy.Ref4 => Invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters, culture), - _ => Invoker.InvokeWithManyRefArgs(obj, invokeAttr, binder, parameters!, culture) + MethodBase.InvokerStrategy.Obj0 => invoker.InvokeWithNoArgs(obj, invokeAttr), + MethodBase.InvokerStrategy.Obj1 => invoker.InvokeWith1Arg(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Obj4 => invoker.InvokeWith4Args(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.ObjSpan => invoker.InvokeWithSpanArgs(obj, invokeAttr, binder, parameters!, culture), + MethodBase.InvokerStrategy.Ref4 => invoker.InvokeWith4RefArgs(obj, invokeAttr, binder, parameters, culture), + _ => invoker.InvokeWithManyRefArgs(obj, invokeAttr, binder, parameters!, culture) }; return null; From c16d6910652d90d1253c52fe3ba021ca4cb32578 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Sun, 24 Nov 2024 16:30:26 -0600 Subject: [PATCH 12/24] Add back well-known types --- .../System/Reflection/InvokeEmitTests.cs | 4 +- .../System/Reflection/InvokeSignatureInfo.cs | 3 +- .../src/System/Reflection/MethodBase.cs | 14 +- ...MethodInvokerCommon.WellKnownSignatures.cs | 162 ++++++------------ .../System/Reflection/MethodInvokerCommon.cs | 124 ++++++++------ .../InvokeEmit/runtimeconfig.template.json | 5 - 6 files changed, 132 insertions(+), 180 deletions(-) delete mode 100644 src/libraries/System.Runtime/tests/System.Reflection.Tests/InvokeEmit/runtimeconfig.template.json diff --git a/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs b/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs index 73469cdd51406a..ee9fd685b5fc3f 100644 --- a/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs +++ b/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs @@ -17,7 +17,6 @@ public static void VerifyInvokeIsUsingEmit_Method() Assert.Contains("Here", exInner.ToString()); Assert.Contains("InvokeStub_ (Object, IntPtr)", exInner.ToString()); - Assert.DoesNotContain("InterpretedInvoke_Method", exInner.ToString()); } [ConditionalFact(typeof(InvokeEmitTests), nameof(IsEmitInvokeSupported))] @@ -28,8 +27,7 @@ public static void VerifyInvokeIsUsingEmit_Constructor() Exception exInner = ex.InnerException; Assert.Contains("Here", exInner.ToString()); - Assert.Contains("MethodInvokerCommon.CallAction0(Object o, IntPtr f)", exInner.ToString()); - Assert.DoesNotContain("InterpretedInvoke_Constructor", exInner.ToString()); + Assert.Contains("InvokeStub_ (Object, IntPtr)", exInner.ToString()); } private static bool IsEmitInvokeSupported() diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs index ea1fbffdba285e..d75b4fc070635e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs @@ -81,7 +81,8 @@ public static int GetHashCode(Type? declaringType, Type[] parameterTypes, Type r hashcode = int.RotateLeft(hashcode ^ parameterTypes[i].GetHashCode(), 5); } - // We don't include _isStatic in the hashcode because it is already included with _declaringType==typeof(void). + // We don't include _isStatic because for normalized methods it is already included with _declaringType==typeof(void) + // and for unnormalized methods it is not possible to have an instance and static method with the same name. return hashcode; } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs index df32621d1e7acc..f762138f3ea557 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs @@ -171,35 +171,37 @@ internal static void ThrowHelperArgumentExceptionVariableMissing() => internal enum InvokerStrategy { + Uninitialized = 0, + /// /// Optimized for no arguments. /// - Obj0 = 0, + Obj0 = 1, /// /// Optimized for 1 argument. /// - Obj1 = 1, + Obj1 = 2, /// /// Optimized for 4 arguments or less. /// - Obj4 = 2, + Obj4 = 3, /// /// Optimized for 5 arguments or more. /// - ObjSpan = 3, + ObjSpan = 4, /// /// Slower approach that handles copy back for 4 arguments or less. /// - Ref4 = 4, + Ref4 = 5, /// /// Slower approach that handles copy back for 5 or more arguments. /// - RefMany = 5, + RefMany = 6, } [Flags] diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs index b0cd109291691b..7c38f699af665b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs @@ -1,132 +1,78 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; using static System.Reflection.InvokerEmitUtil; +using static System.Reflection.MethodBase; namespace System.Reflection { internal static partial class MethodInvokerCommon { - /// - /// Returns a delegate that can be used to invoke a method with no arguments which are typically property getters. - /// - public static Delegate? GetWellKnownSignatureFor0Args(in InvokeSignatureInfoKey signatureInfo) + private static bool TryGetWellKnownInvokeFunc(MethodBase method, out Delegate? invokeFunc, out InvokerStrategy strategy) { - Debug.Assert(signatureInfo.ParameterTypes.Length == 0); + Type declaringType = method.DeclaringType!; + invokeFunc = null; - return null; - - // This approach uses function pointers to call an instance method, which isn't supported - // due to the HasThis calling convention not present in the function pointer signature and - // currently no support by the delegate* syntax to specify that calling convention. - // Todo: change to hard-coding the startup-specific types and methods. - - /* - if (signatureInfo.DeclaringType != typeof(object)) - { - // Only reference types are supported. - return null; - } - - Type retType = signatureInfo.ReturnType; - - if (!ReferenceEquals(retType.Assembly, typeof(object).Assembly)) + if (ReferenceEquals(declaringType, typeof(EventAttribute))) { - // We can only hard-code types in this assembly. - return null; + switch (method.Name) + { + case "set_Keywords": + invokeFunc = new InvokeFunc_Obj1Arg(EventAttributeKeywordsSetter); + break; + case "set_Level": + invokeFunc = new InvokeFunc_Obj1Arg(EventAttributeLevelSetter); + break; + case "set_Opcode": + invokeFunc = new InvokeFunc_Obj1Arg(EventAttributeOpcodeSetter); + break; + case "set_Message": + invokeFunc = new InvokeFunc_Obj1Arg(EventAttributeMessageSetter); + break; + case "set_Task": + invokeFunc = new InvokeFunc_Obj1Arg(EventAttributeTaskSetter); + break; + case "set_Version": + invokeFunc = new InvokeFunc_Obj1Arg(EventAttributeVersionSetter); + break; + } } - - if (retType == typeof(bool)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(byte)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(char)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(DateTime)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(DateTimeOffset)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(decimal)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(double)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(float)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(Guid)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(int)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(IntPtr)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(long)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(object)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(sbyte)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(short)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(uint)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(UIntPtr)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(ulong)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(ushort)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(void)) return new InvokeFunc_Obj0Args(CallAction0); - // System.Diagnostics.Tracing is used during startup. - if (retType == typeof(System.Diagnostics.Tracing.EventKeywords)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(System.Diagnostics.Tracing.EventLevel)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(System.Diagnostics.Tracing.EventOpcode)) return new InvokeFunc_Obj0Args(CallFunc0); - if (retType == typeof(System.Diagnostics.Tracing.EventTask)) return new InvokeFunc_Obj0Args(CallFunc0); - - return null; - */ - } - - /// - /// Returns a delegate that can be used to invoke a method with a single argument and no return which are typically property setters. - /// - public static Delegate? GetWellKnownSignatureFor1Arg(in InvokeSignatureInfoKey signatureInfo) - { - Debug.Assert(signatureInfo.ParameterTypes.Length == 1); - - return null; - - // This approach uses function pointers to call an instance method, which isn't supported - // due to the HasThis calling convention not present in the function pointer signature and - // currently no support by the delegate* syntax to specify that calling convention. - // Todo: change to hard-coding the startup-specific types and methods. - - /* - if (signatureInfo.DeclaringType != typeof(object) || signatureInfo.ReturnType != typeof(void)) + else if (ReferenceEquals(declaringType, typeof(EventSourceAttribute))) { - // Only reference types and methods with no return are supported. - return null; + switch (method.Name) + { + case "set_Guid": + invokeFunc = new InvokeFunc_Obj1Arg(EventSourceAttributeGuidSetter); + break; + case "set_Name": + invokeFunc = new InvokeFunc_Obj1Arg(EventSourceAttributeNameSetter); + break; + } } - Type argType = signatureInfo.ParameterTypes[0]; + // Todo: add other well-known methods here for scenarios other than minimal app. - if (!ReferenceEquals(argType.Assembly, typeof(object).Assembly)) + if (invokeFunc is not null) { - // We can only hard-code types in this assembly. - return null; + // Currently we only have property setters. + strategy = InvokerStrategy.Obj1; + return true; } - if (argType == typeof(bool)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(byte)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(char)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(DateTime)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(DateTimeOffset)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(decimal)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(double)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(float)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(Guid)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(int)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(IntPtr)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(long)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(object)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(sbyte)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(short)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(uint)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(UIntPtr)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(ulong)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(ushort)) return new InvokeFunc_Obj1Arg(CallAction1); - // System.Diagnostics.Tracing is used during startup. - if (argType == typeof(Diagnostics.Tracing.EventKeywords)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(Diagnostics.Tracing.EventLevel)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(Diagnostics.Tracing.EventOpcode)) return new InvokeFunc_Obj1Arg(CallAction1); - if (argType == typeof(Diagnostics.Tracing.EventTask)) return new InvokeFunc_Obj1Arg(CallAction1); - - return null; - */ + strategy = InvokerStrategy.Uninitialized; + return false; } - //private static unsafe object? CallAction0(object? o, IntPtr f) { ((delegate* managed)f)(o); return null; } - //private static unsafe object? CallAction1(object? o, IntPtr f, object? a) { ((delegate* managed)f)(o, (TArg1)a!); return null; } - //private static unsafe object? CallFunc0(object? o, IntPtr f) => ((delegate* managed)f)(o); + private static object? EventAttributeKeywordsSetter(object? o, IntPtr _, object? v) { ((EventAttribute)o!).Keywords = (EventKeywords)v!; return null; } + private static object? EventAttributeLevelSetter(object? o, IntPtr _, object? v) { ((EventAttribute)o!).Level = (EventLevel)v!; return null; } + private static object? EventAttributeOpcodeSetter(object? o, IntPtr _, object? v) { ((EventAttribute)o!).Opcode = (EventOpcode)v!; return null; } + private static object? EventAttributeMessageSetter(object? o, IntPtr _, object? v) { ((EventAttribute)o!).Message = (string?)v; return null; } + private static object? EventAttributeTaskSetter(object? o, IntPtr _, object? v) { ((EventAttribute)o!).Task = (EventTask)v!; return null; } + private static object? EventAttributeVersionSetter(object? o, IntPtr _, object? v) { ((EventAttribute)o!).Version = (byte)v!; return null; } + + private static object? EventSourceAttributeGuidSetter(object? o, IntPtr _, object? v) { ((EventSourceAttribute)o!).Guid = (string?)v; return null; } + private static object? EventSourceAttributeNameSetter(object? o, IntPtr _, object? v) { ((EventSourceAttribute)o!).Name = (string?)v; return null; } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index e89444cfec93da..f32fe14f68af10 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -2,8 +2,12 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Reflection.Emit; +using System.Runtime.InteropServices; using System.Threading; +using Internal; +using static System.Reflection.Associates; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; using static System.RuntimeType; @@ -13,7 +17,8 @@ namespace System.Reflection internal static partial class MethodInvokerCommon { private static CerHashtable s_invokerFuncs; - private static object? s_invokerFuncsLock; + private static object s_invokerFuncsLock = new object(); + private static bool s_wellKnownCacheAbandoned; internal static void Initialize( bool isForInvokerClasses, @@ -26,6 +31,19 @@ internal static void Initialize( out InvokerArgFlags[] invokerArgFlags) { invokerArgFlags = GetInvokerArgFlags(parameterTypes, out bool needsByRefStrategy); + + // The well-known cache it is abandoned after a miss to avoid the cost of checking each time. + if (!s_wellKnownCacheAbandoned) + { + if (TryGetWellKnownInvokeFunc(method, out invokeFunc, out strategy)) + { + functionPointer = IntPtr.Zero; + return; + } + + s_wellKnownCacheAbandoned = true; + } + strategy = GetInvokerStrategy(parameterTypes.Length, needsByRefStrategy); if (UseInterpretedPath) @@ -36,13 +54,13 @@ internal static void Initialize( } else if (UseCalli(method)) { - InvokeSignatureInfoKey key = InvokeSignatureInfoKey.CreateNormalized((RuntimeType)method.DeclaringType!, parameterTypes, returnType, method.IsStatic); - invokeFunc = GetWellKnownInvokeFunc(key, strategy); - invokeFunc ??= GetOrCreateInvokeFunc(isForInvokerClasses, key, strategy); + // Re-purpose ForceEmitInvoke to mean "do not use calli"; useful for debugging and performance comparisons. + invokeFunc = GetOrCreateInvokeFunc(isForInvokerClasses, method, parameterTypes, returnType, strategy); functionPointer = method.MethodHandle.GetFunctionPointer(); } else { + //ReflectionInvokeEventSource.Log.NewMemberNotCached(method.DeclaringType!.Name, method.Name); InvokeSignatureInfoKey signatureInfo = new((RuntimeType?)method.DeclaringType, parameterTypes, returnType, method.IsStatic); invokeFunc = CreateIlInvokeFunc(isForInvokerClasses, method, callCtorAsMethod: false, signatureInfo, strategy); functionPointer = IntPtr.Zero; @@ -109,26 +127,37 @@ static bool SupportsCalli(MethodBase method) RuntimeType declaringType = (RuntimeType)method.DeclaringType!; + // Generic types require newobj\call\callvirt. if (declaringType.IsGenericType || method.IsGenericMethod) { - // Generic types require newobj\call\callvirt. return false; } + // Strings and arrays require initialization through newobj. if (method is RuntimeConstructorInfo) { - // Strings and arrays require initialization through newobj. - return !ReferenceEquals(declaringType, typeof(string)) && !declaringType.IsArray; + if (ReferenceEquals(declaringType, typeof(string)) || declaringType.IsArray) + { + return false; + } } - - if (declaringType.IsValueType) + else { - // For value types, calli is not supported for virtual methods (e.g. ToString()). - return !method.IsVirtual; + // If not polymorphic. + // For value types, calli is not supported for object-based virtual methods (e.g. ToString()). + if (method.IsVirtual && (declaringType.IsValueType || (!declaringType.IsSealed && !method.IsFinal))) + { + return false; + } + + // Error case; let the runtime handle it. + if (method.IsStatic && method.GetCustomAttribute() is not null) + { + return false; + } } - // If not polymorphic and thus can be called with a calli instruction. - return !method.IsVirtual || declaringType.IsSealed || method.IsFinal; + return true; } static bool CanCache(MethodBase method) @@ -173,26 +202,14 @@ internal static Delegate CreateIlInvokeFunc(bool isForInvokerClasses, MethodBase }; } - internal static Delegate? GetWellKnownInvokeFunc(in InvokeSignatureInfoKey signatureInfo, InvokerStrategy strategy) - { - // Check if the method has a well-known signature that can be invoked directly using calli and a function pointer. - switch (strategy) - { - case InvokerStrategy.Obj0: - return GetWellKnownSignatureFor0Args(signatureInfo); - case InvokerStrategy.Obj1: - return GetWellKnownSignatureFor1Arg(signatureInfo); - } - - return null; - } - - internal static Delegate GetOrCreateInvokeFunc( + private static Delegate GetOrCreateInvokeFunc( bool isForInvokerClasses, - InvokeSignatureInfoKey key, + MethodBase method, + RuntimeType[] parameterTypes, + Type returnType, InvokerStrategy strategy) { - Debug.Assert(!UseInterpretedPath); + InvokeSignatureInfoKey key = InvokeSignatureInfoKey.CreateNormalized((RuntimeType)method.DeclaringType!, parameterTypes, returnType, method.IsStatic); int hashcode = key.AlternativeGetHashCode(); Delegate invokeFunc; @@ -201,37 +218,30 @@ internal static Delegate GetOrCreateInvokeFunc( invokeFunc = s_invokerFuncs.GetValue(hashcode, key, &InvokeSignatureInfoKey.AlternativeEquals); } - if (invokeFunc is not null) - { - return invokeFunc; - } - - if (s_invokerFuncsLock is null) - { - Interlocked.CompareExchange(ref s_invokerFuncsLock!, new object(), null); - } - - // To minimize the lock scope, create the new delegate outside the lock even though it may not be used. - Delegate newInvokeFunc = CreateIlInvokeFunc(isForInvokerClasses, method: null, callCtorAsMethod: false, key, strategy)!; - bool lockTaken = false; - try + if (invokeFunc is null) { - Monitor.Enter(s_invokerFuncsLock, ref lockTaken); - unsafe + // To minimize the lock scope, create the new delegate outside the lock even though it may not be used. + Delegate newInvokeFunc = CreateIlInvokeFunc(isForInvokerClasses, method: null, callCtorAsMethod: false, key, strategy)!; + bool lockTaken = false; + try { - invokeFunc = s_invokerFuncs.GetValue(hashcode, key, &InvokeSignatureInfoKey.AlternativeEquals); - } - if (invokeFunc is null) - { - s_invokerFuncs[InvokeSignatureInfo.Create(key)] = newInvokeFunc; - invokeFunc = newInvokeFunc; + Monitor.Enter(s_invokerFuncsLock, ref lockTaken); + unsafe + { + invokeFunc = s_invokerFuncs.GetValue(hashcode, key, &InvokeSignatureInfoKey.AlternativeEquals); + } + if (invokeFunc is null) + { + s_invokerFuncs[InvokeSignatureInfo.Create(key)] = newInvokeFunc; + invokeFunc = newInvokeFunc; + } } - } - finally - { - if (lockTaken) + finally { - Monitor.Exit(s_invokerFuncsLock); + if (lockTaken) + { + Monitor.Exit(s_invokerFuncsLock); + } } } diff --git a/src/libraries/System.Runtime/tests/System.Reflection.Tests/InvokeEmit/runtimeconfig.template.json b/src/libraries/System.Runtime/tests/System.Reflection.Tests/InvokeEmit/runtimeconfig.template.json deleted file mode 100644 index 4c7cde83ee5855..00000000000000 --- a/src/libraries/System.Runtime/tests/System.Reflection.Tests/InvokeEmit/runtimeconfig.template.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "configProperties": { - "Switch.System.Reflection.ForceEmitInvoke": true - } -} From 146c7d2f512fc63f78ac2258a79c3199c2759047 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Mon, 25 Nov 2024 08:26:23 -0600 Subject: [PATCH 13/24] Fix compile issue due to auto-added incorrect using --- .../src/System/Reflection/MethodInvokerCommon.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index f32fe14f68af10..8b3bcf8e52b14d 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -7,7 +7,6 @@ using System.Runtime.InteropServices; using System.Threading; using Internal; -using static System.Reflection.Associates; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; using static System.RuntimeType; From 77532edcc7112461e11088409cf57b0df1de02e5 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Mon, 25 Nov 2024 14:31:03 -0600 Subject: [PATCH 14/24] Fix a couple test cases --- .../Reflection/ConstructorInvoker.CoreCLR.cs | 1 - .../System/Reflection/ConstructorInvoker.cs | 4 --- .../System/Reflection/MethodBaseInvoker.cs | 8 +++-- .../src/System/Reflection/MethodInvoker.cs | 1 - .../System/Reflection/MethodInvokerCommon.cs | 29 +++++++------------ .../Reflection/ConstructorInvoker.Mono.cs | 2 -- 6 files changed, 15 insertions(+), 30 deletions(-) diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs index 02cc575715e13e..1d0de80f099990 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.CoreCLR.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; -using System.Reflection.Emit; using System.Runtime.CompilerServices; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index c13f2a4e6b3d5e..9fd645d42eb0d6 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -2,14 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Reflection.Emit; using System.Runtime; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using System.Threading; using static System.Reflection.InvokerEmitUtil; -using static System.Reflection.InvokeSignatureInfo; using static System.Reflection.MethodBase; using static System.Reflection.MethodInvokerCommon; using static System.RuntimeType; diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index 338652c9ce10bb..524d43a5699042 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -4,13 +4,10 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; -using System.Reflection.Emit; using System.Runtime; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using System.Threading; using static System.Reflection.InvokerEmitUtil; -using static System.Reflection.InvokeSignatureInfo; using static System.Reflection.MethodBase; using static System.Reflection.MethodInvokerCommon; using static System.RuntimeType; @@ -88,6 +85,11 @@ private MethodBaseInvoker(MethodBaseInvoker other) _allocator = null; #endif } + else if (UseInterpretedPath) + { + // The same interpreted func can be used; the incoming 'obj' parameter checked for null to determine if an alloc is needed. + _invokeFunc = other._invokeFunc; + } else { InvokeSignatureInfoKey signatureInfo = new((RuntimeType?)_method.DeclaringType, _parameterTypes, returnType: typeof(void), isStatic: false); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index 53cee36356c8c0..f99ebd9a8c8d20 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -8,7 +8,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using static System.Reflection.InvokerEmitUtil; -using static System.Reflection.InvokeSignatureInfo; using static System.Reflection.MethodBase; using static System.Reflection.MethodInvokerCommon; diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index 8b3bcf8e52b14d..b3059ad67723dc 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -2,14 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.Reflection.Emit; using System.Runtime.InteropServices; using System.Threading; -using Internal; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; -using static System.RuntimeType; namespace System.Reflection { @@ -53,13 +50,11 @@ internal static void Initialize( } else if (UseCalli(method)) { - // Re-purpose ForceEmitInvoke to mean "do not use calli"; useful for debugging and performance comparisons. invokeFunc = GetOrCreateInvokeFunc(isForInvokerClasses, method, parameterTypes, returnType, strategy); functionPointer = method.MethodHandle.GetFunctionPointer(); } else { - //ReflectionInvokeEventSource.Log.NewMemberNotCached(method.DeclaringType!.Name, method.Name); InvokeSignatureInfoKey signatureInfo = new((RuntimeType?)method.DeclaringType, parameterTypes, returnType, method.IsStatic); invokeFunc = CreateIlInvokeFunc(isForInvokerClasses, method, callCtorAsMethod: false, signatureInfo, strategy); functionPointer = IntPtr.Zero; @@ -132,18 +127,23 @@ static bool SupportsCalli(MethodBase method) return false; } - // Strings and arrays require initialization through newobj. + // Arrays have element types that are not supported by calli plus the constructor is special. + if (declaringType.IsArray) + { + return false; + } + if (method is RuntimeConstructorInfo) { - if (ReferenceEquals(declaringType, typeof(string)) || declaringType.IsArray) + // Strings require initialization through newobj. + if (ReferenceEquals(declaringType, typeof(string))) { return false; } } else { - // If not polymorphic. - // For value types, calli is not supported for object-based virtual methods (e.g. ToString()). + // Check if polymorphic. For value types, calli is not supported for object-based virtual methods (e.g. ToString()). if (method.IsVirtual && (declaringType.IsValueType || (!declaringType.IsSealed && !method.IsFinal))) { return false; @@ -221,10 +221,8 @@ private static Delegate GetOrCreateInvokeFunc( { // To minimize the lock scope, create the new delegate outside the lock even though it may not be used. Delegate newInvokeFunc = CreateIlInvokeFunc(isForInvokerClasses, method: null, callCtorAsMethod: false, key, strategy)!; - bool lockTaken = false; - try + lock (s_invokerFuncsLock) { - Monitor.Enter(s_invokerFuncsLock, ref lockTaken); unsafe { invokeFunc = s_invokerFuncs.GetValue(hashcode, key, &InvokeSignatureInfoKey.AlternativeEquals); @@ -235,13 +233,6 @@ private static Delegate GetOrCreateInvokeFunc( invokeFunc = newInvokeFunc; } } - finally - { - if (lockTaken) - { - Monitor.Exit(s_invokerFuncsLock); - } - } } return invokeFunc; diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs index fc91c8cf2e9df1..6e0b9bdb59ddb8 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs @@ -2,9 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.Reflection.Emit; -using System.Runtime.CompilerServices; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; From a0a4d46154d711f88e6941012b93d88db0289abc Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Mon, 25 Nov 2024 15:35:12 -0600 Subject: [PATCH 15/24] Fix a mono build issue --- .../src/System/Reflection/ConstructorInvoker.Mono.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs index 6e0b9bdb59ddb8..fc91c8cf2e9df1 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.Mono.cs @@ -2,7 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Reflection.Emit; +using System.Runtime.CompilerServices; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; From 2f00fffa7eb06bc36911a5858749115d5b0b8f04 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Tue, 26 Nov 2024 16:31:32 -0600 Subject: [PATCH 16/24] Address a test issue --- .../tests/System/Reflection/InvokeEmitTests.cs | 18 ++++++++---------- .../tests/DI.Tests/ActivatorUtilitiesTests.cs | 1 + .../System/Reflection/InvokeSignatureInfo.cs | 5 ----- .../src/System/Reflection/InvokerEmitUtil.cs | 2 +- .../src/System/Reflection/MethodBaseInvoker.cs | 11 +++++++++-- .../System/Reflection/MethodInvokerCommon.cs | 1 - 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs b/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs index ee9fd685b5fc3f..5009778e14b7a8 100644 --- a/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs +++ b/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs @@ -12,22 +12,20 @@ public class InvokeEmitTests public static void VerifyInvokeIsUsingEmit_Method() { MethodInfo method = typeof(TestClassThatThrows).GetMethod(nameof(TestClassThatThrows.Throw))!; - TargetInvocationException ex = Assert.Throws(() => method.Invoke(null, null)); + TargetInvocationException ex = Assert.Throws(() => method.Invoke(null, new object[] { "" })); Exception exInner = ex.InnerException; - - Assert.Contains("Here", exInner.ToString()); - Assert.Contains("InvokeStub_ (Object, IntPtr)", exInner.ToString()); + Assert.Contains("Here", ex.ToString()); + Assert.Contains("InvokeStub_", exInner.ToString()); } [ConditionalFact(typeof(InvokeEmitTests), nameof(IsEmitInvokeSupported))] public static void VerifyInvokeIsUsingEmit_Constructor() { - ConstructorInfo ctor = typeof(TestClassThatThrows).GetConstructor(Type.EmptyTypes)!; - TargetInvocationException ex = Assert.Throws(() => ctor.Invoke(null)); + ConstructorInfo ctor = typeof(TestClassThatThrows).GetConstructor(new Type[] {typeof(string)})!; + TargetInvocationException ex = Assert.Throws(() => ctor.Invoke(new object[] { "" })); Exception exInner = ex.InnerException; - Assert.Contains("Here", exInner.ToString()); - Assert.Contains("InvokeStub_ (Object, IntPtr)", exInner.ToString()); + Assert.Contains("InvokeStub_", exInner.ToString()); } private static bool IsEmitInvokeSupported() @@ -38,12 +36,12 @@ private static bool IsEmitInvokeSupported() private class TestClassThatThrows { - public TestClassThatThrows() + public TestClassThatThrows(string _) { throw new Exception("Here"); } - public static void Throw() => throw new Exception("Here"); + public static void Throw(string _) => throw new Exception("Here"); } } } diff --git a/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs b/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs index af42f9cd08d5ab..b031bfea1c38b6 100644 --- a/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs +++ b/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs @@ -616,6 +616,7 @@ public void CreateFactory_RemoteExecutor_NoParameters_Success(bool useDynamicCod #if NET [ActiveIssue("https://github.com/dotnet/runtime/issues/34072", TestRuntimes.Mono)] + [ActiveIssue("todo - this may have worked before since we used interpreted on first call to each method", TestRuntimes.CoreCLR)] [ConditionalTheory(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] [InlineData(true)] [InlineData(false)] diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs index d75b4fc070635e..ba68160e063261 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs @@ -1,11 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using static System.Reflection.MethodBase; - namespace System.Reflection { internal sealed class InvokeSignatureInfo diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index 6b8763579feeed..2b18c51fec020b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -161,7 +161,7 @@ private static DynamicMethod CreateDynamicMethod(MethodBase? method, in InvokeSi GetInvokeStubName(method, signatureInfo), returnType: typeof(object), delegateParameters, - typeof(object).Module, // Use system module to identify our DynamicMethods. + method is null ? typeof(object).Module : method.DeclaringType!.Module, skipVisibility: true); // Supports creating the delegate immediately when calling CreateDelegate(). } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index 524d43a5699042..c9067d0655851e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -56,9 +56,9 @@ public MethodBaseInvoker(MethodBase method, RuntimeType[] parameterTypes, Type r if (_functionPointer != IntPtr.Zero && method is RuntimeConstructorInfo) { #if MONO - _shouldAllocate = true; + _shouldAllocate = true; #else - _allocator = _declaringType!.GetOrCreateCacheEntry(); + _allocator = _declaringType!.GetOrCreateCacheEntry(); #endif } } @@ -132,6 +132,13 @@ internal static void ThrowTargetParameterCountException() return obj; } +#if MONO + // Mono calls this method when invoking a constructor with no arguments. + if (_strategy == InvokerStrategy.Ref4) + { + return ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, refArguments: null); + } +#endif return ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs index b3059ad67723dc..5d3aa2dcba1489 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.cs @@ -4,7 +4,6 @@ using System.Diagnostics; using System.Reflection.Emit; using System.Runtime.InteropServices; -using System.Threading; using static System.Reflection.InvokerEmitUtil; using static System.Reflection.MethodBase; From b04f1bdea22e9e72553436bc363b658eef698456 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Wed, 27 Nov 2024 08:58:49 -0600 Subject: [PATCH 17/24] Fix build issue due to change in main --- .../src/System/Reflection/MethodBaseInvoker.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index c9067d0655851e..10b964e597be81 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -566,7 +566,7 @@ internal void CheckArguments( private static bool HandleByRefForValueType(RuntimeType type, ref object arg) { - RuntimeType elementType = RuntimeTypeHandle.GetElementType(type); + RuntimeType elementType = RuntimeTypeHandle.GetElementType(type)!; Debug.Assert(RuntimeTypeHandle.IsByRef(type) && elementType.IsValueType); if (ReferenceEquals(elementType, arg.GetType())) { From 7e869114c14f88d33e393b2e8de67d6d050a207a Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Wed, 27 Nov 2024 14:54:43 -0600 Subject: [PATCH 18/24] Fix null ref exception; remove unnecessary fields --- .../System/Reflection/ConstructorInvoker.cs | 62 +++++++++--------- .../src/System/Reflection/InvokerEmitUtil.cs | 2 +- .../System/Reflection/MethodBaseInvoker.cs | 49 +++++++-------- .../src/System/Reflection/MethodInvoker.cs | 63 ++++++++++--------- 4 files changed, 90 insertions(+), 86 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index 9fd645d42eb0d6..c6956e5796624d 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -25,7 +25,6 @@ namespace System.Reflection /// public sealed partial class ConstructorInvoker { - private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. private readonly RuntimeType _declaringType; private readonly IntPtr _functionPointer; private readonly Delegate _invokeFunc; // todo: use GetMethodImpl and fcnptr? @@ -72,7 +71,6 @@ private ConstructorInvoker(RuntimeConstructorInfo constructor) _declaringType = (RuntimeType)constructor.DeclaringType!; _parameterTypes = constructor.ArgumentTypes; - _argCount = _parameterTypes.Length; MethodBase _ = constructor; @@ -120,7 +118,7 @@ public object Invoke() _method.ThrowNoInvokeException(); } - if (_argCount != 0) + if (_parameterTypes.Length != 0) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -155,7 +153,7 @@ public object Invoke(object? arg1) _method.ThrowNoInvokeException(); } - if (_argCount != 1) + if (_parameterTypes.Length != 1) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -187,7 +185,7 @@ public object Invoke(object? arg1, object? arg2) _method.ThrowNoInvokeException(); } - if (_argCount != 2) + if (_parameterTypes.Length != 2) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -211,7 +209,7 @@ public object Invoke(object? arg1, object? arg2, object? arg3) _method.ThrowNoInvokeException(); } - if (_argCount != 3) + if (_parameterTypes.Length != 3) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -236,7 +234,7 @@ public object Invoke(object? arg1, object? arg2, object? arg3, object? arg4) _method.ThrowNoInvokeException(); } - if (_argCount != 4) + if (_parameterTypes.Length != 4) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -251,7 +249,7 @@ public object Invoke(object? arg1, object? arg2, object? arg3, object? arg4) private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4) { - switch (_argCount) + switch (_parameterTypes.Length) { case 4: CheckArgument(ref arg4, 3); @@ -289,7 +287,7 @@ public object Invoke(Span arguments) _method.ThrowNoInvokeException(); } - if (arguments.Length != _argCount) + if (arguments.Length != _parameterTypes.Length) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -316,14 +314,14 @@ public object Invoke(Span arguments) } return ((InvokeFunc_Obj1Arg)_invokeFunc)(obj: null, _functionPointer, arg1)!; case InvokerStrategy.Obj4: - switch (_argCount) + switch (_parameterTypes.Length) { case 2: return InvokeImpl(arguments[0], arguments[1], null, null); case 3: return InvokeImpl(arguments[0], arguments[1], arguments[2], null); default: - Debug.Assert(_argCount == 4); + Debug.Assert(_parameterTypes.Length == 4); return InvokeImpl(arguments[0], arguments[1], arguments[2], arguments[3]); } case InvokerStrategy.ObjSpan: @@ -345,19 +343,20 @@ private unsafe object InvokeWithSpanArgs(Span arguments) } object? obj; + int argCount = _parameterTypes.Length; Span copyOfArgs; GCFrameRegistration regArgStorage; - IntPtr* pArgStorage = stackalloc IntPtr[_argCount]; - NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); - regArgStorage = new((void**)pArgStorage, (uint)_argCount, areByRefs: false); + IntPtr* pArgStorage = stackalloc IntPtr[argCount]; + NativeMemory.Clear(pArgStorage, (nuint)argCount * (nuint)sizeof(IntPtr)); + copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), argCount); + regArgStorage = new((void**)pArgStorage, (uint)argCount, areByRefs: false); try { GCFrameRegistration.RegisterForGCReporting(®ArgStorage); - for (int i = 0; i < _argCount; i++) + for (int i = 0; i < argCount; i++) { object? arg = arguments[i]; CheckArgument(ref arg, i); @@ -392,12 +391,13 @@ private unsafe object InvokeWithRefArgs4(object? arg1, object? arg2 = null, obje _method.ThrowNoInvokeException(); } + int argCount = _parameterTypes.Length; StackAllocatedArguments stackStorage = new(arg1, arg2, arg3, arg4); - Span arguments = ((Span)(stackStorage._args)).Slice(0, _argCount); + Span arguments = ((Span)(stackStorage._args)).Slice(0, argCount); StackAllocatedByRefs byrefs = default; IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; - for (int i = 0; i < _argCount; i++) + for (int i = 0; i < argCount; i++) { CheckArgument(ref arguments[i], i); @@ -429,15 +429,16 @@ private unsafe object InvokeWithRefArgs4(Span arguments) _method.ThrowNoInvokeException(); } - Debug.Assert(_argCount <= MaxStackAllocArgCount); + Debug.Assert(_parameterTypes.Length <= MaxStackAllocArgCount); + int argCount = _parameterTypes.Length; StackAllocatedArgumentsWithCopyBack stackArgStorage = default; - Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, _argCount); - Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); + Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, argCount); + Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, argCount); StackAllocatedByRefs byrefs = default; IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; - for (int i = 0; i < _argCount; i++) + for (int i = 0; i < _parameterTypes.Length; i++) { object? arg = arguments[i]; shouldCopyBack[i] = CheckArgument(ref arg, i); @@ -473,26 +474,27 @@ private unsafe object InvokeWithRefArgsMany(Span arguments) } object? obj; + int argCount = _parameterTypes.Length; Span copyOfArgs; GCFrameRegistration regArgStorage; - IntPtr* pStorage = stackalloc IntPtr[2 * _argCount]; - NativeMemory.Clear(pStorage, (nuint)(2 * _argCount) * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pStorage), _argCount); + IntPtr* pStorage = stackalloc IntPtr[2 * argCount]; + NativeMemory.Clear(pStorage, (nuint)(2 * argCount) * (nuint)sizeof(IntPtr)); + copyOfArgs = new(ref Unsafe.AsRef(pStorage), argCount); - IntPtr* pByRefStorage = pStorage + _argCount; - scoped Span shouldCopyBack = stackalloc bool[_argCount]; + IntPtr* pByRefStorage = pStorage + argCount; + scoped Span shouldCopyBack = stackalloc bool[argCount]; - regArgStorage = new((void**)pStorage, (uint)_argCount, areByRefs: false); - GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)_argCount, areByRefs: true); + regArgStorage = new((void**)pStorage, (uint)argCount, areByRefs: false); + GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)argCount, areByRefs: true); try { GCFrameRegistration.RegisterForGCReporting(®ArgStorage); GCFrameRegistration.RegisterForGCReporting(®ByRefStorage); - for (int i = 0; i < _argCount; i++) + for (int i = 0; i < argCount; i++) { object? arg = arguments[i]; shouldCopyBack[i] = CheckArgument(ref arg, i); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index 2b18c51fec020b..57f4acac3159b1 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -161,7 +161,7 @@ private static DynamicMethod CreateDynamicMethod(MethodBase? method, in InvokeSi GetInvokeStubName(method, signatureInfo), returnType: typeof(object), delegateParameters, - method is null ? typeof(object).Module : method.DeclaringType!.Module, + method?.DeclaringType is Type declaringType ? declaringType.Module : typeof(object).Module, skipVisibility: true); // Supports creating the delegate immediately when calling CreateDelegate(). } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index 10b964e597be81..c6e845f17ede9c 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -24,7 +24,6 @@ internal sealed partial class MethodBaseInvoker { internal const int MaxStackAllocArgCount = 4; - private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. private readonly RuntimeType? _declaringType; private readonly IntPtr _functionPointer; // This will be Zero when not using calli. private readonly Delegate _invokeFunc; @@ -39,7 +38,6 @@ public MethodBaseInvoker(MethodBase method, RuntimeType[] parameterTypes, Type r _method = method; _declaringType = (RuntimeType?)_method.DeclaringType; _parameterTypes = parameterTypes; - _argCount = parameterTypes.Length; Initialize( isForInvokerClasses: false, @@ -68,7 +66,6 @@ private MethodBaseInvoker(MethodBaseInvoker other) { Debug.Assert(other._method is RuntimeConstructorInfo); - _argCount = other._argCount; _declaringType = other._declaringType; _functionPointer = other._functionPointer; _invokeFunc = other._invokeFunc; @@ -120,7 +117,7 @@ internal static void ThrowTargetParameterCountException() internal unsafe object? InvokeWithNoArgs(object? obj, BindingFlags invokeAttr) { - Debug.Assert(_argCount == 0); + Debug.Assert(_parameterTypes.Length == 0); try { @@ -154,7 +151,7 @@ internal static void ThrowTargetParameterCountException() object? arg, CultureInfo? culture) { - Debug.Assert(_argCount == 1); + Debug.Assert(_parameterTypes.Length == 1); bool _ = false; CheckArgument(ref arg, ref _, 0, binder, culture, invokeAttr); @@ -198,7 +195,7 @@ internal static void ThrowTargetParameterCountException() object?[] arguments, CultureInfo? culture) { - Debug.Assert(_argCount == 1); + Debug.Assert(_parameterTypes.Length == 1); bool copyBack = false; object? arg1 = arguments[0]; @@ -237,7 +234,7 @@ internal static void ThrowTargetParameterCountException() object?[] arguments, CultureInfo? culture) { - Debug.Assert(_argCount <= MaxStackAllocArgCount); + Debug.Assert(_parameterTypes.Length <= MaxStackAllocArgCount); StackAllocatedArgumentsWithCopyBack stackArgStorage = default; Span copyOfArgs = (Span)stackArgStorage._args; @@ -279,18 +276,19 @@ internal static void ThrowTargetParameterCountException() object?[] arguments, CultureInfo? culture) { - Debug.Assert(_argCount > MaxStackAllocArgCount); + Debug.Assert(_parameterTypes.Length > MaxStackAllocArgCount); + int argCount = _parameterTypes.Length; Span copyOfArgs; object? ret; GCFrameRegistration regArgStorage; Span shouldCopyBack; - IntPtr* pArgStorage = stackalloc IntPtr[_argCount * 2]; - NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr) * 2); - copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); - regArgStorage = new((void**)pArgStorage, (uint)_argCount, areByRefs: false); - shouldCopyBack = new Span(pArgStorage + _argCount, _argCount); + IntPtr* pArgStorage = stackalloc IntPtr[argCount * 2]; + NativeMemory.Clear(pArgStorage, (nuint)argCount * (nuint)sizeof(IntPtr) * 2); + copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), argCount); + regArgStorage = new((void**)pArgStorage, (uint)argCount, areByRefs: false); + shouldCopyBack = new Span(pArgStorage + argCount, argCount); try { @@ -332,9 +330,9 @@ internal static void ThrowTargetParameterCountException() object?[]? arguments, CultureInfo? culture) { - Debug.Assert(_argCount <= MaxStackAllocArgCount); + Debug.Assert(_parameterTypes.Length <= MaxStackAllocArgCount); - if (_argCount == 0) + if (_parameterTypes.Length == 0) { // This method may be called from the interpreted path for a property getter with arguments==null. Debug.Assert(UseInterpretedPath); @@ -358,7 +356,7 @@ internal static void ThrowTargetParameterCountException() CheckArguments(arguments, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); - for (int i = 0; i < _argCount; i++) + for (int i = 0; i < _parameterTypes.Length; i++) { *(ByReference*)(pByRefFixedStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? ByReference.Create(ref copyOfArgs[i]!.GetRawData()) : @@ -396,17 +394,18 @@ internal static void ThrowTargetParameterCountException() object?[] arguments, CultureInfo? culture) { - Debug.Assert(_argCount > MaxStackAllocArgCount); + Debug.Assert(_parameterTypes.Length > MaxStackAllocArgCount); object? ret; + int argCount = _parameterTypes.Length; - IntPtr* pStorage = stackalloc IntPtr[3 * _argCount]; - NativeMemory.Clear(pStorage, (nuint)(3 * _argCount) * (nuint)sizeof(IntPtr)); - IntPtr* pByRefStorage = pStorage + _argCount; - Span copyOfArgs = new(ref Unsafe.AsRef(pStorage), _argCount); - GCFrameRegistration regArgStorage = new((void**)pStorage, (uint)_argCount, areByRefs: false); - GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)_argCount, areByRefs: true); - Span shouldCopyBack = new Span(pStorage + _argCount * 2, _argCount); + IntPtr* pStorage = stackalloc IntPtr[3 * argCount]; + NativeMemory.Clear(pStorage, (nuint)(3 * argCount) * (nuint)sizeof(IntPtr)); + IntPtr* pByRefStorage = pStorage + argCount; + Span copyOfArgs = new(ref Unsafe.AsRef(pStorage), argCount); + GCFrameRegistration regArgStorage = new((void**)pStorage, (uint)argCount, areByRefs: false); + GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)argCount, areByRefs: true); + Span shouldCopyBack = new Span(pStorage + argCount * 2, argCount); try { @@ -415,7 +414,7 @@ internal static void ThrowTargetParameterCountException() CheckArguments(arguments, copyOfArgs, shouldCopyBack, binder, culture, invokeAttr); - for (int i = 0; i < _argCount; i++) + for (int i = 0; i < argCount; i++) { *(ByReference*)(pByRefStorage + i) = (_invokerArgFlags[i] & InvokerArgFlags.IsValueType) != 0 ? ByReference.Create(ref Unsafe.AsRef(pStorage + i).GetRawData()) : diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index f99ebd9a8c8d20..917a5955c0ee7d 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -26,7 +26,6 @@ namespace System.Reflection /// public sealed partial class MethodInvoker { - private readonly int _argCount; // For perf, to avoid calling _signatureInfo.ParameterTypes.Length in fast path. private readonly IntPtr _functionPointer; private readonly Delegate? _invokeFunc; private readonly InvokerArgFlags[] _invokerArgFlags; @@ -80,7 +79,6 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu } _parameterTypes = parameterTypes; - _argCount = _parameterTypes.Length; Initialize( isForInvokerClasses: true, @@ -133,7 +131,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu ValidateInvokeTarget(obj, _method); } - if (_argCount != 0) + if (_parameterTypes.Length != 0) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -164,7 +162,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu ValidateInvokeTarget(obj, _method); } - if (_argCount != 1) + if (_parameterTypes.Length != 1) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -194,7 +192,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu ValidateInvokeTarget(obj, _method); } - if (_argCount != 2) + if (_parameterTypes.Length != 2) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -224,7 +222,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu ValidateInvokeTarget(obj, _method); } - if (_argCount != 3) + if (_parameterTypes.Length != 3) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -255,7 +253,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu ValidateInvokeTarget(obj, _method); } - if (_argCount != 4) + if (_parameterTypes.Length != 4) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -270,7 +268,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu private object? InvokeImpl(object? obj, object? arg1, object? arg2, object? arg3, object? arg4) { - switch (_argCount) + switch (_parameterTypes.Length) { case 4: CheckArgument(ref arg4, 3); @@ -307,7 +305,7 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu ValidateInvokeTarget(obj, _method); } - if (arguments.Length != _argCount) + if (arguments.Length != _parameterTypes.Length) { MethodBaseInvoker.ThrowTargetParameterCountException(); } @@ -321,14 +319,14 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu CheckArgument(ref arg1, 0); return ((InvokeFunc_Obj1Arg)_invokeFunc!)(obj, _functionPointer, arg1); case InvokerStrategy.Obj4: - switch (_argCount) + switch (_parameterTypes.Length) { case 2: return InvokeImpl(obj, arguments[0], arguments[1], null, null); case 3: return InvokeImpl(obj, arguments[0], arguments[1], arguments[2], null); default: - Debug.Assert(_argCount == 4); + Debug.Assert(_parameterTypes.Length == 4); return InvokeImpl(obj, arguments[0], arguments[1], arguments[2], arguments[3]); } case InvokerStrategy.ObjSpan: @@ -344,19 +342,21 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu // Version with no copy-back private unsafe object? InvokeWithSpanArgs(object? obj, Span arguments) { + int argCount = _parameterTypes.Length; + Span copyOfArgs; GCFrameRegistration regArgStorage; - IntPtr* pArgStorage = stackalloc IntPtr[_argCount]; - NativeMemory.Clear(pArgStorage, (nuint)_argCount * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), _argCount); - regArgStorage = new((void**)pArgStorage, (uint)_argCount, areByRefs: false); + IntPtr* pArgStorage = stackalloc IntPtr[argCount]; + NativeMemory.Clear(pArgStorage, (nuint)argCount * (nuint)sizeof(IntPtr)); + copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), argCount); + regArgStorage = new((void**)pArgStorage, (uint)argCount, areByRefs: false); try { GCFrameRegistration.RegisterForGCReporting(®ArgStorage); - for (int i = 0; i < _argCount; i++) + for (int i = 0; i < argCount; i++) { object? arg = arguments[i]; CheckArgument(ref arg, i); @@ -375,12 +375,13 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu // Version with no copy-back private unsafe object? InvokeWithRefArgs4(object? obj, object? arg1, object? arg2, object? arg3 = null, object? arg4 = null) { + int argCount = _parameterTypes.Length; StackAllocatedArguments stackStorage = new(arg1, arg2, arg3, arg4); - Span arguments = ((Span)(stackStorage._args)).Slice(0, _argCount); + Span arguments = ((Span)(stackStorage._args)).Slice(0, argCount); StackAllocatedByRefs byrefs = default; IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; - for (int i = 0; i < _argCount; i++) + for (int i = 0; i < argCount; i++) { CheckArgument(ref arguments[i], i); @@ -396,15 +397,16 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu private unsafe object? InvokeWithRefArgs4(object? obj, Span arguments) { - Debug.Assert(_argCount <= MaxStackAllocArgCount); + Debug.Assert(_parameterTypes.Length <= MaxStackAllocArgCount); + int argCount = _parameterTypes.Length; StackAllocatedArgumentsWithCopyBack stackArgStorage = default; - Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, _argCount); - Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, _argCount); + Span copyOfArgs = ((Span)stackArgStorage._args).Slice(0, argCount); + Span shouldCopyBack = ((Span)stackArgStorage._shouldCopyBack).Slice(0, argCount); StackAllocatedByRefs byrefs = default; IntPtr* pByRefFixedStorage = (IntPtr*)&byrefs; - for (int i = 0; i < _argCount; i++) + for (int i = 0; i < _parameterTypes.Length; i++) { object? arg = arguments[i]; shouldCopyBack[i] = CheckArgument(ref arg, i); @@ -424,25 +426,26 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu private unsafe object? InvokeWithRefArgsMany(object? obj, Span arguments) { + int argCount = _parameterTypes.Length; Span copyOfArgs; GCFrameRegistration regArgStorage; - IntPtr* pStorage = stackalloc IntPtr[2 * _argCount]; - NativeMemory.Clear(pStorage, (nuint)(2 * _argCount) * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pStorage), _argCount); + IntPtr* pStorage = stackalloc IntPtr[2 * argCount]; + NativeMemory.Clear(pStorage, (nuint)(2 * argCount) * (nuint)sizeof(IntPtr)); + copyOfArgs = new(ref Unsafe.AsRef(pStorage), argCount); - IntPtr* pByRefStorage = pStorage + _argCount; - scoped Span shouldCopyBack = stackalloc bool[_argCount]; + IntPtr* pByRefStorage = pStorage + argCount; + scoped Span shouldCopyBack = stackalloc bool[argCount]; - regArgStorage = new((void**)pStorage, (uint)_argCount, areByRefs: false); - GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)_argCount, areByRefs: true); + regArgStorage = new((void**)pStorage, (uint)argCount, areByRefs: false); + GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)argCount, areByRefs: true); try { GCFrameRegistration.RegisterForGCReporting(®ArgStorage); GCFrameRegistration.RegisterForGCReporting(®ByRefStorage); - for (int i = 0; i < _argCount; i++) + for (int i = 0; i < argCount; i++) { object? arg = arguments[i]; shouldCopyBack[i] = CheckArgument(ref arg, i); From dfe0e4d00d64a02d79c006f62b5dd51030f5f2f7 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Thu, 16 Jan 2025 14:26:13 -0600 Subject: [PATCH 19/24] Fix merge; update unloadable assembly test --- .../tests/DI.Tests/ActivatorUtilitiesTests.cs | 128 +++++++----------- .../src/System/Reflection/InvokerEmitUtil.cs | 2 +- .../System/Reflection/MethodBaseInvoker.cs | 6 +- 3 files changed, 52 insertions(+), 84 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs b/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs index b031bfea1c38b6..53ffd31e76bee1 100644 --- a/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs +++ b/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs @@ -616,86 +616,55 @@ public void CreateFactory_RemoteExecutor_NoParameters_Success(bool useDynamicCod #if NET [ActiveIssue("https://github.com/dotnet/runtime/issues/34072", TestRuntimes.Mono)] - [ActiveIssue("todo - this may have worked before since we used interpreted on first call to each method", TestRuntimes.CoreCLR)] - [ConditionalTheory(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] - [InlineData(true)] - [InlineData(false)] - public void CreateInstance_CollectibleAssembly(bool useDynamicCode) - { - if (PlatformDetection.IsNonBundledAssemblyLoadingSupported) - { - RemoteInvokeOptions options = new(); - if (!useDynamicCode) - { - DisableDynamicCode(options); - } - - using var remoteHandle = RemoteExecutor.Invoke(static () => - { - Assert.False(Collectible_IsAssemblyLoaded()); - Collectible_LoadAndCreate(useCollectibleAssembly : true, out WeakReference asmWeakRef, out WeakReference typeWeakRef); - - for (int i = 0; (typeWeakRef.IsAlive || asmWeakRef.IsAlive) && (i < 10); i++) - { - GC.Collect(); - GC.WaitForPendingFinalizers(); - } - - // These should be GC'd. - Assert.False(asmWeakRef.IsAlive, "asmWeakRef.IsAlive"); - Assert.False(typeWeakRef.IsAlive, "typeWeakRef.IsAlive"); - Assert.False(Collectible_IsAssemblyLoaded()); - }, options); - } - } - - [ConditionalTheory(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] - [InlineData(true)] - [InlineData(false)] - public void CreateInstance_NormalAssembly(bool useDynamicCode) + [Fact] + public void CreateInstance_CollectibleAssembly() { - RemoteInvokeOptions options = new(); - if (!useDynamicCode) + if (!PlatformDetection.IsNonBundledAssemblyLoadingSupported) { - DisableDynamicCode(options); + return; } - using var remoteHandle = RemoteExecutor.Invoke(static () => + AssemblyLoadContext loadContext = new("CollectibleAssembly", isCollectible: true); + try { Assert.False(Collectible_IsAssemblyLoaded()); - Collectible_LoadAndCreate(useCollectibleAssembly: false, out WeakReference asmWeakRef, out WeakReference typeWeakRef); - for (int i = 0; (typeWeakRef.IsAlive || asmWeakRef.IsAlive) && (i < 10); i++) + Collectible_LoadAndCreate(loadContext, out WeakReference asmWeakRef, out WeakReference typeWeakRef); + + Assert.True(asmWeakRef.IsAlive, "asmWeakRef.IsAlive"); + Assert.True(typeWeakRef.IsAlive, "typeWeakRef.IsAlive"); + Assert.True(Collectible_IsAssemblyLoaded()); + + loadContext.Unload(); + loadContext = null; + + for (int i = 0; i < 10; i++) { GC.Collect(); GC.WaitForPendingFinalizers(); } - // These will not be GC'd. - Assert.True(asmWeakRef.IsAlive, "alcWeakRef.IsAlive"); - Assert.True(typeWeakRef.IsAlive, "typeWeakRef.IsAlive"); - Assert.True(Collectible_IsAssemblyLoaded()); - }, options); + // These should be GC'd by now. + Assert.False(asmWeakRef.IsAlive, "asmWeakRef.IsAlive"); + Assert.False(typeWeakRef.IsAlive, "typeWeakRef.IsAlive"); + Assert.False(Collectible_IsAssemblyLoaded()); + } + finally + { + if (loadContext is not null) + { + loadContext.Unload(); + } + } } [MethodImpl(MethodImplOptions.NoInlining)] - static void Collectible_LoadAndCreate(bool useCollectibleAssembly, out WeakReference asmWeakRef, out WeakReference typeWeakRef) + static void Collectible_LoadAndCreate(AssemblyLoadContext loadContext, out WeakReference asmWeakRef, out WeakReference typeWeakRef) { - Assembly asm; - object obj; + Assembly asm = loadContext.LoadFromAssemblyPath(Path.Combine(AppContext.BaseDirectory, "CollectibleAssembly.dll")); - if (useCollectibleAssembly) - { - asm = MyLoadContext.LoadAsCollectable(); - obj = CreateWithActivator(asm); - Assert.True(obj.GetType().Assembly.IsCollectible); - } - else - { - asm = MyLoadContext.LoadNormal(); - obj = CreateWithActivator(asm); - Assert.False(obj.GetType().Assembly.IsCollectible); - } + object obj = CreateWithActivator(asm); + Assert.True(obj.GetType().Assembly.IsCollectible); Assert.True(Collectible_IsAssemblyLoaded()); asmWeakRef = new WeakReference(asm); @@ -1067,23 +1036,22 @@ private MyLoadContext() : base(isCollectible: true) { } - public Assembly LoadAssembly() - { - Assembly asm = LoadFromAssemblyPath(GetPath()); - Assert.Equal(GetLoadContext(asm), this); - return asm; - } - - public static Assembly LoadAsCollectable() - { - MyLoadContext alc = new MyLoadContext(); - return alc.LoadAssembly(); - } - - public static Assembly LoadNormal() - { - return Assembly.LoadFrom(GetPath()); - } + //public Assembly LoadAssembly() + //{ + // Assembly asm = LoadFromAssemblyPath(GetPath()); + // Assert.Equal(GetLoadContext(asm), this); + // return asm; + //} + + //public Assembly LoadAsCollectable() + //{ + // return this.l + //} + + //public static Assembly LoadNormal() + //{ + // return Assembly.LoadFrom(GetPath()); + //} private static string GetPath() { diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs index be711503112dda..2e3a2a31132dff 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokerEmitUtil.cs @@ -7,7 +7,7 @@ namespace System.Reflection { - internal static class InvokerEmitUtil + internal static unsafe class InvokerEmitUtil { // If changed, update native stack walking code that also uses "InvokeStub_" to ignore reflection frames. private const string InvokeStubPrefix = "InvokeStub_"; diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index 428798237d3178..cc569af2c7e101 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -20,7 +20,7 @@ namespace System.Reflection /// /// This class is known by the runtime in order to ignore reflection frames during stack walks. /// - internal sealed partial class MethodBaseInvoker + internal sealed unsafe partial class MethodBaseInvoker { internal const int MaxStackAllocArgCount = 4; @@ -115,7 +115,7 @@ internal static void ThrowTargetParameterCountException() throw new TargetParameterCountException(SR.Arg_ParmCnt); } - internal unsafe object? InvokeWithNoArgs(object? obj, BindingFlags invokeAttr) + internal object? InvokeWithNoArgs(object? obj, BindingFlags invokeAttr) { Debug.Assert(_parameterTypes.Length == 0); @@ -323,7 +323,7 @@ internal static void ThrowTargetParameterCountException() } } - internal unsafe object? InvokeWith4RefArgs( + internal object? InvokeWith4RefArgs( object? obj, BindingFlags invokeAttr, Binder? binder, From 62d884a2237cf178a663082e83fe95ac7acb7ab6 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Fri, 17 Jan 2025 09:52:10 -0600 Subject: [PATCH 20/24] Update some reflection tests --- .../System/Reflection/InvokeEmitTests.cs | 12 +-- .../Reflection/InvokeInterpretedTests.cs | 8 +- .../tests/DI.Tests/ActivatorUtilitiesTests.cs | 96 ++++++++----------- 3 files changed, 48 insertions(+), 68 deletions(-) diff --git a/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs b/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs index 5009778e14b7a8..d31de56fb9de2e 100644 --- a/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs +++ b/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs @@ -14,8 +14,8 @@ public static void VerifyInvokeIsUsingEmit_Method() MethodInfo method = typeof(TestClassThatThrows).GetMethod(nameof(TestClassThatThrows.Throw))!; TargetInvocationException ex = Assert.Throws(() => method.Invoke(null, new object[] { "" })); Exception exInner = ex.InnerException; - Assert.Contains("Here", ex.ToString()); - Assert.Contains("InvokeStub_", exInner.ToString()); + Assert.Contains("Method Here", ex.ToString()); + Assert.Contains("InvokeStub_ (Object, IntPtr, Object)", exInner.ToString()); } [ConditionalFact(typeof(InvokeEmitTests), nameof(IsEmitInvokeSupported))] @@ -24,8 +24,8 @@ public static void VerifyInvokeIsUsingEmit_Constructor() ConstructorInfo ctor = typeof(TestClassThatThrows).GetConstructor(new Type[] {typeof(string)})!; TargetInvocationException ex = Assert.Throws(() => ctor.Invoke(new object[] { "" })); Exception exInner = ex.InnerException; - Assert.Contains("Here", exInner.ToString()); - Assert.Contains("InvokeStub_", exInner.ToString()); + Assert.Contains("Ctor Here", exInner.ToString()); + Assert.Contains("InvokeStub_ (Object, IntPtr, Object)", exInner.ToString()); } private static bool IsEmitInvokeSupported() @@ -38,10 +38,10 @@ private class TestClassThatThrows { public TestClassThatThrows(string _) { - throw new Exception("Here"); + throw new Exception("Ctor Here"); } - public static void Throw(string _) => throw new Exception("Here"); + public static void Throw(string _) => throw new Exception("Method Here"); } } } diff --git a/src/libraries/Common/tests/System/Reflection/InvokeInterpretedTests.cs b/src/libraries/Common/tests/System/Reflection/InvokeInterpretedTests.cs index 03a876131f4787..d179ab1154d3df 100644 --- a/src/libraries/Common/tests/System/Reflection/InvokeInterpretedTests.cs +++ b/src/libraries/Common/tests/System/Reflection/InvokeInterpretedTests.cs @@ -15,7 +15,7 @@ public static void VerifyInvokeIsUsingInterpreter_Method() TargetInvocationException ex = Assert.Throws(() => method.Invoke(null, null)); Exception exInner = ex.InnerException; - Assert.Contains("Here", exInner.ToString()); + Assert.Contains("Method Here", exInner.ToString()); Assert.DoesNotContain("InvokeStub_TestClassThatThrows", exInner.ToString()); } @@ -27,7 +27,7 @@ public static void VerifyInvokeIsUsingInterpreter_Constructor() TargetInvocationException ex = Assert.Throws(() => ctor.Invoke(null)); Exception exInner = ex.InnerException; - Assert.Contains("Here", exInner.ToString()); + Assert.Contains("Ctor Here", exInner.ToString()); Assert.DoesNotContain("InvokeStub_TestClassThatThrows", exInner.ToString()); } @@ -35,10 +35,10 @@ private class TestClassThatThrows { public TestClassThatThrows() { - throw new Exception("Here"); + throw new Exception("Ctor Here"); } - public static void Throw() => throw new Exception("Here"); + public static void Throw() => throw new Exception("Method Here"); } } } diff --git a/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs b/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs index 53ffd31e76bee1..00690d4c7796da 100644 --- a/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs +++ b/src/libraries/Microsoft.Extensions.DependencyInjection/tests/DI.Tests/ActivatorUtilitiesTests.cs @@ -14,7 +14,7 @@ namespace Microsoft.Extensions.DependencyInjection.Tests { - public class ActivatorUtilitiesTests + public sealed class ActivatorUtilitiesTests { [Fact] public void CreateInstance_ClassWithABCS_UsesTheLongestAvailableConstructor() @@ -616,46 +616,57 @@ public void CreateFactory_RemoteExecutor_NoParameters_Success(bool useDynamicCod #if NET [ActiveIssue("https://github.com/dotnet/runtime/issues/34072", TestRuntimes.Mono)] - [Fact] - public void CreateInstance_CollectibleAssembly() + [ConditionalTheory(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] + [InlineData(true)] + [InlineData(false)] + public void CreateInstance_CollectibleAssembly(bool useDynamicCode) { if (!PlatformDetection.IsNonBundledAssemblyLoadingSupported) { return; } - AssemblyLoadContext loadContext = new("CollectibleAssembly", isCollectible: true); - try + RemoteInvokeOptions options = new(); + if (!useDynamicCode) { - Assert.False(Collectible_IsAssemblyLoaded()); + DisableDynamicCode(options); + } - Collectible_LoadAndCreate(loadContext, out WeakReference asmWeakRef, out WeakReference typeWeakRef); + using var remoteHandle = RemoteExecutor.Invoke(static () => + { + AssemblyLoadContext loadContext = new("CollectibleAssembly", isCollectible: true); + try + { + Assert.False(Collectible_IsAssemblyLoaded()); - Assert.True(asmWeakRef.IsAlive, "asmWeakRef.IsAlive"); - Assert.True(typeWeakRef.IsAlive, "typeWeakRef.IsAlive"); - Assert.True(Collectible_IsAssemblyLoaded()); + Collectible_LoadAndCreate(loadContext, out WeakReference asmWeakRef, out WeakReference typeWeakRef); - loadContext.Unload(); - loadContext = null; + Assert.True(asmWeakRef.IsAlive, "asmWeakRef.IsAlive"); + Assert.True(typeWeakRef.IsAlive, "typeWeakRef.IsAlive"); + Assert.True(Collectible_IsAssemblyLoaded()); - for (int i = 0; i < 10; i++) - { - GC.Collect(); - GC.WaitForPendingFinalizers(); + loadContext.Unload(); + loadContext = null; + + for (int i = 0; i < 10; i++) + { + GC.Collect(); + GC.WaitForPendingFinalizers(); + } + + // These should be GC'd by now. + Assert.False(asmWeakRef.IsAlive, "asmWeakRef.IsAlive"); + Assert.False(typeWeakRef.IsAlive, "typeWeakRef.IsAlive"); + Assert.False(Collectible_IsAssemblyLoaded()); } - - // These should be GC'd by now. - Assert.False(asmWeakRef.IsAlive, "asmWeakRef.IsAlive"); - Assert.False(typeWeakRef.IsAlive, "typeWeakRef.IsAlive"); - Assert.False(Collectible_IsAssemblyLoaded()); - } - finally - { - if (loadContext is not null) + finally { - loadContext.Unload(); + if (loadContext is not null) + { + loadContext.Unload(); + } } - } + }, options); } [MethodImpl(MethodImplOptions.NoInlining)] @@ -1028,35 +1039,4 @@ public ClassWithStringDefaultValue(string text = "DEFAULT") Text = text; } } - -#if NET - internal class MyLoadContext : AssemblyLoadContext - { - private MyLoadContext() : base(isCollectible: true) - { - } - - //public Assembly LoadAssembly() - //{ - // Assembly asm = LoadFromAssemblyPath(GetPath()); - // Assert.Equal(GetLoadContext(asm), this); - // return asm; - //} - - //public Assembly LoadAsCollectable() - //{ - // return this.l - //} - - //public static Assembly LoadNormal() - //{ - // return Assembly.LoadFrom(GetPath()); - //} - - private static string GetPath() - { - return Path.Combine(Directory.GetCurrentDirectory(), "CollectibleAssembly.dll"); - } - } -#endif } From 58a2c20c4381e3404257e7f9832bda75e9a003eb Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Tue, 21 Jan 2025 16:30:51 -0600 Subject: [PATCH 21/24] Fix some Mono test issues --- .../Common/tests/System/Reflection/InvokeEmitTests.cs | 4 ++-- .../src/System/Reflection/RuntimeMethodInfo.Mono.cs | 2 +- .../src/System/RuntimeType.Mono.cs | 11 ++++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs b/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs index d31de56fb9de2e..9a52e6c85706eb 100644 --- a/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs +++ b/src/libraries/Common/tests/System/Reflection/InvokeEmitTests.cs @@ -15,7 +15,7 @@ public static void VerifyInvokeIsUsingEmit_Method() TargetInvocationException ex = Assert.Throws(() => method.Invoke(null, new object[] { "" })); Exception exInner = ex.InnerException; Assert.Contains("Method Here", ex.ToString()); - Assert.Contains("InvokeStub_ (Object, IntPtr, Object)", exInner.ToString()); + Assert.Contains("InvokeStub_", exInner.ToString()); } [ConditionalFact(typeof(InvokeEmitTests), nameof(IsEmitInvokeSupported))] @@ -25,7 +25,7 @@ public static void VerifyInvokeIsUsingEmit_Constructor() TargetInvocationException ex = Assert.Throws(() => ctor.Invoke(new object[] { "" })); Exception exInner = ex.InnerException; Assert.Contains("Ctor Here", exInner.ToString()); - Assert.Contains("InvokeStub_ (Object, IntPtr, Object)", exInner.ToString()); + Assert.Contains("InvokeStub_", exInner.ToString()); } private static bool IsEmitInvokeSupported() diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.Mono.cs index 2d3162d83bfb9a..43fdbf135f5749 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.Mono.cs @@ -745,7 +745,7 @@ internal MethodBaseInvoker Invoker [MethodImpl(MethodImplOptions.AggressiveInlining)] get { - return invoker ??= new MethodBaseInvoker(this, ArgumentTypes, DeclaringType); + return invoker ??= new MethodBaseInvoker(this, ArgumentTypes, returnType: typeof(void)); } } diff --git a/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs b/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs index 348125a734fb26..e2816363a22f8c 100644 --- a/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs @@ -1591,7 +1591,16 @@ private void CreateInstanceCheckThis() } // fast path?? - server = Activator.CreateInstance(this, nonPublic: true, wrapExceptions: wrapExceptions); + try + { + server = Activator.CreateInstance(this, nonPublic: true, wrapExceptions: wrapExceptions); + } + catch (Exception ex) when (wrapExceptions && ex is not TargetInvocationException) + { + // Activator.CreateInstance may indirectly re-enter reflection code in order to call the cctor, + // which can interfere with exception handling since TargetInvocationException may not be thrown. + throw new TargetInvocationException(ex); + } } else { From baa3f2abf6e0d49012626c756d20d8f4370afa56 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Wed, 22 Jan 2025 10:04:09 -0600 Subject: [PATCH 22/24] Check EventSource.IsSupported feature switch --- .../MethodInvokerCommon.WellKnownSignatures.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs index 7c38f699af665b..ed8bdf1871c01e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs @@ -12,9 +12,16 @@ internal static partial class MethodInvokerCommon { private static bool TryGetWellKnownInvokeFunc(MethodBase method, out Delegate? invokeFunc, out InvokerStrategy strategy) { - Type declaringType = method.DeclaringType!; invokeFunc = null; + if (!EventSource.IsSupported) + { + // Currently this method only checks for EventSource-related methods. + strategy = InvokerStrategy.Uninitialized; + return false; + } + + Type declaringType = method.DeclaringType!; if (ReferenceEquals(declaringType, typeof(EventAttribute))) { switch (method.Name) From 287c67bc33e43a1869679f48eec327af699a08f7 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Wed, 29 Jan 2025 17:41:45 -0600 Subject: [PATCH 23/24] Misc cleanup --- .../System/Reflection/ConstructorInvoker.cs | 113 +- .../src/System/Reflection/MethodBase.cs | 4 +- .../System/Reflection/MethodBaseInvoker.cs | 38 +- .../src/System/Reflection/MethodInvoker.cs | 27 +- ...MethodInvokerCommon.WellKnownSignatures.cs | 10 + .../System.Reflection.Emit.sln | 361 ++-- .../System.Runtime/System.Runtime.sln | 1453 ++++++++--------- 7 files changed, 976 insertions(+), 1030 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs index c6956e5796624d..3e8650409034c5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInvoker.cs @@ -27,7 +27,7 @@ public sealed partial class ConstructorInvoker { private readonly RuntimeType _declaringType; private readonly IntPtr _functionPointer; - private readonly Delegate _invokeFunc; // todo: use GetMethodImpl and fcnptr? + private readonly Delegate _invokeFunc; // consider for minor perf: use GetMethodImpl and fcnptr instead private readonly InvokerArgFlags[] _invokerArgFlags; private readonly RuntimeConstructorInfo _method; private readonly RuntimeType[] _parameterTypes; @@ -72,8 +72,6 @@ private ConstructorInvoker(RuntimeConstructorInfo constructor) _declaringType = (RuntimeType)constructor.DeclaringType!; _parameterTypes = constructor.ArgumentTypes; - MethodBase _ = constructor; - Initialize( isForInvokerClasses: true, constructor, @@ -125,9 +123,9 @@ public object Invoke() if (ShouldAllocate) { - object obj = CreateUninitializedObject(); - ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); - return obj; + object returnValue = CreateUninitializedObject(); + ((InvokeFunc_Obj0Args)_invokeFunc)(returnValue, _functionPointer); + return returnValue; } if (_strategy == InvokerStrategy.Ref4) @@ -167,9 +165,9 @@ public object Invoke(object? arg1) if (ShouldAllocate) { - object obj = CreateUninitializedObject(); - ((InvokeFunc_Obj1Arg)_invokeFunc)(obj, _functionPointer, arg1); - return obj; + object returnValue = CreateUninitializedObject(); + ((InvokeFunc_Obj1Arg)_invokeFunc)(returnValue, _functionPointer, arg1); + return returnValue; } return ((InvokeFunc_Obj1Arg)_invokeFunc)(obj: null, _functionPointer, arg1)!; @@ -267,9 +265,9 @@ private object InvokeImpl(object? arg1, object? arg2, object? arg3, object? arg4 if (ShouldAllocate) { - object obj = CreateUninitializedObject(); - ((InvokeFunc_Obj4Args)_invokeFunc)(obj, _functionPointer, arg1, arg2, arg3, arg4); - return obj; + object returnValue = CreateUninitializedObject(); + ((InvokeFunc_Obj4Args)_invokeFunc)(returnValue, _functionPointer, arg1, arg2, arg3, arg4); + return returnValue; } return ((InvokeFunc_Obj4Args)_invokeFunc)(obj: null, _functionPointer, arg1, arg2, arg3, arg4)!; @@ -297,9 +295,9 @@ public object Invoke(Span arguments) case InvokerStrategy.Obj0: if (ShouldAllocate) { - object obj = CreateUninitializedObject(); - ((InvokeFunc_Obj0Args)_invokeFunc)(obj, _functionPointer); - return obj; + object returnValue = CreateUninitializedObject(); + ((InvokeFunc_Obj0Args)_invokeFunc)(returnValue, _functionPointer); + return returnValue; } return ((InvokeFunc_Obj0Args)_invokeFunc)(obj: null, _functionPointer)!; case InvokerStrategy.Obj1: @@ -308,9 +306,9 @@ public object Invoke(Span arguments) if (ShouldAllocate) { - object obj = CreateUninitializedObject(); - ((InvokeFunc_Obj1Arg)_invokeFunc)(obj, _functionPointer, arg1); - return obj; + object returnValue = CreateUninitializedObject(); + ((InvokeFunc_Obj1Arg)_invokeFunc)(returnValue, _functionPointer, arg1); + return returnValue; } return ((InvokeFunc_Obj1Arg)_invokeFunc)(obj: null, _functionPointer, arg1)!; case InvokerStrategy.Obj4: @@ -337,21 +335,13 @@ public object Invoke(Span arguments) // Version with no copy-back. private unsafe object InvokeWithSpanArgs(Span arguments) { - if (_invokeFunc is null) - { - _method.ThrowNoInvokeException(); - } - - object? obj; int argCount = _parameterTypes.Length; - - Span copyOfArgs; - GCFrameRegistration regArgStorage; IntPtr* pArgStorage = stackalloc IntPtr[argCount]; NativeMemory.Clear(pArgStorage, (nuint)argCount * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), argCount); - regArgStorage = new((void**)pArgStorage, (uint)argCount, areByRefs: false); + Span copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), argCount); + GCFrameRegistration regArgStorage = new((void**)pArgStorage, (uint)argCount, areByRefs: false); + object returnValue; try { GCFrameRegistration.RegisterForGCReporting(®ArgStorage); @@ -365,12 +355,12 @@ private unsafe object InvokeWithSpanArgs(Span arguments) if (ShouldAllocate) { - obj = CreateUninitializedObject(); - ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + returnValue = CreateUninitializedObject(); + ((InvokeFunc_ObjSpanArgs)_invokeFunc)(returnValue, _functionPointer, copyOfArgs); } else { - obj = ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj: null, _functionPointer, copyOfArgs)!; + returnValue = ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj: null, _functionPointer, copyOfArgs)!; } // No need to call CopyBack here since there are no ref values. @@ -380,17 +370,12 @@ private unsafe object InvokeWithSpanArgs(Span arguments) GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); } - return obj; + return returnValue; } // Version with no copy-back private unsafe object InvokeWithRefArgs4(object? arg1, object? arg2 = null, object? arg3 = null, object? arg4 = null) { - if (_invokeFunc is null) - { - _method.ThrowNoInvokeException(); - } - int argCount = _parameterTypes.Length; StackAllocatedArguments stackStorage = new(arg1, arg2, arg3, arg4); Span arguments = ((Span)(stackStorage._args)).Slice(0, argCount); @@ -408,27 +393,22 @@ private unsafe object InvokeWithRefArgs4(object? arg1, object? arg2 = null, obje #pragma warning restore CS9080 } - object obj; + object returnValue; if (ShouldAllocate) { - obj = CreateUninitializedObject(); - ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); + returnValue = CreateUninitializedObject(); + ((InvokeFunc_RefArgs)_invokeFunc)(returnValue, _functionPointer, pByRefFixedStorage); } else { - obj = ((InvokeFunc_RefArgs)_invokeFunc)(obj: null, _functionPointer, pByRefFixedStorage)!; + returnValue = ((InvokeFunc_RefArgs)_invokeFunc)(obj: null, _functionPointer, pByRefFixedStorage)!; } - return obj; + return returnValue; } private unsafe object InvokeWithRefArgs4(Span arguments) { - if (_invokeFunc is null) - { - _method.ThrowNoInvokeException(); - } - Debug.Assert(_parameterTypes.Length <= MaxStackAllocArgCount); int argCount = _parameterTypes.Length; @@ -451,44 +431,35 @@ private unsafe object InvokeWithRefArgs4(Span arguments) #pragma warning restore CS9080 } - object obj; + object returnValue; if (ShouldAllocate) { - obj = CreateUninitializedObject(); - ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); + returnValue = CreateUninitializedObject(); + ((InvokeFunc_RefArgs)_invokeFunc)(returnValue, _functionPointer, pByRefFixedStorage); } else { - obj = ((InvokeFunc_RefArgs)_invokeFunc)(obj: null, _functionPointer, pByRefFixedStorage)!; + returnValue = ((InvokeFunc_RefArgs)_invokeFunc)(obj: null, _functionPointer, pByRefFixedStorage)!; } CopyBack(arguments, copyOfArgs, shouldCopyBack); - return obj; + return returnValue; } private unsafe object InvokeWithRefArgsMany(Span arguments) { - if (_invokeFunc is null) - { - _method.ThrowNoInvokeException(); - } - - object? obj; int argCount = _parameterTypes.Length; - - Span copyOfArgs; - GCFrameRegistration regArgStorage; - IntPtr* pStorage = stackalloc IntPtr[2 * argCount]; NativeMemory.Clear(pStorage, (nuint)(2 * argCount) * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pStorage), argCount); + Span copyOfArgs = new(ref Unsafe.AsRef(pStorage), argCount); - IntPtr* pByRefStorage = pStorage + argCount; - scoped Span shouldCopyBack = stackalloc bool[argCount]; + Span shouldCopyBack = stackalloc bool[argCount]; - regArgStorage = new((void**)pStorage, (uint)argCount, areByRefs: false); + IntPtr* pByRefStorage = pStorage + argCount; + GCFrameRegistration regArgStorage = new((void**)pStorage, (uint)argCount, areByRefs: false); GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)argCount, areByRefs: true); + object returnValue; try { GCFrameRegistration.RegisterForGCReporting(®ArgStorage); @@ -506,12 +477,12 @@ private unsafe object InvokeWithRefArgsMany(Span arguments) if (ShouldAllocate) { - obj = CreateUninitializedObject(); - ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); + returnValue = CreateUninitializedObject(); + ((InvokeFunc_RefArgs)_invokeFunc)(returnValue, _functionPointer, pByRefStorage); } else { - obj = ((InvokeFunc_RefArgs)_invokeFunc)(obj: null, _functionPointer, pByRefStorage)!; + returnValue = ((InvokeFunc_RefArgs)_invokeFunc)(obj: null, _functionPointer, pByRefStorage)!; } CopyBack(arguments, copyOfArgs, shouldCopyBack); @@ -522,7 +493,7 @@ private unsafe object InvokeWithRefArgsMany(Span arguments) GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); } - return obj; + return returnValue; } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs index f762138f3ea557..e9b6160e43807c 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBase.cs @@ -194,12 +194,12 @@ internal enum InvokerStrategy ObjSpan = 4, /// - /// Slower approach that handles copy back for 4 arguments or less. + /// Slower approach for the interpreted path case or to support copy back for 4 arguments or less. /// Ref4 = 5, /// - /// Slower approach that handles copy back for 5 or more arguments. + /// Slower approach for the interpreted path case or to support copy back for 5+ arguments. /// RefMany = 6, } diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs index cc569af2c7e101..d0e082f1e3cf35 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodBaseInvoker.cs @@ -279,16 +279,12 @@ internal static void ThrowTargetParameterCountException() Debug.Assert(_parameterTypes.Length > MaxStackAllocArgCount); int argCount = _parameterTypes.Length; - Span copyOfArgs; - object? ret; - GCFrameRegistration regArgStorage; - Span shouldCopyBack; - IntPtr* pArgStorage = stackalloc IntPtr[argCount * 2]; NativeMemory.Clear(pArgStorage, (nuint)argCount * (nuint)sizeof(IntPtr) * 2); - copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), argCount); - regArgStorage = new((void**)pArgStorage, (uint)argCount, areByRefs: false); - shouldCopyBack = new Span(pArgStorage + argCount, argCount); + Span copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), argCount); + GCFrameRegistration regArgStorage = new((void**)pArgStorage, (uint)argCount, areByRefs: false); + Span shouldCopyBack = new Span(pArgStorage + argCount, argCount); + object? returnValue; try { @@ -302,11 +298,11 @@ internal static void ThrowTargetParameterCountException() Debug.Assert(obj is null); obj = CreateUninitializedObject(); ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); - ret = obj; + returnValue = obj; } else { - ret = ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); + returnValue = ((InvokeFunc_ObjSpanArgs)_invokeFunc)(obj, _functionPointer, copyOfArgs); } } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) @@ -315,7 +311,7 @@ internal static void ThrowTargetParameterCountException() } CopyBack(arguments, copyOfArgs, shouldCopyBack); - return ret; + return returnValue; } finally { @@ -363,7 +359,7 @@ internal static void ThrowTargetParameterCountException() ByReference.Create(ref Unsafe.AsRef(ref copyOfArgs[i])); } - object? ret; + object? returnValue; try { if (ShouldAllocate) @@ -371,11 +367,11 @@ internal static void ThrowTargetParameterCountException() Debug.Assert(obj is null); obj = CreateUninitializedObject(); ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); - ret = obj; + returnValue = obj; } else { - ret = ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); + returnValue = ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefFixedStorage); } } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) @@ -384,7 +380,7 @@ internal static void ThrowTargetParameterCountException() } CopyBack(arguments!, copyOfArgs, shouldCopyBack); - return ret; + return returnValue; } internal object? InvokeWithManyRefArgs( @@ -396,13 +392,15 @@ internal static void ThrowTargetParameterCountException() { Debug.Assert(_parameterTypes.Length > MaxStackAllocArgCount); - object? ret; + object? returnValue; int argCount = _parameterTypes.Length; IntPtr* pStorage = stackalloc IntPtr[3 * argCount]; NativeMemory.Clear(pStorage, (nuint)(3 * argCount) * (nuint)sizeof(IntPtr)); - IntPtr* pByRefStorage = pStorage + argCount; + Span copyOfArgs = new(ref Unsafe.AsRef(pStorage), argCount); + + IntPtr* pByRefStorage = pStorage + argCount; GCFrameRegistration regArgStorage = new((void**)pStorage, (uint)argCount, areByRefs: false); GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)argCount, areByRefs: true); Span shouldCopyBack = new Span(pStorage + argCount * 2, argCount); @@ -428,11 +426,11 @@ internal static void ThrowTargetParameterCountException() Debug.Assert(obj is null); obj = CreateUninitializedObject(); ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); - ret = obj; + returnValue = obj; } else { - ret = ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); + returnValue = ((InvokeFunc_RefArgs)_invokeFunc)(obj, _functionPointer, pByRefStorage); } } catch (Exception e) when ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) @@ -448,7 +446,7 @@ internal static void ThrowTargetParameterCountException() GCFrameRegistration.UnregisterForGCReporting(®ArgStorage); } - return ret; + return returnValue; } // Copy modified values out. This is done with ByRef, Type.Missing and arguments changed by the Binder. diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs index 917a5955c0ee7d..2e8fe800c43f76 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvoker.cs @@ -343,14 +343,10 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu private unsafe object? InvokeWithSpanArgs(object? obj, Span arguments) { int argCount = _parameterTypes.Length; - - Span copyOfArgs; - GCFrameRegistration regArgStorage; - IntPtr* pArgStorage = stackalloc IntPtr[argCount]; NativeMemory.Clear(pArgStorage, (nuint)argCount * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), argCount); - regArgStorage = new((void**)pArgStorage, (uint)argCount, areByRefs: false); + Span copyOfArgs = new(ref Unsafe.AsRef(pArgStorage), argCount); + GCFrameRegistration regArgStorage = new((void**)pArgStorage, (uint)argCount, areByRefs: false); try { @@ -419,25 +415,22 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu #pragma warning restore CS9080 } - object? ret = ((InvokeFunc_RefArgs)_invokeFunc!)(obj, _functionPointer, pByRefFixedStorage); + object? returnValue = ((InvokeFunc_RefArgs)_invokeFunc!)(obj, _functionPointer, pByRefFixedStorage); CopyBack(arguments, copyOfArgs, shouldCopyBack); - return ret; + return returnValue; } private unsafe object? InvokeWithRefArgsMany(object? obj, Span arguments) { int argCount = _parameterTypes.Length; - Span copyOfArgs; - GCFrameRegistration regArgStorage; - IntPtr* pStorage = stackalloc IntPtr[2 * argCount]; NativeMemory.Clear(pStorage, (nuint)(2 * argCount) * (nuint)sizeof(IntPtr)); - copyOfArgs = new(ref Unsafe.AsRef(pStorage), argCount); + Span copyOfArgs = new(ref Unsafe.AsRef(pStorage), argCount); - IntPtr* pByRefStorage = pStorage + argCount; - scoped Span shouldCopyBack = stackalloc bool[argCount]; + Span shouldCopyBack = stackalloc bool[argCount]; - regArgStorage = new((void**)pStorage, (uint)argCount, areByRefs: false); + IntPtr* pByRefStorage = pStorage + argCount; + GCFrameRegistration regArgStorage = new((void**)pStorage, (uint)argCount, areByRefs: false); GCFrameRegistration regByRefStorage = new((void**)pByRefStorage, (uint)argCount, areByRefs: true); try @@ -455,9 +448,9 @@ private MethodInvoker(MethodBase method, RuntimeType[] parameterTypes, Type retu ByReference.Create(ref Unsafe.AsRef(pStorage + i)); } - object? ret = ((InvokeFunc_RefArgs)_invokeFunc!)(obj, _functionPointer, pByRefStorage); + object? returnValue = ((InvokeFunc_RefArgs)_invokeFunc!)(obj, _functionPointer, pByRefStorage); CopyBack(arguments, copyOfArgs, shouldCopyBack); - return ret; + return returnValue; } finally { diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs index ed8bdf1871c01e..136c8c1e20220c 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/MethodInvokerCommon.WellKnownSignatures.cs @@ -10,6 +10,16 @@ namespace System.Reflection { internal static partial class MethodInvokerCommon { + /// + /// Tries to get the well-known invoke function for the specified method. + /// + // An alternative to hard-coding these types is to use a few shared function pointer signatures (at a minimum + // for property setters and getters on reference types) plus add an intrinsic to invoke the function pointer + // on an instance since currently function pointers only support calling statics. + // + // Another feature that would add extensibility is to add an API to specify the callback on MethodInfo\ConstructorInfo + // when Invoke is called. This assumes the caller knows the signature. This would tie into the existing design here + // without a perf impact to existing code since the callback would use the existing well-known signatures. private static bool TryGetWellKnownInvokeFunc(MethodBase method, out Delegate? invokeFunc, out InvokerStrategy strategy) { invokeFunc = null; diff --git a/src/libraries/System.Reflection.Emit/System.Reflection.Emit.sln b/src/libraries/System.Reflection.Emit/System.Reflection.Emit.sln index 793b25bee5c900..3aa057ce45ef16 100644 --- a/src/libraries/System.Reflection.Emit/System.Reflection.Emit.sln +++ b/src/libraries/System.Reflection.Emit/System.Reflection.Emit.sln @@ -1,4 +1,8 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.13.35617.110 d17.13 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Private.CoreLib", "..\..\coreclr\System.Private.CoreLib\System.Private.CoreLib.csproj", "{772C93D4-FC45-46AA-B09F-26F01B672EDC}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestUtilities", "..\Common\tests\TestUtilities\TestUtilities.csproj", "{E5543842-139D-43BD-B604-E65EBB91649E}" @@ -67,16 +71,21 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{C36D185D-9B3 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "tools\gen", "{611CB559-49A7-4046-9425-50E25205E891}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{611CB559-49A7-4046-9425-50E25205E891}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "tools\src", "{59251F20-422C-41BC-9C0E-4517B5C2018D}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{59251F20-422C-41BC-9C0E-4517B5C2018D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "tools\ref", "{AA8FF9D5-BB95-481B-A56A-E8FAF9725F97}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{AA8FF9D5-BB95-481B-A56A-E8FAF9725F97}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{A3402532-58BD-4AB1-870F-CFD829CEAD18}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Checked|Any CPU = Checked|Any CPU + Checked|arm = Checked|arm + Checked|arm64 = Checked|arm64 + Checked|x64 = Checked|x64 + Checked|x86 = Checked|x86 Debug|Any CPU = Debug|Any CPU Debug|arm = Debug|arm Debug|arm64 = Debug|arm64 @@ -87,13 +96,18 @@ Global Release|arm64 = Release|arm64 Release|x64 = Release|x64 Release|x86 = Release|x86 - Checked|Any CPU = Checked|Any CPU - Checked|arm = Checked|arm - Checked|arm64 = Checked|arm64 - Checked|x64 = Checked|x64 - Checked|x86 = Checked|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|Any CPU.ActiveCfg = Checked|x64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|Any CPU.Build.0 = Checked|x64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm.ActiveCfg = Checked|arm + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm.Build.0 = Checked|arm + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm64.ActiveCfg = Checked|arm64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm64.Build.0 = Checked|arm64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x64.ActiveCfg = Checked|x64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x64.Build.0 = Checked|x64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x86.ActiveCfg = Checked|x86 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x86.Build.0 = Checked|x86 {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Debug|Any CPU.ActiveCfg = Debug|x64 {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Debug|Any CPU.Build.0 = Debug|x64 {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Debug|arm.ActiveCfg = Debug|arm @@ -114,16 +128,11 @@ Global {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Release|x64.Build.0 = Release|x64 {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Release|x86.ActiveCfg = Release|x86 {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Release|x86.Build.0 = Release|x86 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|Any CPU.ActiveCfg = Checked|x64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|Any CPU.Build.0 = Checked|x64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm.ActiveCfg = Checked|arm - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm.Build.0 = Checked|arm - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm64.ActiveCfg = Checked|arm64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm64.Build.0 = Checked|arm64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x64.ActiveCfg = Checked|x64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x64.Build.0 = Checked|x64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x86.ActiveCfg = Checked|x86 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x86.Build.0 = Checked|x86 + {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|arm.ActiveCfg = Debug|Any CPU + {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|x64.ActiveCfg = Debug|Any CPU + {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|x86.ActiveCfg = Debug|Any CPU {E5543842-139D-43BD-B604-E65EBB91649E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E5543842-139D-43BD-B604-E65EBB91649E}.Debug|Any CPU.Build.0 = Debug|Any CPU {E5543842-139D-43BD-B604-E65EBB91649E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -140,11 +149,11 @@ Global {E5543842-139D-43BD-B604-E65EBB91649E}.Release|x64.Build.0 = Release|Any CPU {E5543842-139D-43BD-B604-E65EBB91649E}.Release|x86.ActiveCfg = Release|Any CPU {E5543842-139D-43BD-B604-E65EBB91649E}.Release|x86.Build.0 = Release|Any CPU - {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|arm.ActiveCfg = Debug|Any CPU - {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|x64.ActiveCfg = Debug|Any CPU - {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|x86.ActiveCfg = Debug|Any CPU + {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|arm.ActiveCfg = Debug|Any CPU + {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|arm64.ActiveCfg = Debug|Any CPU + {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|x64.ActiveCfg = Debug|Any CPU + {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|x86.ActiveCfg = Debug|Any CPU {DE04D45B-7E15-409D-A176-985D814A6AEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DE04D45B-7E15-409D-A176-985D814A6AEB}.Debug|Any CPU.Build.0 = Debug|Any CPU {DE04D45B-7E15-409D-A176-985D814A6AEB}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -161,11 +170,11 @@ Global {DE04D45B-7E15-409D-A176-985D814A6AEB}.Release|x64.Build.0 = Release|Any CPU {DE04D45B-7E15-409D-A176-985D814A6AEB}.Release|x86.ActiveCfg = Release|Any CPU {DE04D45B-7E15-409D-A176-985D814A6AEB}.Release|x86.Build.0 = Release|Any CPU - {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|arm.ActiveCfg = Debug|Any CPU - {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|arm64.ActiveCfg = Debug|Any CPU - {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|x64.ActiveCfg = Debug|Any CPU - {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|x86.ActiveCfg = Debug|Any CPU + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|arm.ActiveCfg = Debug|Any CPU + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|x64.ActiveCfg = Debug|Any CPU + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|x86.ActiveCfg = Debug|Any CPU {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Debug|Any CPU.Build.0 = Debug|Any CPU {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -182,11 +191,11 @@ Global {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Release|x64.Build.0 = Release|Any CPU {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Release|x86.ActiveCfg = Release|Any CPU {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Release|x86.Build.0 = Release|Any CPU - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|arm.ActiveCfg = Debug|Any CPU - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|x64.ActiveCfg = Debug|Any CPU - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|x86.ActiveCfg = Debug|Any CPU + {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|arm.ActiveCfg = Debug|Any CPU + {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|x64.ActiveCfg = Debug|Any CPU + {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|x86.ActiveCfg = Debug|Any CPU {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Debug|Any CPU.Build.0 = Debug|Any CPU {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -203,11 +212,11 @@ Global {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Release|x64.Build.0 = Release|Any CPU {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Release|x86.ActiveCfg = Release|Any CPU {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Release|x86.Build.0 = Release|Any CPU - {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|arm.ActiveCfg = Debug|Any CPU - {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|x64.ActiveCfg = Debug|Any CPU - {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|x86.ActiveCfg = Debug|Any CPU + {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|arm.ActiveCfg = Debug|Any CPU + {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|arm64.ActiveCfg = Debug|Any CPU + {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|x64.ActiveCfg = Debug|Any CPU + {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|x86.ActiveCfg = Debug|Any CPU {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Debug|Any CPU.Build.0 = Debug|Any CPU {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -224,11 +233,11 @@ Global {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Release|x64.Build.0 = Release|Any CPU {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Release|x86.ActiveCfg = Release|Any CPU {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Release|x86.Build.0 = Release|Any CPU - {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|arm.ActiveCfg = Debug|Any CPU - {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|arm64.ActiveCfg = Debug|Any CPU - {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|x64.ActiveCfg = Debug|Any CPU - {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|x86.ActiveCfg = Debug|Any CPU + {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|arm.ActiveCfg = Debug|Any CPU + {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|arm64.ActiveCfg = Debug|Any CPU + {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|x64.ActiveCfg = Debug|Any CPU + {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|x86.ActiveCfg = Debug|Any CPU {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Debug|Any CPU.Build.0 = Debug|Any CPU {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -245,11 +254,11 @@ Global {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Release|x64.Build.0 = Release|Any CPU {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Release|x86.ActiveCfg = Release|Any CPU {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Release|x86.Build.0 = Release|Any CPU - {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|arm.ActiveCfg = Debug|Any CPU - {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|arm64.ActiveCfg = Debug|Any CPU - {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|x64.ActiveCfg = Debug|Any CPU - {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|x86.ActiveCfg = Debug|Any CPU + {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|arm.ActiveCfg = Debug|Any CPU + {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|x64.ActiveCfg = Debug|Any CPU + {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|x86.ActiveCfg = Debug|Any CPU {C5EC183F-7276-43DB-9916-E861AEC47418}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C5EC183F-7276-43DB-9916-E861AEC47418}.Debug|Any CPU.Build.0 = Debug|Any CPU {C5EC183F-7276-43DB-9916-E861AEC47418}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -266,11 +275,11 @@ Global {C5EC183F-7276-43DB-9916-E861AEC47418}.Release|x64.Build.0 = Release|Any CPU {C5EC183F-7276-43DB-9916-E861AEC47418}.Release|x86.ActiveCfg = Release|Any CPU {C5EC183F-7276-43DB-9916-E861AEC47418}.Release|x86.Build.0 = Release|Any CPU - {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|arm.ActiveCfg = Debug|Any CPU - {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|x64.ActiveCfg = Debug|Any CPU - {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|x86.ActiveCfg = Debug|Any CPU + {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|arm.ActiveCfg = Debug|Any CPU + {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|x64.ActiveCfg = Debug|Any CPU + {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|x86.ActiveCfg = Debug|Any CPU {D5FD16CF-7435-4E47-928A-9BC94968091D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5FD16CF-7435-4E47-928A-9BC94968091D}.Debug|Any CPU.Build.0 = Debug|Any CPU {D5FD16CF-7435-4E47-928A-9BC94968091D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -287,11 +296,11 @@ Global {D5FD16CF-7435-4E47-928A-9BC94968091D}.Release|x64.Build.0 = Release|Any CPU {D5FD16CF-7435-4E47-928A-9BC94968091D}.Release|x86.ActiveCfg = Release|Any CPU {D5FD16CF-7435-4E47-928A-9BC94968091D}.Release|x86.Build.0 = Release|Any CPU - {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|arm.ActiveCfg = Debug|Any CPU - {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|x64.ActiveCfg = Debug|Any CPU - {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|x86.ActiveCfg = Debug|Any CPU + {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|arm.ActiveCfg = Debug|Any CPU + {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|arm64.ActiveCfg = Debug|Any CPU + {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|x64.ActiveCfg = Debug|Any CPU + {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|x86.ActiveCfg = Debug|Any CPU {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Debug|Any CPU.Build.0 = Debug|Any CPU {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -308,11 +317,11 @@ Global {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Release|x64.Build.0 = Release|Any CPU {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Release|x86.ActiveCfg = Release|Any CPU {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Release|x86.Build.0 = Release|Any CPU - {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|arm.ActiveCfg = Debug|Any CPU - {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|arm64.ActiveCfg = Debug|Any CPU - {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|x64.ActiveCfg = Debug|Any CPU - {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|x86.ActiveCfg = Debug|Any CPU + {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|arm.ActiveCfg = Debug|Any CPU + {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|arm64.ActiveCfg = Debug|Any CPU + {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|x64.ActiveCfg = Debug|Any CPU + {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|x86.ActiveCfg = Debug|Any CPU {6A176C5B-206D-4550-AC36-0530218E29F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6A176C5B-206D-4550-AC36-0530218E29F5}.Debug|Any CPU.Build.0 = Debug|Any CPU {6A176C5B-206D-4550-AC36-0530218E29F5}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -329,11 +338,11 @@ Global {6A176C5B-206D-4550-AC36-0530218E29F5}.Release|x64.Build.0 = Release|Any CPU {6A176C5B-206D-4550-AC36-0530218E29F5}.Release|x86.ActiveCfg = Release|Any CPU {6A176C5B-206D-4550-AC36-0530218E29F5}.Release|x86.Build.0 = Release|Any CPU - {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|arm.ActiveCfg = Debug|Any CPU - {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|arm64.ActiveCfg = Debug|Any CPU - {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|x64.ActiveCfg = Debug|Any CPU - {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|x86.ActiveCfg = Debug|Any CPU + {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|arm.ActiveCfg = Debug|Any CPU + {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|x64.ActiveCfg = Debug|Any CPU + {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|x86.ActiveCfg = Debug|Any CPU {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Debug|Any CPU.Build.0 = Debug|Any CPU {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -350,11 +359,11 @@ Global {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Release|x64.Build.0 = Release|Any CPU {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Release|x86.ActiveCfg = Release|Any CPU {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Release|x86.Build.0 = Release|Any CPU - {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|arm.ActiveCfg = Debug|Any CPU - {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|x64.ActiveCfg = Debug|Any CPU - {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|x86.ActiveCfg = Debug|Any CPU + {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|arm.ActiveCfg = Debug|Any CPU + {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|x64.ActiveCfg = Debug|Any CPU + {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|x86.ActiveCfg = Debug|Any CPU {82899000-791E-42FF-A594-6DE65DE07C9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {82899000-791E-42FF-A594-6DE65DE07C9E}.Debug|Any CPU.Build.0 = Debug|Any CPU {82899000-791E-42FF-A594-6DE65DE07C9E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -371,11 +380,11 @@ Global {82899000-791E-42FF-A594-6DE65DE07C9E}.Release|x64.Build.0 = Release|Any CPU {82899000-791E-42FF-A594-6DE65DE07C9E}.Release|x86.ActiveCfg = Release|Any CPU {82899000-791E-42FF-A594-6DE65DE07C9E}.Release|x86.Build.0 = Release|Any CPU - {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|arm.ActiveCfg = Debug|Any CPU - {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|x64.ActiveCfg = Debug|Any CPU - {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|x86.ActiveCfg = Debug|Any CPU + {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|arm.ActiveCfg = Debug|Any CPU + {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|x64.ActiveCfg = Debug|Any CPU + {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|x86.ActiveCfg = Debug|Any CPU {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Debug|Any CPU.Build.0 = Debug|Any CPU {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -392,11 +401,11 @@ Global {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Release|x64.Build.0 = Release|Any CPU {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Release|x86.ActiveCfg = Release|Any CPU {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Release|x86.Build.0 = Release|Any CPU - {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|arm.ActiveCfg = Debug|Any CPU - {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|x64.ActiveCfg = Debug|Any CPU - {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|x86.ActiveCfg = Debug|Any CPU + {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|arm.ActiveCfg = Debug|Any CPU + {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|x64.ActiveCfg = Debug|Any CPU + {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|x86.ActiveCfg = Debug|Any CPU {F33093A8-FF33-4F95-B256-F2AB712C956A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F33093A8-FF33-4F95-B256-F2AB712C956A}.Debug|Any CPU.Build.0 = Debug|Any CPU {F33093A8-FF33-4F95-B256-F2AB712C956A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -413,11 +422,11 @@ Global {F33093A8-FF33-4F95-B256-F2AB712C956A}.Release|x64.Build.0 = Release|Any CPU {F33093A8-FF33-4F95-B256-F2AB712C956A}.Release|x86.ActiveCfg = Release|Any CPU {F33093A8-FF33-4F95-B256-F2AB712C956A}.Release|x86.Build.0 = Release|Any CPU - {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|arm.ActiveCfg = Debug|Any CPU - {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|x64.ActiveCfg = Debug|Any CPU - {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|x86.ActiveCfg = Debug|Any CPU + {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|arm.ActiveCfg = Debug|Any CPU + {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|x64.ActiveCfg = Debug|Any CPU + {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|x86.ActiveCfg = Debug|Any CPU {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Debug|Any CPU.Build.0 = Debug|Any CPU {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -434,11 +443,11 @@ Global {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Release|x64.Build.0 = Release|Any CPU {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Release|x86.ActiveCfg = Release|Any CPU {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Release|x86.Build.0 = Release|Any CPU - {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|arm.ActiveCfg = Debug|Any CPU - {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|x64.ActiveCfg = Debug|Any CPU - {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|x86.ActiveCfg = Debug|Any CPU + {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|arm.ActiveCfg = Debug|Any CPU + {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|x64.ActiveCfg = Debug|Any CPU + {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|x86.ActiveCfg = Debug|Any CPU {9F3970FF-F138-4F23-A2F8-2387858E723D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F3970FF-F138-4F23-A2F8-2387858E723D}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F3970FF-F138-4F23-A2F8-2387858E723D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -455,11 +464,11 @@ Global {9F3970FF-F138-4F23-A2F8-2387858E723D}.Release|x64.Build.0 = Release|Any CPU {9F3970FF-F138-4F23-A2F8-2387858E723D}.Release|x86.ActiveCfg = Release|Any CPU {9F3970FF-F138-4F23-A2F8-2387858E723D}.Release|x86.Build.0 = Release|Any CPU - {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|arm.ActiveCfg = Debug|Any CPU - {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|x64.ActiveCfg = Debug|Any CPU - {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|x86.ActiveCfg = Debug|Any CPU + {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|arm.ActiveCfg = Debug|Any CPU + {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|arm64.ActiveCfg = Debug|Any CPU + {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|x64.ActiveCfg = Debug|Any CPU + {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|x86.ActiveCfg = Debug|Any CPU {FD4D647F-490B-420A-B2FD-29751E0C3454}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FD4D647F-490B-420A-B2FD-29751E0C3454}.Debug|Any CPU.Build.0 = Debug|Any CPU {FD4D647F-490B-420A-B2FD-29751E0C3454}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -476,11 +485,11 @@ Global {FD4D647F-490B-420A-B2FD-29751E0C3454}.Release|x64.Build.0 = Release|Any CPU {FD4D647F-490B-420A-B2FD-29751E0C3454}.Release|x86.ActiveCfg = Release|Any CPU {FD4D647F-490B-420A-B2FD-29751E0C3454}.Release|x86.Build.0 = Release|Any CPU - {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|arm.ActiveCfg = Debug|Any CPU - {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|arm64.ActiveCfg = Debug|Any CPU - {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|x64.ActiveCfg = Debug|Any CPU - {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|x86.ActiveCfg = Debug|Any CPU + {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|arm.ActiveCfg = Debug|Any CPU + {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|x64.ActiveCfg = Debug|Any CPU + {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|x86.ActiveCfg = Debug|Any CPU {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Debug|Any CPU.Build.0 = Debug|Any CPU {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -497,11 +506,11 @@ Global {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Release|x64.Build.0 = Release|Any CPU {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Release|x86.ActiveCfg = Release|Any CPU {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Release|x86.Build.0 = Release|Any CPU - {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|arm.ActiveCfg = Debug|Any CPU - {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|x64.ActiveCfg = Debug|Any CPU - {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|x86.ActiveCfg = Debug|Any CPU + {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|arm.ActiveCfg = Debug|Any CPU + {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|x64.ActiveCfg = Debug|Any CPU + {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|x86.ActiveCfg = Debug|Any CPU {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -518,11 +527,11 @@ Global {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Release|x64.Build.0 = Release|Any CPU {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Release|x86.ActiveCfg = Release|Any CPU {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Release|x86.Build.0 = Release|Any CPU - {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|arm.ActiveCfg = Debug|Any CPU - {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|x64.ActiveCfg = Debug|Any CPU - {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|x86.ActiveCfg = Debug|Any CPU + {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|arm.ActiveCfg = Debug|Any CPU + {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|arm64.ActiveCfg = Debug|Any CPU + {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|x64.ActiveCfg = Debug|Any CPU + {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|x86.ActiveCfg = Debug|Any CPU {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Debug|Any CPU.Build.0 = Debug|Any CPU {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -539,11 +548,11 @@ Global {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Release|x64.Build.0 = Release|Any CPU {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Release|x86.ActiveCfg = Release|Any CPU {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Release|x86.Build.0 = Release|Any CPU - {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|arm.ActiveCfg = Debug|Any CPU - {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|arm64.ActiveCfg = Debug|Any CPU - {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|x64.ActiveCfg = Debug|Any CPU - {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|x86.ActiveCfg = Debug|Any CPU + {506EBBFA-FF57-4141-A725-882110C17598}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {506EBBFA-FF57-4141-A725-882110C17598}.Checked|arm.ActiveCfg = Debug|Any CPU + {506EBBFA-FF57-4141-A725-882110C17598}.Checked|arm64.ActiveCfg = Debug|Any CPU + {506EBBFA-FF57-4141-A725-882110C17598}.Checked|x64.ActiveCfg = Debug|Any CPU + {506EBBFA-FF57-4141-A725-882110C17598}.Checked|x86.ActiveCfg = Debug|Any CPU {506EBBFA-FF57-4141-A725-882110C17598}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {506EBBFA-FF57-4141-A725-882110C17598}.Debug|Any CPU.Build.0 = Debug|Any CPU {506EBBFA-FF57-4141-A725-882110C17598}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -560,11 +569,11 @@ Global {506EBBFA-FF57-4141-A725-882110C17598}.Release|x64.Build.0 = Release|Any CPU {506EBBFA-FF57-4141-A725-882110C17598}.Release|x86.ActiveCfg = Release|Any CPU {506EBBFA-FF57-4141-A725-882110C17598}.Release|x86.Build.0 = Release|Any CPU - {506EBBFA-FF57-4141-A725-882110C17598}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {506EBBFA-FF57-4141-A725-882110C17598}.Checked|arm.ActiveCfg = Debug|Any CPU - {506EBBFA-FF57-4141-A725-882110C17598}.Checked|arm64.ActiveCfg = Debug|Any CPU - {506EBBFA-FF57-4141-A725-882110C17598}.Checked|x64.ActiveCfg = Debug|Any CPU - {506EBBFA-FF57-4141-A725-882110C17598}.Checked|x86.ActiveCfg = Debug|Any CPU + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|arm.ActiveCfg = Debug|Any CPU + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|x64.ActiveCfg = Debug|Any CPU + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|x86.ActiveCfg = Debug|Any CPU {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -581,11 +590,11 @@ Global {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Release|x64.Build.0 = Release|Any CPU {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Release|x86.ActiveCfg = Release|Any CPU {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Release|x86.Build.0 = Release|Any CPU - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|arm.ActiveCfg = Debug|Any CPU - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|x64.ActiveCfg = Debug|Any CPU - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|x86.ActiveCfg = Debug|Any CPU + {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|arm.ActiveCfg = Debug|Any CPU + {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|arm64.ActiveCfg = Debug|Any CPU + {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|x64.ActiveCfg = Debug|Any CPU + {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|x86.ActiveCfg = Debug|Any CPU {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Debug|Any CPU.Build.0 = Debug|Any CPU {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -602,11 +611,11 @@ Global {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Release|x64.Build.0 = Release|Any CPU {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Release|x86.ActiveCfg = Release|Any CPU {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Release|x86.Build.0 = Release|Any CPU - {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|arm.ActiveCfg = Debug|Any CPU - {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|arm64.ActiveCfg = Debug|Any CPU - {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|x64.ActiveCfg = Debug|Any CPU - {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|x86.ActiveCfg = Debug|Any CPU + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|arm.ActiveCfg = Debug|Any CPU + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|x64.ActiveCfg = Debug|Any CPU + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|x86.ActiveCfg = Debug|Any CPU {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Debug|Any CPU.Build.0 = Debug|Any CPU {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -623,11 +632,11 @@ Global {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Release|x64.Build.0 = Release|Any CPU {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Release|x86.ActiveCfg = Release|Any CPU {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Release|x86.Build.0 = Release|Any CPU - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|arm.ActiveCfg = Debug|Any CPU - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|x64.ActiveCfg = Debug|Any CPU - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|x86.ActiveCfg = Debug|Any CPU + {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|arm.ActiveCfg = Debug|Any CPU + {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|x64.ActiveCfg = Debug|Any CPU + {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|x86.ActiveCfg = Debug|Any CPU {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Debug|Any CPU.Build.0 = Debug|Any CPU {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -644,11 +653,11 @@ Global {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Release|x64.Build.0 = Release|Any CPU {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Release|x86.ActiveCfg = Release|Any CPU {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Release|x86.Build.0 = Release|Any CPU - {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|arm.ActiveCfg = Debug|Any CPU - {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|x64.ActiveCfg = Debug|Any CPU - {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|x86.ActiveCfg = Debug|Any CPU + {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|arm.ActiveCfg = Debug|Any CPU + {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|x64.ActiveCfg = Debug|Any CPU + {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|x86.ActiveCfg = Debug|Any CPU {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Debug|Any CPU.Build.0 = Debug|Any CPU {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -665,11 +674,11 @@ Global {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Release|x64.Build.0 = Release|Any CPU {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Release|x86.ActiveCfg = Release|Any CPU {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Release|x86.Build.0 = Release|Any CPU - {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|arm.ActiveCfg = Debug|Any CPU - {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|x64.ActiveCfg = Debug|Any CPU - {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|x86.ActiveCfg = Debug|Any CPU + {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|arm.ActiveCfg = Debug|Any CPU + {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|arm64.ActiveCfg = Debug|Any CPU + {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|x64.ActiveCfg = Debug|Any CPU + {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|x86.ActiveCfg = Debug|Any CPU {30B7883D-A8B5-47F2-B242-971D585483B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {30B7883D-A8B5-47F2-B242-971D585483B8}.Debug|Any CPU.Build.0 = Debug|Any CPU {30B7883D-A8B5-47F2-B242-971D585483B8}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -686,11 +695,11 @@ Global {30B7883D-A8B5-47F2-B242-971D585483B8}.Release|x64.Build.0 = Release|Any CPU {30B7883D-A8B5-47F2-B242-971D585483B8}.Release|x86.ActiveCfg = Release|Any CPU {30B7883D-A8B5-47F2-B242-971D585483B8}.Release|x86.Build.0 = Release|Any CPU - {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|arm.ActiveCfg = Debug|Any CPU - {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|arm64.ActiveCfg = Debug|Any CPU - {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|x64.ActiveCfg = Debug|Any CPU - {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|x86.ActiveCfg = Debug|Any CPU + {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|arm.ActiveCfg = Debug|Any CPU + {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|arm64.ActiveCfg = Debug|Any CPU + {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|x64.ActiveCfg = Debug|Any CPU + {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|x86.ActiveCfg = Debug|Any CPU {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Debug|Any CPU.Build.0 = Debug|Any CPU {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -707,11 +716,11 @@ Global {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Release|x64.Build.0 = Release|Any CPU {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Release|x86.ActiveCfg = Release|Any CPU {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Release|x86.Build.0 = Release|Any CPU - {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|arm.ActiveCfg = Debug|Any CPU - {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|arm64.ActiveCfg = Debug|Any CPU - {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|x64.ActiveCfg = Debug|Any CPU - {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|x86.ActiveCfg = Debug|Any CPU + {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|arm.ActiveCfg = Debug|Any CPU + {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|x64.ActiveCfg = Debug|Any CPU + {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|x86.ActiveCfg = Debug|Any CPU {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -728,51 +737,51 @@ Global {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Release|x64.Build.0 = Release|Any CPU {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Release|x86.ActiveCfg = Release|Any CPU {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Release|x86.Build.0 = Release|Any CPU - {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|arm.ActiveCfg = Debug|Any CPU - {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|x64.ActiveCfg = Debug|Any CPU - {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|x86.ActiveCfg = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {772C93D4-FC45-46AA-B09F-26F01B672EDC} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} - {D5FD16CF-7435-4E47-928A-9BC94968091D} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} - {B479A4BF-A3A5-4255-A3EF-135015BD877F} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} - {F33093A8-FF33-4F95-B256-F2AB712C956A} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} - {9F3970FF-F138-4F23-A2F8-2387858E723D} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {E5543842-139D-43BD-B604-E65EBB91649E} = {2FC35C2F-76DB-4D84-B421-9700BEA4D161} - {82899000-791E-42FF-A594-6DE65DE07C9E} = {2FC35C2F-76DB-4D84-B421-9700BEA4D161} {DE04D45B-7E15-409D-A176-985D814A6AEB} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} {62BB75B8-691F-4416-B162-16CB3DE04BBB} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {848EFB55-86B5-4259-BAA2-A49C6E3421A9} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} {C5EC183F-7276-43DB-9916-E861AEC47418} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {D5FD16CF-7435-4E47-928A-9BC94968091D} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {8D5878A9-E855-4E70-A3D5-42EB71037D96} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} {6A176C5B-206D-4550-AC36-0530218E29F5} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {B479A4BF-A3A5-4255-A3EF-135015BD877F} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} + {82899000-791E-42FF-A594-6DE65DE07C9E} = {2FC35C2F-76DB-4D84-B421-9700BEA4D161} {E468274C-8F7E-49FC-BC2A-82C8B9E5B026} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {F33093A8-FF33-4F95-B256-F2AB712C956A} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {B2FAA0B4-2976-4742-B186-9C4928BCF9AF} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {9F3970FF-F138-4F23-A2F8-2387858E723D} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {FD4D647F-490B-420A-B2FD-29751E0C3454} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {613C42F2-847A-42B3-9F5E-F5A670356BF7} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {848EFB55-86B5-4259-BAA2-A49C6E3421A9} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} {1B329538-0FC3-476A-A986-3EFB0B66CDD0} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} {73EA94AD-0C65-47C8-851C-12D136A0DCC1} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} {506EBBFA-FF57-4141-A725-882110C17598} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {613C42F2-847A-42B3-9F5E-F5A670356BF7} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {AD7C04D0-8F8C-4114-975F-804C5E30C5D6} = {611CB559-49A7-4046-9425-50E25205E891} {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D} = {611CB559-49A7-4046-9425-50E25205E891} - {611CB559-49A7-4046-9425-50E25205E891} = {A3402532-58BD-4AB1-870F-CFD829CEAD18} {30B7883D-A8B5-47F2-B242-971D585483B8} = {59251F20-422C-41BC-9C0E-4517B5C2018D} {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258} = {59251F20-422C-41BC-9C0E-4517B5C2018D} - {59251F20-422C-41BC-9C0E-4517B5C2018D} = {A3402532-58BD-4AB1-870F-CFD829CEAD18} {4F5987F2-614A-42B6-A652-FE4C03330DE0} = {AA8FF9D5-BB95-481B-A56A-E8FAF9725F97} + {611CB559-49A7-4046-9425-50E25205E891} = {A3402532-58BD-4AB1-870F-CFD829CEAD18} + {59251F20-422C-41BC-9C0E-4517B5C2018D} = {A3402532-58BD-4AB1-870F-CFD829CEAD18} {AA8FF9D5-BB95-481B-A56A-E8FAF9725F97} = {A3402532-58BD-4AB1-870F-CFD829CEAD18} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {739AA767-154B-4C69-8C9B-C3D332833D92} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{5d8ae6d8-f7ec-43ac-ae7e-80b85a460258}*SharedItemsImports = 5 + ..\System.Private.CoreLib\src\System.Private.CoreLib.Shared.projitems*{772c93d4-fc45-46aa-b09f-26f01b672edc}*SharedItemsImports = 5 + ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{90044fd3-5c5c-4fb8-b7c7-f9def519ee7d}*SharedItemsImports = 5 + EndGlobalSection EndGlobal diff --git a/src/libraries/System.Runtime/System.Runtime.sln b/src/libraries/System.Runtime/System.Runtime.sln index 4af0484c2667c7..6192820072c52d 100644 --- a/src/libraries/System.Runtime/System.Runtime.sln +++ b/src/libraries/System.Runtime/System.Runtime.sln @@ -1,4 +1,8 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.13.35617.110 d17.13 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Private.CoreLib", "..\..\coreclr\System.Private.CoreLib\System.Private.CoreLib.csproj", "{71AB8240-F179-4B21-A8BE-8BE6CD774ED9}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StreamConformanceTests", "..\Common\tests\StreamConformanceTests\StreamConformanceTests.csproj", "{F86D6534-1A96-489E-A807-C14E616686D6}" @@ -241,55 +245,55 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Linker", "..\..\tools\ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{04D0E381-5B43-42C0-8E08-FADBFCECB353}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Buffers.Tests", "tests\System.Buffers.Tests", "{49849A80-4C86-4DBD-A138-B98A07BFA4F8}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Buffers.Tests", "System.Buffers.Tests", "{49849A80-4C86-4DBD-A138-B98A07BFA4F8}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Diagnostics.Debug.Tests", "tests\System.Diagnostics.Debug.Tests", "{FA882920-3BC3-4FB7-BA9A-263CE3E4F8D9}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Diagnostics.Debug.Tests", "System.Diagnostics.Debug.Tests", "{FA882920-3BC3-4FB7-BA9A-263CE3E4F8D9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Diagnostics.Tools.Tests", "tests\System.Diagnostics.Tools.Tests", "{F283372A-5CA9-40D8-BA0D-5C65060F7D7F}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Diagnostics.Tools.Tests", "System.Diagnostics.Tools.Tests", "{F283372A-5CA9-40D8-BA0D-5C65060F7D7F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Dynamic.Runtime.Tests", "tests\System.Dynamic.Runtime.Tests", "{329E1643-B54D-4A88-9E96-716709AB931B}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Dynamic.Runtime.Tests", "System.Dynamic.Runtime.Tests", "{329E1643-B54D-4A88-9E96-716709AB931B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Calendars.Tests", "tests\System.Globalization.Calendars.Tests", "{7750E8BA-A054-4176-971B-FA3B4A9ECF23}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Calendars.Tests", "System.Globalization.Calendars.Tests", "{7750E8BA-A054-4176-971B-FA3B4A9ECF23}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Extensions.Tests", "tests\System.Globalization.Extensions.Tests", "{A1C3A699-4772-45AC-BED4-F0D6E8282EDB}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Extensions.Tests", "System.Globalization.Extensions.Tests", "{A1C3A699-4772-45AC-BED4-F0D6E8282EDB}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Tests", "tests\System.Globalization.Tests", "{FC0E8825-6D78-47C9-9758-59D61AD38895}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Tests", "System.Globalization.Tests", "{FC0E8825-6D78-47C9-9758-59D61AD38895}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.FileSystem.Primitives.Tests", "tests\System.IO.FileSystem.Primitives.Tests", "{1131BBB2-AEBC-4020-9643-59C8EA73E848}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.FileSystem.Primitives.Tests", "System.IO.FileSystem.Primitives.Tests", "{1131BBB2-AEBC-4020-9643-59C8EA73E848}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.FileSystem.Tests", "tests\System.IO.FileSystem.Tests", "{5B928A02-3C49-4E29-8C05-E9AEF0E4F39A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.FileSystem.Tests", "System.IO.FileSystem.Tests", "{5B928A02-3C49-4E29-8C05-E9AEF0E4F39A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.Tests", "tests\System.IO.Tests", "{B5010729-BAD4-418F-B801-CEECF4890CB2}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.Tests", "System.IO.Tests", "{B5010729-BAD4-418F-B801-CEECF4890CB2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.UnmanagedMemoryStream.Tests", "tests\System.IO.UnmanagedMemoryStream.Tests", "{159EA645-58B0-447C-90BC-FF6AC3BBEEF1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.UnmanagedMemoryStream.Tests", "System.IO.UnmanagedMemoryStream.Tests", "{159EA645-58B0-447C-90BC-FF6AC3BBEEF1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Reflection.Tests", "tests\System.Reflection.Tests", "{6FC63FB9-025D-4821-A346-CF3B34788331}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Reflection.Tests", "System.Reflection.Tests", "{6FC63FB9-025D-4821-A346-CF3B34788331}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Resources.Reader.Tests", "tests\System.Resources.Reader.Tests", "{C5CD099F-649E-4464-BBD9-1F0A9FE7C311}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Resources.Reader.Tests", "System.Resources.Reader.Tests", "{C5CD099F-649E-4464-BBD9-1F0A9FE7C311}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Resources.ResourceManager.Tests", "tests\System.Resources.ResourceManager.Tests", "{685D170C-E2BF-413A-A506-B09AF1E71DC1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Resources.ResourceManager.Tests", "System.Resources.ResourceManager.Tests", "{685D170C-E2BF-413A-A506-B09AF1E71DC1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.CompilerServices.Unsafe.Tests", "tests\System.Runtime.CompilerServices.Unsafe.Tests", "{EC6D590E-2278-4E86-B1B0-E6900D0F31BD}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.CompilerServices.Unsafe.Tests", "System.Runtime.CompilerServices.Unsafe.Tests", "{EC6D590E-2278-4E86-B1B0-E6900D0F31BD}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Extensions.Tests", "tests\System.Runtime.Extensions.Tests", "{2655BE48-E889-4354-9499-4CCC6DA9F378}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Extensions.Tests", "System.Runtime.Extensions.Tests", "{2655BE48-E889-4354-9499-4CCC6DA9F378}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Handles.Tests", "tests\System.Runtime.Handles.Tests", "{174A9FAB-F46D-49A9-AC69-0FF55ACDE4F7}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Handles.Tests", "System.Runtime.Handles.Tests", "{174A9FAB-F46D-49A9-AC69-0FF55ACDE4F7}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.InteropServices.RuntimeInformation.Tests", "tests\System.Runtime.InteropServices.RuntimeInformation.Tests", "{CE6BCA93-D862-4435-8FEB-07A98DD43655}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.InteropServices.RuntimeInformation.Tests", "System.Runtime.InteropServices.RuntimeInformation.Tests", "{CE6BCA93-D862-4435-8FEB-07A98DD43655}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Tests", "tests\System.Runtime.Tests", "{71C519F0-621A-413B-B262-A5106C2CCA64}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Tests", "System.Runtime.Tests", "{71C519F0-621A-413B-B262-A5106C2CCA64}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Security.SecureString.Tests", "tests\System.Security.SecureString.Tests", "{FC75126D-0CBD-4927-A91D-BAF04DF8EC13}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Security.SecureString.Tests", "System.Security.SecureString.Tests", "{FC75126D-0CBD-4927-A91D-BAF04DF8EC13}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Text.Encoding.Tests", "tests\System.Text.Encoding.Tests", "{32160B7C-7125-48FD-8ECE-9E542D321FB1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Text.Encoding.Tests", "System.Text.Encoding.Tests", "{32160B7C-7125-48FD-8ECE-9E542D321FB1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Tasks.Extensions.Tests", "tests\System.Threading.Tasks.Extensions.Tests", "{69F454E3-4E56-42BD-957A-E20E15CBB1A8}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Tasks.Extensions.Tests", "System.Threading.Tasks.Extensions.Tests", "{69F454E3-4E56-42BD-957A-E20E15CBB1A8}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Tasks.Tests", "tests\System.Threading.Tasks.Tests", "{6DE592D4-860B-4C5E-86A4-741BFAD8CEF3}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Tasks.Tests", "System.Threading.Tasks.Tests", "{6DE592D4-860B-4C5E-86A4-741BFAD8CEF3}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Timer.Tests", "tests\System.Threading.Timer.Tests", "{ADE0FF1A-EF61-4D71-9E61-DC5656DC7943}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Timer.Tests", "System.Threading.Timer.Tests", "{ADE0FF1A-EF61-4D71-9E61-DC5656DC7943}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.ValueTuple.Tests", "tests\System.ValueTuple.Tests", "{377FD142-D005-4CC6-9CE4-66AE72E9DF84}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.ValueTuple.Tests", "System.ValueTuple.Tests", "{377FD142-D005-4CC6-9CE4-66AE72E9DF84}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{FD72C125-C10D-457B-8AFC-6B4E5237AF6A}" EndProject @@ -297,16 +301,21 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{F65030D7-DDB EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{13818769-DC01-4715-9590-E000D03E42A9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "tools\gen", "{28FBA7EA-0592-4446-82F2-2E9819684236}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{28FBA7EA-0592-4446-82F2-2E9819684236}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "tools\src", "{866503B5-5CD2-438C-A125-B947A2F38D34}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{866503B5-5CD2-438C-A125-B947A2F38D34}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "tools\ref", "{978D3888-2C89-41B7-BC09-33A4E49A6A00}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{978D3888-2C89-41B7-BC09-33A4E49A6A00}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{67DCB1C2-0B95-40B6-ACE8-9812BF57EB19}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Checked|Any CPU = Checked|Any CPU + Checked|arm = Checked|arm + Checked|arm64 = Checked|arm64 + Checked|x64 = Checked|x64 + Checked|x86 = Checked|x86 Debug|Any CPU = Debug|Any CPU Debug|arm = Debug|arm Debug|arm64 = Debug|arm64 @@ -317,13 +326,18 @@ Global Release|arm64 = Release|arm64 Release|x64 = Release|x64 Release|x86 = Release|x86 - Checked|Any CPU = Checked|Any CPU - Checked|arm = Checked|arm - Checked|arm64 = Checked|arm64 - Checked|x64 = Checked|x64 - Checked|x86 = Checked|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|Any CPU.ActiveCfg = Checked|x64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|Any CPU.Build.0 = Checked|x64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm.ActiveCfg = Checked|arm + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm.Build.0 = Checked|arm + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm64.ActiveCfg = Checked|arm64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm64.Build.0 = Checked|arm64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x64.ActiveCfg = Checked|x64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x64.Build.0 = Checked|x64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x86.ActiveCfg = Checked|x86 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x86.Build.0 = Checked|x86 {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Debug|Any CPU.ActiveCfg = Debug|x64 {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Debug|Any CPU.Build.0 = Debug|x64 {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Debug|arm.ActiveCfg = Debug|arm @@ -344,16 +358,11 @@ Global {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Release|x64.Build.0 = Release|x64 {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Release|x86.ActiveCfg = Release|x86 {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Release|x86.Build.0 = Release|x86 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|Any CPU.ActiveCfg = Checked|x64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|Any CPU.Build.0 = Checked|x64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm.ActiveCfg = Checked|arm - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm.Build.0 = Checked|arm - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm64.ActiveCfg = Checked|arm64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm64.Build.0 = Checked|arm64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x64.ActiveCfg = Checked|x64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x64.Build.0 = Checked|x64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x86.ActiveCfg = Checked|x86 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x86.Build.0 = Checked|x86 + {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|arm.ActiveCfg = Debug|Any CPU + {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|x64.ActiveCfg = Debug|Any CPU + {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|x86.ActiveCfg = Debug|Any CPU {F86D6534-1A96-489E-A807-C14E616686D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F86D6534-1A96-489E-A807-C14E616686D6}.Debug|Any CPU.Build.0 = Debug|Any CPU {F86D6534-1A96-489E-A807-C14E616686D6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -370,11 +379,11 @@ Global {F86D6534-1A96-489E-A807-C14E616686D6}.Release|x64.Build.0 = Release|Any CPU {F86D6534-1A96-489E-A807-C14E616686D6}.Release|x86.ActiveCfg = Release|Any CPU {F86D6534-1A96-489E-A807-C14E616686D6}.Release|x86.Build.0 = Release|Any CPU - {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|arm.ActiveCfg = Debug|Any CPU - {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|x64.ActiveCfg = Debug|Any CPU - {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|x86.ActiveCfg = Debug|Any CPU + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|arm.ActiveCfg = Debug|Any CPU + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|arm64.ActiveCfg = Debug|Any CPU + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|x64.ActiveCfg = Debug|Any CPU + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|x86.ActiveCfg = Debug|Any CPU {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Debug|Any CPU.Build.0 = Debug|Any CPU {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -391,11 +400,11 @@ Global {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Release|x64.Build.0 = Release|Any CPU {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Release|x86.ActiveCfg = Release|Any CPU {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Release|x86.Build.0 = Release|Any CPU - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|arm.ActiveCfg = Debug|Any CPU - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|arm64.ActiveCfg = Debug|Any CPU - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|x64.ActiveCfg = Debug|Any CPU - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|x86.ActiveCfg = Debug|Any CPU + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|arm.ActiveCfg = Debug|Any CPU + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|x64.ActiveCfg = Debug|Any CPU + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|x86.ActiveCfg = Debug|Any CPU {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Debug|Any CPU.Build.0 = Debug|Any CPU {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -412,11 +421,11 @@ Global {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Release|x64.Build.0 = Release|Any CPU {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Release|x86.ActiveCfg = Release|Any CPU {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Release|x86.Build.0 = Release|Any CPU - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|arm.ActiveCfg = Debug|Any CPU - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|x64.ActiveCfg = Debug|Any CPU - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|x86.ActiveCfg = Debug|Any CPU + {FB17AC52-1633-4845-932B-9218DF895957}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {FB17AC52-1633-4845-932B-9218DF895957}.Checked|arm.ActiveCfg = Debug|Any CPU + {FB17AC52-1633-4845-932B-9218DF895957}.Checked|arm64.ActiveCfg = Debug|Any CPU + {FB17AC52-1633-4845-932B-9218DF895957}.Checked|x64.ActiveCfg = Debug|Any CPU + {FB17AC52-1633-4845-932B-9218DF895957}.Checked|x86.ActiveCfg = Debug|Any CPU {FB17AC52-1633-4845-932B-9218DF895957}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB17AC52-1633-4845-932B-9218DF895957}.Debug|Any CPU.Build.0 = Debug|Any CPU {FB17AC52-1633-4845-932B-9218DF895957}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -433,11 +442,11 @@ Global {FB17AC52-1633-4845-932B-9218DF895957}.Release|x64.Build.0 = Release|Any CPU {FB17AC52-1633-4845-932B-9218DF895957}.Release|x86.ActiveCfg = Release|Any CPU {FB17AC52-1633-4845-932B-9218DF895957}.Release|x86.Build.0 = Release|Any CPU - {FB17AC52-1633-4845-932B-9218DF895957}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {FB17AC52-1633-4845-932B-9218DF895957}.Checked|arm.ActiveCfg = Debug|Any CPU - {FB17AC52-1633-4845-932B-9218DF895957}.Checked|arm64.ActiveCfg = Debug|Any CPU - {FB17AC52-1633-4845-932B-9218DF895957}.Checked|x64.ActiveCfg = Debug|Any CPU - {FB17AC52-1633-4845-932B-9218DF895957}.Checked|x86.ActiveCfg = Debug|Any CPU + {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|arm.ActiveCfg = Debug|Any CPU + {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|arm64.ActiveCfg = Debug|Any CPU + {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|x64.ActiveCfg = Debug|Any CPU + {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|x86.ActiveCfg = Debug|Any CPU {21791340-49C4-4C07-97FD-CAA1B72D3256}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {21791340-49C4-4C07-97FD-CAA1B72D3256}.Debug|Any CPU.Build.0 = Debug|Any CPU {21791340-49C4-4C07-97FD-CAA1B72D3256}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -454,11 +463,11 @@ Global {21791340-49C4-4C07-97FD-CAA1B72D3256}.Release|x64.Build.0 = Release|Any CPU {21791340-49C4-4C07-97FD-CAA1B72D3256}.Release|x86.ActiveCfg = Release|Any CPU {21791340-49C4-4C07-97FD-CAA1B72D3256}.Release|x86.Build.0 = Release|Any CPU - {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|arm.ActiveCfg = Debug|Any CPU - {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|arm64.ActiveCfg = Debug|Any CPU - {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|x64.ActiveCfg = Debug|Any CPU - {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|x86.ActiveCfg = Debug|Any CPU + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|arm.ActiveCfg = Debug|Any CPU + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|x64.ActiveCfg = Debug|Any CPU + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|x86.ActiveCfg = Debug|Any CPU {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Debug|Any CPU.Build.0 = Debug|Any CPU {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -475,11 +484,11 @@ Global {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Release|x64.Build.0 = Release|Any CPU {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Release|x86.ActiveCfg = Release|Any CPU {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Release|x86.Build.0 = Release|Any CPU - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|arm.ActiveCfg = Debug|Any CPU - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|x64.ActiveCfg = Debug|Any CPU - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|x86.ActiveCfg = Debug|Any CPU + {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|arm.ActiveCfg = Debug|Any CPU + {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|arm64.ActiveCfg = Debug|Any CPU + {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|x64.ActiveCfg = Debug|Any CPU + {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|x86.ActiveCfg = Debug|Any CPU {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Debug|Any CPU.Build.0 = Debug|Any CPU {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -496,11 +505,11 @@ Global {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Release|x64.Build.0 = Release|Any CPU {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Release|x86.ActiveCfg = Release|Any CPU {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Release|x86.Build.0 = Release|Any CPU - {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|arm.ActiveCfg = Debug|Any CPU - {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|arm64.ActiveCfg = Debug|Any CPU - {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|x64.ActiveCfg = Debug|Any CPU - {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|x86.ActiveCfg = Debug|Any CPU + {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|arm.ActiveCfg = Debug|Any CPU + {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|arm64.ActiveCfg = Debug|Any CPU + {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|x64.ActiveCfg = Debug|Any CPU + {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|x86.ActiveCfg = Debug|Any CPU {86CF47B3-D607-4F59-896F-982FEA116086}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86CF47B3-D607-4F59-896F-982FEA116086}.Debug|Any CPU.Build.0 = Debug|Any CPU {86CF47B3-D607-4F59-896F-982FEA116086}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -517,11 +526,11 @@ Global {86CF47B3-D607-4F59-896F-982FEA116086}.Release|x64.Build.0 = Release|Any CPU {86CF47B3-D607-4F59-896F-982FEA116086}.Release|x86.ActiveCfg = Release|Any CPU {86CF47B3-D607-4F59-896F-982FEA116086}.Release|x86.Build.0 = Release|Any CPU - {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|arm.ActiveCfg = Debug|Any CPU - {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|arm64.ActiveCfg = Debug|Any CPU - {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|x64.ActiveCfg = Debug|Any CPU - {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|x86.ActiveCfg = Debug|Any CPU + {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|arm.ActiveCfg = Debug|Any CPU + {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|arm64.ActiveCfg = Debug|Any CPU + {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|x64.ActiveCfg = Debug|Any CPU + {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|x86.ActiveCfg = Debug|Any CPU {484B12B8-F027-4960-BAA9-14D646C80A28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {484B12B8-F027-4960-BAA9-14D646C80A28}.Debug|Any CPU.Build.0 = Debug|Any CPU {484B12B8-F027-4960-BAA9-14D646C80A28}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -538,11 +547,11 @@ Global {484B12B8-F027-4960-BAA9-14D646C80A28}.Release|x64.Build.0 = Release|Any CPU {484B12B8-F027-4960-BAA9-14D646C80A28}.Release|x86.ActiveCfg = Release|Any CPU {484B12B8-F027-4960-BAA9-14D646C80A28}.Release|x86.Build.0 = Release|Any CPU - {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|arm.ActiveCfg = Debug|Any CPU - {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|arm64.ActiveCfg = Debug|Any CPU - {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|x64.ActiveCfg = Debug|Any CPU - {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|x86.ActiveCfg = Debug|Any CPU + {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|arm.ActiveCfg = Debug|Any CPU + {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|arm64.ActiveCfg = Debug|Any CPU + {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|x64.ActiveCfg = Debug|Any CPU + {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|x86.ActiveCfg = Debug|Any CPU {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Debug|Any CPU.Build.0 = Debug|Any CPU {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -559,11 +568,11 @@ Global {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Release|x64.Build.0 = Release|Any CPU {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Release|x86.ActiveCfg = Release|Any CPU {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Release|x86.Build.0 = Release|Any CPU - {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|arm.ActiveCfg = Debug|Any CPU - {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|arm64.ActiveCfg = Debug|Any CPU - {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|x64.ActiveCfg = Debug|Any CPU - {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|x86.ActiveCfg = Debug|Any CPU + {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|arm.ActiveCfg = Debug|Any CPU + {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|x64.ActiveCfg = Debug|Any CPU + {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|x86.ActiveCfg = Debug|Any CPU {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Debug|Any CPU.Build.0 = Debug|Any CPU {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -580,11 +589,11 @@ Global {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Release|x64.Build.0 = Release|Any CPU {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Release|x86.ActiveCfg = Release|Any CPU {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Release|x86.Build.0 = Release|Any CPU - {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|arm.ActiveCfg = Debug|Any CPU - {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|x64.ActiveCfg = Debug|Any CPU - {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|x86.ActiveCfg = Debug|Any CPU + {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|arm.ActiveCfg = Debug|Any CPU + {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|x64.ActiveCfg = Debug|Any CPU + {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|x86.ActiveCfg = Debug|Any CPU {B876CC90-CB87-4B1B-B6F5-247990192578}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B876CC90-CB87-4B1B-B6F5-247990192578}.Debug|Any CPU.Build.0 = Debug|Any CPU {B876CC90-CB87-4B1B-B6F5-247990192578}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -601,11 +610,11 @@ Global {B876CC90-CB87-4B1B-B6F5-247990192578}.Release|x64.Build.0 = Release|Any CPU {B876CC90-CB87-4B1B-B6F5-247990192578}.Release|x86.ActiveCfg = Release|Any CPU {B876CC90-CB87-4B1B-B6F5-247990192578}.Release|x86.Build.0 = Release|Any CPU - {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|arm.ActiveCfg = Debug|Any CPU - {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|x64.ActiveCfg = Debug|Any CPU - {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|x86.ActiveCfg = Debug|Any CPU + {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|arm.ActiveCfg = Debug|Any CPU + {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|arm64.ActiveCfg = Debug|Any CPU + {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|x64.ActiveCfg = Debug|Any CPU + {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|x86.ActiveCfg = Debug|Any CPU {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Debug|Any CPU.Build.0 = Debug|Any CPU {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -622,11 +631,11 @@ Global {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Release|x64.Build.0 = Release|Any CPU {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Release|x86.ActiveCfg = Release|Any CPU {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Release|x86.Build.0 = Release|Any CPU - {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|arm.ActiveCfg = Debug|Any CPU - {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|arm64.ActiveCfg = Debug|Any CPU - {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|x64.ActiveCfg = Debug|Any CPU - {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|x86.ActiveCfg = Debug|Any CPU + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|arm.ActiveCfg = Debug|Any CPU + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|x64.ActiveCfg = Debug|Any CPU + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|x86.ActiveCfg = Debug|Any CPU {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Debug|Any CPU.Build.0 = Debug|Any CPU {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -643,11 +652,11 @@ Global {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Release|x64.Build.0 = Release|Any CPU {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Release|x86.ActiveCfg = Release|Any CPU {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Release|x86.Build.0 = Release|Any CPU - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|arm.ActiveCfg = Debug|Any CPU - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|x64.ActiveCfg = Debug|Any CPU - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|x86.ActiveCfg = Debug|Any CPU + {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|arm.ActiveCfg = Debug|Any CPU + {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|x64.ActiveCfg = Debug|Any CPU + {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|x86.ActiveCfg = Debug|Any CPU {53EFB849-6776-4316-B631-5B5F0D9624E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {53EFB849-6776-4316-B631-5B5F0D9624E6}.Debug|Any CPU.Build.0 = Debug|Any CPU {53EFB849-6776-4316-B631-5B5F0D9624E6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -664,11 +673,11 @@ Global {53EFB849-6776-4316-B631-5B5F0D9624E6}.Release|x64.Build.0 = Release|Any CPU {53EFB849-6776-4316-B631-5B5F0D9624E6}.Release|x86.ActiveCfg = Release|Any CPU {53EFB849-6776-4316-B631-5B5F0D9624E6}.Release|x86.Build.0 = Release|Any CPU - {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|arm.ActiveCfg = Debug|Any CPU - {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|x64.ActiveCfg = Debug|Any CPU - {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|x86.ActiveCfg = Debug|Any CPU + {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|arm.ActiveCfg = Debug|Any CPU + {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|arm64.ActiveCfg = Debug|Any CPU + {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|x64.ActiveCfg = Debug|Any CPU + {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|x86.ActiveCfg = Debug|Any CPU {019A13D1-3493-4024-8223-FCB6763F80B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {019A13D1-3493-4024-8223-FCB6763F80B4}.Debug|Any CPU.Build.0 = Debug|Any CPU {019A13D1-3493-4024-8223-FCB6763F80B4}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -685,11 +694,11 @@ Global {019A13D1-3493-4024-8223-FCB6763F80B4}.Release|x64.Build.0 = Release|Any CPU {019A13D1-3493-4024-8223-FCB6763F80B4}.Release|x86.ActiveCfg = Release|Any CPU {019A13D1-3493-4024-8223-FCB6763F80B4}.Release|x86.Build.0 = Release|Any CPU - {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|arm.ActiveCfg = Debug|Any CPU - {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|arm64.ActiveCfg = Debug|Any CPU - {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|x64.ActiveCfg = Debug|Any CPU - {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|x86.ActiveCfg = Debug|Any CPU + {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|arm.ActiveCfg = Debug|Any CPU + {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|x64.ActiveCfg = Debug|Any CPU + {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|x86.ActiveCfg = Debug|Any CPU {9ECF9E5C-860F-49C3-95D0-501147F19548}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9ECF9E5C-860F-49C3-95D0-501147F19548}.Debug|Any CPU.Build.0 = Debug|Any CPU {9ECF9E5C-860F-49C3-95D0-501147F19548}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -706,11 +715,11 @@ Global {9ECF9E5C-860F-49C3-95D0-501147F19548}.Release|x64.Build.0 = Release|Any CPU {9ECF9E5C-860F-49C3-95D0-501147F19548}.Release|x86.ActiveCfg = Release|Any CPU {9ECF9E5C-860F-49C3-95D0-501147F19548}.Release|x86.Build.0 = Release|Any CPU - {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|arm.ActiveCfg = Debug|Any CPU - {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|x64.ActiveCfg = Debug|Any CPU - {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|x86.ActiveCfg = Debug|Any CPU + {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|arm.ActiveCfg = Debug|Any CPU + {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|arm64.ActiveCfg = Debug|Any CPU + {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|x64.ActiveCfg = Debug|Any CPU + {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|x86.ActiveCfg = Debug|Any CPU {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Debug|Any CPU.Build.0 = Debug|Any CPU {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -727,11 +736,11 @@ Global {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Release|x64.Build.0 = Release|Any CPU {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Release|x86.ActiveCfg = Release|Any CPU {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Release|x86.Build.0 = Release|Any CPU - {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|arm.ActiveCfg = Debug|Any CPU - {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|arm64.ActiveCfg = Debug|Any CPU - {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|x64.ActiveCfg = Debug|Any CPU - {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|x86.ActiveCfg = Debug|Any CPU + {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|arm.ActiveCfg = Debug|Any CPU + {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|x64.ActiveCfg = Debug|Any CPU + {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|x86.ActiveCfg = Debug|Any CPU {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Debug|Any CPU.Build.0 = Debug|Any CPU {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -748,11 +757,11 @@ Global {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Release|x64.Build.0 = Release|Any CPU {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Release|x86.ActiveCfg = Release|Any CPU {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Release|x86.Build.0 = Release|Any CPU - {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|arm.ActiveCfg = Debug|Any CPU - {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|x64.ActiveCfg = Debug|Any CPU - {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|x86.ActiveCfg = Debug|Any CPU + {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|arm.ActiveCfg = Debug|Any CPU + {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|arm64.ActiveCfg = Debug|Any CPU + {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|x64.ActiveCfg = Debug|Any CPU + {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|x86.ActiveCfg = Debug|Any CPU {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Debug|Any CPU.Build.0 = Debug|Any CPU {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -769,11 +778,11 @@ Global {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Release|x64.Build.0 = Release|Any CPU {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Release|x86.ActiveCfg = Release|Any CPU {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Release|x86.Build.0 = Release|Any CPU - {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|arm.ActiveCfg = Debug|Any CPU - {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|arm64.ActiveCfg = Debug|Any CPU - {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|x64.ActiveCfg = Debug|Any CPU - {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|x86.ActiveCfg = Debug|Any CPU + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|arm.ActiveCfg = Debug|Any CPU + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|x64.ActiveCfg = Debug|Any CPU + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|x86.ActiveCfg = Debug|Any CPU {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Debug|Any CPU.Build.0 = Debug|Any CPU {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -790,11 +799,11 @@ Global {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Release|x64.Build.0 = Release|Any CPU {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Release|x86.ActiveCfg = Release|Any CPU {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Release|x86.Build.0 = Release|Any CPU - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|arm.ActiveCfg = Debug|Any CPU - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|x64.ActiveCfg = Debug|Any CPU - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|x86.ActiveCfg = Debug|Any CPU + {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|arm.ActiveCfg = Debug|Any CPU + {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|x64.ActiveCfg = Debug|Any CPU + {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|x86.ActiveCfg = Debug|Any CPU {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Debug|Any CPU.Build.0 = Debug|Any CPU {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -811,11 +820,11 @@ Global {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Release|x64.Build.0 = Release|Any CPU {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Release|x86.ActiveCfg = Release|Any CPU {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Release|x86.Build.0 = Release|Any CPU - {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|arm.ActiveCfg = Debug|Any CPU - {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|x64.ActiveCfg = Debug|Any CPU - {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|x86.ActiveCfg = Debug|Any CPU + {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|arm.ActiveCfg = Debug|Any CPU + {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|x64.ActiveCfg = Debug|Any CPU + {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|x86.ActiveCfg = Debug|Any CPU {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Debug|Any CPU.Build.0 = Debug|Any CPU {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -832,11 +841,11 @@ Global {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Release|x64.Build.0 = Release|Any CPU {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Release|x86.ActiveCfg = Release|Any CPU {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Release|x86.Build.0 = Release|Any CPU - {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|arm.ActiveCfg = Debug|Any CPU - {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|x64.ActiveCfg = Debug|Any CPU - {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|x86.ActiveCfg = Debug|Any CPU + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|arm.ActiveCfg = Debug|Any CPU + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|arm64.ActiveCfg = Debug|Any CPU + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|x64.ActiveCfg = Debug|Any CPU + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|x86.ActiveCfg = Debug|Any CPU {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Debug|Any CPU.Build.0 = Debug|Any CPU {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -853,11 +862,11 @@ Global {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Release|x64.Build.0 = Release|Any CPU {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Release|x86.ActiveCfg = Release|Any CPU {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Release|x86.Build.0 = Release|Any CPU - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|arm.ActiveCfg = Debug|Any CPU - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|arm64.ActiveCfg = Debug|Any CPU - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|x64.ActiveCfg = Debug|Any CPU - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|x86.ActiveCfg = Debug|Any CPU + {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|arm.ActiveCfg = Debug|Any CPU + {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|arm64.ActiveCfg = Debug|Any CPU + {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|x64.ActiveCfg = Debug|Any CPU + {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|x86.ActiveCfg = Debug|Any CPU {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Debug|Any CPU.Build.0 = Debug|Any CPU {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -874,11 +883,11 @@ Global {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Release|x64.Build.0 = Release|Any CPU {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Release|x86.ActiveCfg = Release|Any CPU {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Release|x86.Build.0 = Release|Any CPU - {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|arm.ActiveCfg = Debug|Any CPU - {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|arm64.ActiveCfg = Debug|Any CPU - {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|x64.ActiveCfg = Debug|Any CPU - {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|x86.ActiveCfg = Debug|Any CPU + {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|arm.ActiveCfg = Debug|Any CPU + {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|x64.ActiveCfg = Debug|Any CPU + {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|x86.ActiveCfg = Debug|Any CPU {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Debug|Any CPU.Build.0 = Debug|Any CPU {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -895,11 +904,11 @@ Global {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Release|x64.Build.0 = Release|Any CPU {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Release|x86.ActiveCfg = Release|Any CPU {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Release|x86.Build.0 = Release|Any CPU - {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|arm.ActiveCfg = Debug|Any CPU - {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|x64.ActiveCfg = Debug|Any CPU - {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|x86.ActiveCfg = Debug|Any CPU + {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|arm.ActiveCfg = Debug|Any CPU + {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|x64.ActiveCfg = Debug|Any CPU + {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|x86.ActiveCfg = Debug|Any CPU {F977B04F-675C-4B78-8FCE-19D70504166D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F977B04F-675C-4B78-8FCE-19D70504166D}.Debug|Any CPU.Build.0 = Debug|Any CPU {F977B04F-675C-4B78-8FCE-19D70504166D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -916,11 +925,11 @@ Global {F977B04F-675C-4B78-8FCE-19D70504166D}.Release|x64.Build.0 = Release|Any CPU {F977B04F-675C-4B78-8FCE-19D70504166D}.Release|x86.ActiveCfg = Release|Any CPU {F977B04F-675C-4B78-8FCE-19D70504166D}.Release|x86.Build.0 = Release|Any CPU - {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|arm.ActiveCfg = Debug|Any CPU - {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|x64.ActiveCfg = Debug|Any CPU - {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|x86.ActiveCfg = Debug|Any CPU + {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|arm.ActiveCfg = Debug|Any CPU + {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|arm64.ActiveCfg = Debug|Any CPU + {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|x64.ActiveCfg = Debug|Any CPU + {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|x86.ActiveCfg = Debug|Any CPU {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Debug|Any CPU.Build.0 = Debug|Any CPU {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -937,11 +946,11 @@ Global {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Release|x64.Build.0 = Release|Any CPU {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Release|x86.ActiveCfg = Release|Any CPU {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Release|x86.Build.0 = Release|Any CPU - {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|arm.ActiveCfg = Debug|Any CPU - {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|arm64.ActiveCfg = Debug|Any CPU - {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|x64.ActiveCfg = Debug|Any CPU - {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|x86.ActiveCfg = Debug|Any CPU + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|arm.ActiveCfg = Debug|Any CPU + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|x64.ActiveCfg = Debug|Any CPU + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|x86.ActiveCfg = Debug|Any CPU {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Debug|Any CPU.Build.0 = Debug|Any CPU {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -958,11 +967,11 @@ Global {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Release|x64.Build.0 = Release|Any CPU {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Release|x86.ActiveCfg = Release|Any CPU {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Release|x86.Build.0 = Release|Any CPU - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|arm.ActiveCfg = Debug|Any CPU - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|x64.ActiveCfg = Debug|Any CPU - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|x86.ActiveCfg = Debug|Any CPU + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|arm.ActiveCfg = Debug|Any CPU + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|x64.ActiveCfg = Debug|Any CPU + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|x86.ActiveCfg = Debug|Any CPU {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Debug|Any CPU.Build.0 = Debug|Any CPU {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -979,11 +988,11 @@ Global {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Release|x64.Build.0 = Release|Any CPU {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Release|x86.ActiveCfg = Release|Any CPU {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Release|x86.Build.0 = Release|Any CPU - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|arm.ActiveCfg = Debug|Any CPU - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|x64.ActiveCfg = Debug|Any CPU - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|x86.ActiveCfg = Debug|Any CPU + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|arm.ActiveCfg = Debug|Any CPU + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|x64.ActiveCfg = Debug|Any CPU + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|x86.ActiveCfg = Debug|Any CPU {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Debug|Any CPU.Build.0 = Debug|Any CPU {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1000,11 +1009,11 @@ Global {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Release|x64.Build.0 = Release|Any CPU {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Release|x86.ActiveCfg = Release|Any CPU {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Release|x86.Build.0 = Release|Any CPU - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|arm.ActiveCfg = Debug|Any CPU - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|x64.ActiveCfg = Debug|Any CPU - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|x86.ActiveCfg = Debug|Any CPU + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|arm.ActiveCfg = Debug|Any CPU + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|x64.ActiveCfg = Debug|Any CPU + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|x86.ActiveCfg = Debug|Any CPU {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Debug|Any CPU.Build.0 = Debug|Any CPU {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1021,11 +1030,11 @@ Global {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Release|x64.Build.0 = Release|Any CPU {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Release|x86.ActiveCfg = Release|Any CPU {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Release|x86.Build.0 = Release|Any CPU - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|arm.ActiveCfg = Debug|Any CPU - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|x64.ActiveCfg = Debug|Any CPU - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|x86.ActiveCfg = Debug|Any CPU + {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|arm.ActiveCfg = Debug|Any CPU + {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|x64.ActiveCfg = Debug|Any CPU + {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|x86.ActiveCfg = Debug|Any CPU {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Debug|Any CPU.Build.0 = Debug|Any CPU {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1042,11 +1051,11 @@ Global {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Release|x64.Build.0 = Release|Any CPU {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Release|x86.ActiveCfg = Release|Any CPU {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Release|x86.Build.0 = Release|Any CPU - {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|arm.ActiveCfg = Debug|Any CPU - {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|x64.ActiveCfg = Debug|Any CPU - {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|x86.ActiveCfg = Debug|Any CPU + {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|arm.ActiveCfg = Debug|Any CPU + {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|x64.ActiveCfg = Debug|Any CPU + {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|x86.ActiveCfg = Debug|Any CPU {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Debug|Any CPU.Build.0 = Debug|Any CPU {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1063,11 +1072,11 @@ Global {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Release|x64.Build.0 = Release|Any CPU {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Release|x86.ActiveCfg = Release|Any CPU {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Release|x86.Build.0 = Release|Any CPU - {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|arm.ActiveCfg = Debug|Any CPU - {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|x64.ActiveCfg = Debug|Any CPU - {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|x86.ActiveCfg = Debug|Any CPU + {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|arm.ActiveCfg = Debug|Any CPU + {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|arm64.ActiveCfg = Debug|Any CPU + {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|x64.ActiveCfg = Debug|Any CPU + {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|x86.ActiveCfg = Debug|Any CPU {23D41678-453F-4F2A-85F1-167E63DA6D67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23D41678-453F-4F2A-85F1-167E63DA6D67}.Debug|Any CPU.Build.0 = Debug|Any CPU {23D41678-453F-4F2A-85F1-167E63DA6D67}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1084,11 +1093,11 @@ Global {23D41678-453F-4F2A-85F1-167E63DA6D67}.Release|x64.Build.0 = Release|Any CPU {23D41678-453F-4F2A-85F1-167E63DA6D67}.Release|x86.ActiveCfg = Release|Any CPU {23D41678-453F-4F2A-85F1-167E63DA6D67}.Release|x86.Build.0 = Release|Any CPU - {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|arm.ActiveCfg = Debug|Any CPU - {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|arm64.ActiveCfg = Debug|Any CPU - {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|x64.ActiveCfg = Debug|Any CPU - {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|x86.ActiveCfg = Debug|Any CPU + {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|arm.ActiveCfg = Debug|Any CPU + {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|arm64.ActiveCfg = Debug|Any CPU + {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|x64.ActiveCfg = Debug|Any CPU + {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|x86.ActiveCfg = Debug|Any CPU {6790611D-ACE0-47C6-83E0-E404364B5210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6790611D-ACE0-47C6-83E0-E404364B5210}.Debug|Any CPU.Build.0 = Debug|Any CPU {6790611D-ACE0-47C6-83E0-E404364B5210}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1105,11 +1114,11 @@ Global {6790611D-ACE0-47C6-83E0-E404364B5210}.Release|x64.Build.0 = Release|Any CPU {6790611D-ACE0-47C6-83E0-E404364B5210}.Release|x86.ActiveCfg = Release|Any CPU {6790611D-ACE0-47C6-83E0-E404364B5210}.Release|x86.Build.0 = Release|Any CPU - {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|arm.ActiveCfg = Debug|Any CPU - {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|arm64.ActiveCfg = Debug|Any CPU - {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|x64.ActiveCfg = Debug|Any CPU - {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|x86.ActiveCfg = Debug|Any CPU + {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|arm.ActiveCfg = Debug|Any CPU + {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|arm64.ActiveCfg = Debug|Any CPU + {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|x64.ActiveCfg = Debug|Any CPU + {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|x86.ActiveCfg = Debug|Any CPU {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Debug|Any CPU.Build.0 = Debug|Any CPU {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1126,11 +1135,11 @@ Global {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Release|x64.Build.0 = Release|Any CPU {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Release|x86.ActiveCfg = Release|Any CPU {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Release|x86.Build.0 = Release|Any CPU - {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|arm.ActiveCfg = Debug|Any CPU - {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|arm64.ActiveCfg = Debug|Any CPU - {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|x64.ActiveCfg = Debug|Any CPU - {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|x86.ActiveCfg = Debug|Any CPU + {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|arm.ActiveCfg = Debug|Any CPU + {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|x64.ActiveCfg = Debug|Any CPU + {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|x86.ActiveCfg = Debug|Any CPU {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Debug|Any CPU.Build.0 = Debug|Any CPU {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1147,32 +1156,11 @@ Global {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Release|x64.Build.0 = Release|Any CPU {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Release|x86.ActiveCfg = Release|Any CPU {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Release|x86.Build.0 = Release|Any CPU - {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|arm.ActiveCfg = Debug|Any CPU - {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|x64.ActiveCfg = Debug|Any CPU - {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|x86.ActiveCfg = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|arm.ActiveCfg = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|arm64.ActiveCfg = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|x64.ActiveCfg = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|x64.Build.0 = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|x86.ActiveCfg = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|x86.Build.0 = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|Any CPU.Build.0 = Release|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|arm.ActiveCfg = Release|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|arm64.ActiveCfg = Release|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|x64.ActiveCfg = Release|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|x64.Build.0 = Release|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|x86.ActiveCfg = Release|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|x86.Build.0 = Release|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Checked|arm.ActiveCfg = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Checked|x64.ActiveCfg = Debug|Any CPU - {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Checked|x86.ActiveCfg = Debug|Any CPU + {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|arm.ActiveCfg = Debug|Any CPU + {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|x64.ActiveCfg = Debug|Any CPU + {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|x86.ActiveCfg = Debug|Any CPU {70441C80-1F14-42F9-8225-A891E3C9A82A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {70441C80-1F14-42F9-8225-A891E3C9A82A}.Debug|Any CPU.Build.0 = Debug|Any CPU {70441C80-1F14-42F9-8225-A891E3C9A82A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1189,11 +1177,11 @@ Global {70441C80-1F14-42F9-8225-A891E3C9A82A}.Release|x64.Build.0 = Release|Any CPU {70441C80-1F14-42F9-8225-A891E3C9A82A}.Release|x86.ActiveCfg = Release|Any CPU {70441C80-1F14-42F9-8225-A891E3C9A82A}.Release|x86.Build.0 = Release|Any CPU - {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|arm.ActiveCfg = Debug|Any CPU - {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|x64.ActiveCfg = Debug|Any CPU - {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|x86.ActiveCfg = Debug|Any CPU + {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|arm.ActiveCfg = Debug|Any CPU + {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|x64.ActiveCfg = Debug|Any CPU + {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|x86.ActiveCfg = Debug|Any CPU {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1210,11 +1198,11 @@ Global {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Release|x64.Build.0 = Release|Any CPU {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Release|x86.ActiveCfg = Release|Any CPU {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Release|x86.Build.0 = Release|Any CPU - {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|arm.ActiveCfg = Debug|Any CPU - {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|x64.ActiveCfg = Debug|Any CPU - {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|x86.ActiveCfg = Debug|Any CPU + {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|arm.ActiveCfg = Debug|Any CPU + {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|x64.ActiveCfg = Debug|Any CPU + {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|x86.ActiveCfg = Debug|Any CPU {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Debug|Any CPU.Build.0 = Debug|Any CPU {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1231,11 +1219,11 @@ Global {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Release|x64.Build.0 = Release|Any CPU {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Release|x86.ActiveCfg = Release|Any CPU {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Release|x86.Build.0 = Release|Any CPU - {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|arm.ActiveCfg = Debug|Any CPU - {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|x64.ActiveCfg = Debug|Any CPU - {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|x86.ActiveCfg = Debug|Any CPU + {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|arm.ActiveCfg = Debug|Any CPU + {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|arm64.ActiveCfg = Debug|Any CPU + {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|x64.ActiveCfg = Debug|Any CPU + {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|x86.ActiveCfg = Debug|Any CPU {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Debug|Any CPU.Build.0 = Debug|Any CPU {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1252,11 +1240,11 @@ Global {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Release|x64.Build.0 = Release|Any CPU {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Release|x86.ActiveCfg = Release|Any CPU {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Release|x86.Build.0 = Release|Any CPU - {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|arm.ActiveCfg = Debug|Any CPU - {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|arm64.ActiveCfg = Debug|Any CPU - {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|x64.ActiveCfg = Debug|Any CPU - {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|x86.ActiveCfg = Debug|Any CPU + {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|arm.ActiveCfg = Debug|Any CPU + {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|x64.ActiveCfg = Debug|Any CPU + {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|x86.ActiveCfg = Debug|Any CPU {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Debug|Any CPU.Build.0 = Debug|Any CPU {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1273,11 +1261,11 @@ Global {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Release|x64.Build.0 = Release|Any CPU {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Release|x86.ActiveCfg = Release|Any CPU {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Release|x86.Build.0 = Release|Any CPU - {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|arm.ActiveCfg = Debug|Any CPU - {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|x64.ActiveCfg = Debug|Any CPU - {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|x86.ActiveCfg = Debug|Any CPU + {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|arm.ActiveCfg = Debug|Any CPU + {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|arm64.ActiveCfg = Debug|Any CPU + {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|x64.ActiveCfg = Debug|Any CPU + {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|x86.ActiveCfg = Debug|Any CPU {988AECC5-6EB4-48AB-9467-3FB63619631B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {988AECC5-6EB4-48AB-9467-3FB63619631B}.Debug|Any CPU.Build.0 = Debug|Any CPU {988AECC5-6EB4-48AB-9467-3FB63619631B}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1294,32 +1282,11 @@ Global {988AECC5-6EB4-48AB-9467-3FB63619631B}.Release|x64.Build.0 = Release|Any CPU {988AECC5-6EB4-48AB-9467-3FB63619631B}.Release|x86.ActiveCfg = Release|Any CPU {988AECC5-6EB4-48AB-9467-3FB63619631B}.Release|x86.Build.0 = Release|Any CPU - {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|arm.ActiveCfg = Debug|Any CPU - {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|arm64.ActiveCfg = Debug|Any CPU - {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|x64.ActiveCfg = Debug|Any CPU - {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|x86.ActiveCfg = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|arm.ActiveCfg = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|arm64.ActiveCfg = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|x64.ActiveCfg = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|x64.Build.0 = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|x86.ActiveCfg = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|x86.Build.0 = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Release|Any CPU.Build.0 = Release|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Release|arm.ActiveCfg = Release|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Release|arm64.ActiveCfg = Release|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Release|x64.ActiveCfg = Release|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Release|x64.Build.0 = Release|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Release|x86.ActiveCfg = Release|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Release|x86.Build.0 = Release|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Checked|arm.ActiveCfg = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Checked|x64.ActiveCfg = Debug|Any CPU - {C5F86889-E147-4424-9165-D2DF453741F2}.Checked|x86.ActiveCfg = Debug|Any CPU + {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|arm.ActiveCfg = Debug|Any CPU + {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|x64.ActiveCfg = Debug|Any CPU + {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|x86.ActiveCfg = Debug|Any CPU {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Debug|Any CPU.Build.0 = Debug|Any CPU {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1336,11 +1303,11 @@ Global {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Release|x64.Build.0 = Release|Any CPU {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Release|x86.ActiveCfg = Release|Any CPU {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Release|x86.Build.0 = Release|Any CPU - {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|arm.ActiveCfg = Debug|Any CPU - {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|x64.ActiveCfg = Debug|Any CPU - {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|x86.ActiveCfg = Debug|Any CPU + {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|arm.ActiveCfg = Debug|Any CPU + {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|x64.ActiveCfg = Debug|Any CPU + {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|x86.ActiveCfg = Debug|Any CPU {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Debug|Any CPU.Build.0 = Debug|Any CPU {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1357,11 +1324,11 @@ Global {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Release|x64.Build.0 = Release|Any CPU {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Release|x86.ActiveCfg = Release|Any CPU {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Release|x86.Build.0 = Release|Any CPU - {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|arm.ActiveCfg = Debug|Any CPU - {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|x64.ActiveCfg = Debug|Any CPU - {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|x86.ActiveCfg = Debug|Any CPU + {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|arm.ActiveCfg = Debug|Any CPU + {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|arm64.ActiveCfg = Debug|Any CPU + {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|x64.ActiveCfg = Debug|Any CPU + {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|x86.ActiveCfg = Debug|Any CPU {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1378,11 +1345,11 @@ Global {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Release|x64.Build.0 = Release|Any CPU {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Release|x86.ActiveCfg = Release|Any CPU {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Release|x86.Build.0 = Release|Any CPU - {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|arm.ActiveCfg = Debug|Any CPU - {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|arm64.ActiveCfg = Debug|Any CPU - {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|x64.ActiveCfg = Debug|Any CPU - {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|x86.ActiveCfg = Debug|Any CPU + {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|arm.ActiveCfg = Debug|Any CPU + {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|arm64.ActiveCfg = Debug|Any CPU + {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|x64.ActiveCfg = Debug|Any CPU + {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|x86.ActiveCfg = Debug|Any CPU {32247916-74DE-4A62-AE68-04976D2B0149}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {32247916-74DE-4A62-AE68-04976D2B0149}.Debug|Any CPU.Build.0 = Debug|Any CPU {32247916-74DE-4A62-AE68-04976D2B0149}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1399,13 +1366,13 @@ Global {32247916-74DE-4A62-AE68-04976D2B0149}.Release|x64.Build.0 = Release|Any CPU {32247916-74DE-4A62-AE68-04976D2B0149}.Release|x86.ActiveCfg = Release|Any CPU {32247916-74DE-4A62-AE68-04976D2B0149}.Release|x86.Build.0 = Release|Any CPU - {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|arm.ActiveCfg = Debug|Any CPU - {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|arm64.ActiveCfg = Debug|Any CPU - {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|x64.ActiveCfg = Debug|Any CPU - {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|x86.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|arm.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|arm64.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|x64.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|x86.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|Any CPU.Build.0 = Debug|Any CPU {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|arm.ActiveCfg = Debug|Any CPU {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|arm64.ActiveCfg = Debug|Any CPU {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1420,11 +1387,11 @@ Global {5090E2BE-4BC9-4027-BF67-452049996F43}.Release|x64.Build.0 = Release|Any CPU {5090E2BE-4BC9-4027-BF67-452049996F43}.Release|x86.ActiveCfg = Release|Any CPU {5090E2BE-4BC9-4027-BF67-452049996F43}.Release|x86.Build.0 = Release|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|arm.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|arm64.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|x64.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|x86.ActiveCfg = Debug|Any CPU + {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|arm.ActiveCfg = Debug|Any CPU + {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|arm64.ActiveCfg = Debug|Any CPU + {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|x64.ActiveCfg = Debug|Any CPU + {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|x86.ActiveCfg = Debug|Any CPU {61164A2A-D90F-4122-AF5D-9704564E80E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {61164A2A-D90F-4122-AF5D-9704564E80E0}.Debug|Any CPU.Build.0 = Debug|Any CPU {61164A2A-D90F-4122-AF5D-9704564E80E0}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1441,11 +1408,11 @@ Global {61164A2A-D90F-4122-AF5D-9704564E80E0}.Release|x64.Build.0 = Release|Any CPU {61164A2A-D90F-4122-AF5D-9704564E80E0}.Release|x86.ActiveCfg = Release|Any CPU {61164A2A-D90F-4122-AF5D-9704564E80E0}.Release|x86.Build.0 = Release|Any CPU - {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|arm.ActiveCfg = Debug|Any CPU - {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|arm64.ActiveCfg = Debug|Any CPU - {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|x64.ActiveCfg = Debug|Any CPU - {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|x86.ActiveCfg = Debug|Any CPU + {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|arm.ActiveCfg = Debug|Any CPU + {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|x64.ActiveCfg = Debug|Any CPU + {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|x86.ActiveCfg = Debug|Any CPU {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Debug|Any CPU.Build.0 = Debug|Any CPU {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1462,11 +1429,11 @@ Global {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Release|x64.Build.0 = Release|Any CPU {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Release|x86.ActiveCfg = Release|Any CPU {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Release|x86.Build.0 = Release|Any CPU - {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|arm.ActiveCfg = Debug|Any CPU - {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|x64.ActiveCfg = Debug|Any CPU - {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|x86.ActiveCfg = Debug|Any CPU + {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|arm.ActiveCfg = Debug|Any CPU + {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|arm64.ActiveCfg = Debug|Any CPU + {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|x64.ActiveCfg = Debug|Any CPU + {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|x86.ActiveCfg = Debug|Any CPU {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Debug|Any CPU.Build.0 = Debug|Any CPU {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1483,11 +1450,11 @@ Global {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Release|x64.Build.0 = Release|Any CPU {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Release|x86.ActiveCfg = Release|Any CPU {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Release|x86.Build.0 = Release|Any CPU - {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|arm.ActiveCfg = Debug|Any CPU - {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|arm64.ActiveCfg = Debug|Any CPU - {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|x64.ActiveCfg = Debug|Any CPU - {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|x86.ActiveCfg = Debug|Any CPU + {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|arm.ActiveCfg = Debug|Any CPU + {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|x64.ActiveCfg = Debug|Any CPU + {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|x86.ActiveCfg = Debug|Any CPU {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Debug|Any CPU.Build.0 = Debug|Any CPU {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1504,11 +1471,11 @@ Global {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Release|x64.Build.0 = Release|Any CPU {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Release|x86.ActiveCfg = Release|Any CPU {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Release|x86.Build.0 = Release|Any CPU - {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|arm.ActiveCfg = Debug|Any CPU - {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|x64.ActiveCfg = Debug|Any CPU - {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|x86.ActiveCfg = Debug|Any CPU + {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|arm.ActiveCfg = Debug|Any CPU + {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|x64.ActiveCfg = Debug|Any CPU + {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|x86.ActiveCfg = Debug|Any CPU {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Debug|Any CPU.Build.0 = Debug|Any CPU {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1525,11 +1492,11 @@ Global {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Release|x64.Build.0 = Release|Any CPU {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Release|x86.ActiveCfg = Release|Any CPU {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Release|x86.Build.0 = Release|Any CPU - {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|arm.ActiveCfg = Debug|Any CPU - {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|x64.ActiveCfg = Debug|Any CPU - {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|x86.ActiveCfg = Debug|Any CPU + {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|arm.ActiveCfg = Debug|Any CPU + {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|x64.ActiveCfg = Debug|Any CPU + {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|x86.ActiveCfg = Debug|Any CPU {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Debug|Any CPU.Build.0 = Debug|Any CPU {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1546,11 +1513,11 @@ Global {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Release|x64.Build.0 = Release|Any CPU {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Release|x86.ActiveCfg = Release|Any CPU {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Release|x86.Build.0 = Release|Any CPU - {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|arm.ActiveCfg = Debug|Any CPU - {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|x64.ActiveCfg = Debug|Any CPU - {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|x86.ActiveCfg = Debug|Any CPU + {E73952E5-C929-4566-962A-B9AF65289871}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E73952E5-C929-4566-962A-B9AF65289871}.Checked|arm.ActiveCfg = Debug|Any CPU + {E73952E5-C929-4566-962A-B9AF65289871}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E73952E5-C929-4566-962A-B9AF65289871}.Checked|x64.ActiveCfg = Debug|Any CPU + {E73952E5-C929-4566-962A-B9AF65289871}.Checked|x86.ActiveCfg = Debug|Any CPU {E73952E5-C929-4566-962A-B9AF65289871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E73952E5-C929-4566-962A-B9AF65289871}.Debug|Any CPU.Build.0 = Debug|Any CPU {E73952E5-C929-4566-962A-B9AF65289871}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1567,11 +1534,11 @@ Global {E73952E5-C929-4566-962A-B9AF65289871}.Release|x64.Build.0 = Release|Any CPU {E73952E5-C929-4566-962A-B9AF65289871}.Release|x86.ActiveCfg = Release|Any CPU {E73952E5-C929-4566-962A-B9AF65289871}.Release|x86.Build.0 = Release|Any CPU - {E73952E5-C929-4566-962A-B9AF65289871}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E73952E5-C929-4566-962A-B9AF65289871}.Checked|arm.ActiveCfg = Debug|Any CPU - {E73952E5-C929-4566-962A-B9AF65289871}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E73952E5-C929-4566-962A-B9AF65289871}.Checked|x64.ActiveCfg = Debug|Any CPU - {E73952E5-C929-4566-962A-B9AF65289871}.Checked|x86.ActiveCfg = Debug|Any CPU + {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|arm.ActiveCfg = Debug|Any CPU + {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|x64.ActiveCfg = Debug|Any CPU + {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|x86.ActiveCfg = Debug|Any CPU {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Debug|Any CPU.Build.0 = Debug|Any CPU {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1588,11 +1555,11 @@ Global {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Release|x64.Build.0 = Release|Any CPU {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Release|x86.ActiveCfg = Release|Any CPU {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Release|x86.Build.0 = Release|Any CPU - {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|arm.ActiveCfg = Debug|Any CPU - {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|x64.ActiveCfg = Debug|Any CPU - {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|x86.ActiveCfg = Debug|Any CPU + {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|arm.ActiveCfg = Debug|Any CPU + {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|x64.ActiveCfg = Debug|Any CPU + {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|x86.ActiveCfg = Debug|Any CPU {A6D86695-D570-43F9-99A3-6C7445362D53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A6D86695-D570-43F9-99A3-6C7445362D53}.Debug|Any CPU.Build.0 = Debug|Any CPU {A6D86695-D570-43F9-99A3-6C7445362D53}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1609,11 +1576,11 @@ Global {A6D86695-D570-43F9-99A3-6C7445362D53}.Release|x64.Build.0 = Release|Any CPU {A6D86695-D570-43F9-99A3-6C7445362D53}.Release|x86.ActiveCfg = Release|Any CPU {A6D86695-D570-43F9-99A3-6C7445362D53}.Release|x86.Build.0 = Release|Any CPU - {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|arm.ActiveCfg = Debug|Any CPU - {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|x64.ActiveCfg = Debug|Any CPU - {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|x86.ActiveCfg = Debug|Any CPU + {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|arm.ActiveCfg = Debug|Any CPU + {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|x64.ActiveCfg = Debug|Any CPU + {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|x86.ActiveCfg = Debug|Any CPU {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Debug|Any CPU.Build.0 = Debug|Any CPU {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1630,11 +1597,11 @@ Global {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Release|x64.Build.0 = Release|Any CPU {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Release|x86.ActiveCfg = Release|Any CPU {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Release|x86.Build.0 = Release|Any CPU - {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|arm.ActiveCfg = Debug|Any CPU - {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|x64.ActiveCfg = Debug|Any CPU - {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|x86.ActiveCfg = Debug|Any CPU + {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|arm.ActiveCfg = Debug|Any CPU + {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|arm64.ActiveCfg = Debug|Any CPU + {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|x64.ActiveCfg = Debug|Any CPU + {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|x86.ActiveCfg = Debug|Any CPU {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Debug|Any CPU.Build.0 = Debug|Any CPU {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1651,11 +1618,11 @@ Global {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Release|x64.Build.0 = Release|Any CPU {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Release|x86.ActiveCfg = Release|Any CPU {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Release|x86.Build.0 = Release|Any CPU - {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|arm.ActiveCfg = Debug|Any CPU - {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|arm64.ActiveCfg = Debug|Any CPU - {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|x64.ActiveCfg = Debug|Any CPU - {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|x86.ActiveCfg = Debug|Any CPU + {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|arm.ActiveCfg = Debug|Any CPU + {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|x64.ActiveCfg = Debug|Any CPU + {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|x86.ActiveCfg = Debug|Any CPU {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Debug|Any CPU.Build.0 = Debug|Any CPU {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1672,11 +1639,11 @@ Global {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Release|x64.Build.0 = Release|Any CPU {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Release|x86.ActiveCfg = Release|Any CPU {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Release|x86.Build.0 = Release|Any CPU - {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|arm.ActiveCfg = Debug|Any CPU - {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|x64.ActiveCfg = Debug|Any CPU - {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|x86.ActiveCfg = Debug|Any CPU + {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|arm.ActiveCfg = Debug|Any CPU + {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|arm64.ActiveCfg = Debug|Any CPU + {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|x64.ActiveCfg = Debug|Any CPU + {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|x86.ActiveCfg = Debug|Any CPU {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1693,11 +1660,11 @@ Global {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Release|x64.Build.0 = Release|Any CPU {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Release|x86.ActiveCfg = Release|Any CPU {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Release|x86.Build.0 = Release|Any CPU - {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|arm.ActiveCfg = Debug|Any CPU - {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|arm64.ActiveCfg = Debug|Any CPU - {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|x64.ActiveCfg = Debug|Any CPU - {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|x86.ActiveCfg = Debug|Any CPU + {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|arm.ActiveCfg = Debug|Any CPU + {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|x64.ActiveCfg = Debug|Any CPU + {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|x86.ActiveCfg = Debug|Any CPU {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Debug|Any CPU.Build.0 = Debug|Any CPU {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1714,11 +1681,11 @@ Global {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Release|x64.Build.0 = Release|Any CPU {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Release|x86.ActiveCfg = Release|Any CPU {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Release|x86.Build.0 = Release|Any CPU - {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|arm.ActiveCfg = Debug|Any CPU - {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|x64.ActiveCfg = Debug|Any CPU - {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|x86.ActiveCfg = Debug|Any CPU + {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|arm.ActiveCfg = Debug|Any CPU + {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|x64.ActiveCfg = Debug|Any CPU + {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|x86.ActiveCfg = Debug|Any CPU {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Debug|Any CPU.Build.0 = Debug|Any CPU {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1735,11 +1702,11 @@ Global {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Release|x64.Build.0 = Release|Any CPU {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Release|x86.ActiveCfg = Release|Any CPU {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Release|x86.Build.0 = Release|Any CPU - {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|arm.ActiveCfg = Debug|Any CPU - {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|x64.ActiveCfg = Debug|Any CPU - {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|x86.ActiveCfg = Debug|Any CPU + {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|arm.ActiveCfg = Debug|Any CPU + {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|x64.ActiveCfg = Debug|Any CPU + {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|x86.ActiveCfg = Debug|Any CPU {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Debug|Any CPU.Build.0 = Debug|Any CPU {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1756,11 +1723,11 @@ Global {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Release|x64.Build.0 = Release|Any CPU {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Release|x86.ActiveCfg = Release|Any CPU {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Release|x86.Build.0 = Release|Any CPU - {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|arm.ActiveCfg = Debug|Any CPU - {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|x64.ActiveCfg = Debug|Any CPU - {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|x86.ActiveCfg = Debug|Any CPU + {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|arm.ActiveCfg = Debug|Any CPU + {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|x64.ActiveCfg = Debug|Any CPU + {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|x86.ActiveCfg = Debug|Any CPU {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Debug|Any CPU.Build.0 = Debug|Any CPU {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1777,11 +1744,11 @@ Global {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Release|x64.Build.0 = Release|Any CPU {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Release|x86.ActiveCfg = Release|Any CPU {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Release|x86.Build.0 = Release|Any CPU - {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|arm.ActiveCfg = Debug|Any CPU - {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|x64.ActiveCfg = Debug|Any CPU - {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|x86.ActiveCfg = Debug|Any CPU + {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|arm.ActiveCfg = Debug|Any CPU + {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|x64.ActiveCfg = Debug|Any CPU + {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|x86.ActiveCfg = Debug|Any CPU {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Debug|Any CPU.Build.0 = Debug|Any CPU {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1798,11 +1765,11 @@ Global {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Release|x64.Build.0 = Release|Any CPU {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Release|x86.ActiveCfg = Release|Any CPU {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Release|x86.Build.0 = Release|Any CPU - {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|arm.ActiveCfg = Debug|Any CPU - {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|x64.ActiveCfg = Debug|Any CPU - {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|x86.ActiveCfg = Debug|Any CPU + {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|arm.ActiveCfg = Debug|Any CPU + {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|arm64.ActiveCfg = Debug|Any CPU + {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|x64.ActiveCfg = Debug|Any CPU + {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|x86.ActiveCfg = Debug|Any CPU {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Debug|Any CPU.Build.0 = Debug|Any CPU {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1819,11 +1786,11 @@ Global {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Release|x64.Build.0 = Release|Any CPU {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Release|x86.ActiveCfg = Release|Any CPU {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Release|x86.Build.0 = Release|Any CPU - {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|arm.ActiveCfg = Debug|Any CPU - {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|arm64.ActiveCfg = Debug|Any CPU - {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|x64.ActiveCfg = Debug|Any CPU - {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|x86.ActiveCfg = Debug|Any CPU + {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|arm.ActiveCfg = Debug|Any CPU + {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|x64.ActiveCfg = Debug|Any CPU + {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|x86.ActiveCfg = Debug|Any CPU {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Debug|Any CPU.Build.0 = Debug|Any CPU {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1840,11 +1807,11 @@ Global {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Release|x64.Build.0 = Release|Any CPU {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Release|x86.ActiveCfg = Release|Any CPU {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Release|x86.Build.0 = Release|Any CPU - {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|arm.ActiveCfg = Debug|Any CPU - {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|x64.ActiveCfg = Debug|Any CPU - {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|x86.ActiveCfg = Debug|Any CPU + {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|arm.ActiveCfg = Debug|Any CPU + {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|x64.ActiveCfg = Debug|Any CPU + {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|x86.ActiveCfg = Debug|Any CPU {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Debug|Any CPU.Build.0 = Debug|Any CPU {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1861,11 +1828,11 @@ Global {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Release|x64.Build.0 = Release|Any CPU {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Release|x86.ActiveCfg = Release|Any CPU {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Release|x86.Build.0 = Release|Any CPU - {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|arm.ActiveCfg = Debug|Any CPU - {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|x64.ActiveCfg = Debug|Any CPU - {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|x86.ActiveCfg = Debug|Any CPU + {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|arm.ActiveCfg = Debug|Any CPU + {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|x64.ActiveCfg = Debug|Any CPU + {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|x86.ActiveCfg = Debug|Any CPU {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Debug|Any CPU.Build.0 = Debug|Any CPU {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1882,11 +1849,11 @@ Global {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Release|x64.Build.0 = Release|Any CPU {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Release|x86.ActiveCfg = Release|Any CPU {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Release|x86.Build.0 = Release|Any CPU - {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|arm.ActiveCfg = Debug|Any CPU - {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|x64.ActiveCfg = Debug|Any CPU - {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|x86.ActiveCfg = Debug|Any CPU + {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|arm.ActiveCfg = Debug|Any CPU + {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|x64.ActiveCfg = Debug|Any CPU + {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|x86.ActiveCfg = Debug|Any CPU {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Debug|Any CPU.Build.0 = Debug|Any CPU {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1903,11 +1870,11 @@ Global {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Release|x64.Build.0 = Release|Any CPU {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Release|x86.ActiveCfg = Release|Any CPU {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Release|x86.Build.0 = Release|Any CPU - {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|arm.ActiveCfg = Debug|Any CPU - {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|x64.ActiveCfg = Debug|Any CPU - {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|x86.ActiveCfg = Debug|Any CPU + {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|arm.ActiveCfg = Debug|Any CPU + {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|arm64.ActiveCfg = Debug|Any CPU + {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|x64.ActiveCfg = Debug|Any CPU + {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|x86.ActiveCfg = Debug|Any CPU {049319F0-D438-404C-A6D4-4D1E99DAE647}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {049319F0-D438-404C-A6D4-4D1E99DAE647}.Debug|Any CPU.Build.0 = Debug|Any CPU {049319F0-D438-404C-A6D4-4D1E99DAE647}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1924,15 +1891,15 @@ Global {049319F0-D438-404C-A6D4-4D1E99DAE647}.Release|x64.Build.0 = Release|Any CPU {049319F0-D438-404C-A6D4-4D1E99DAE647}.Release|x86.ActiveCfg = Release|Any CPU {049319F0-D438-404C-A6D4-4D1E99DAE647}.Release|x86.Build.0 = Release|Any CPU - {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|arm.ActiveCfg = Debug|Any CPU - {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|arm64.ActiveCfg = Debug|Any CPU - {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|x64.ActiveCfg = Debug|Any CPU - {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|x86.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|Any CPU.Build.0 = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|arm.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|arm64.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|arm.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|arm64.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|x64.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|x86.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|Any CPU.Build.0 = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|arm.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|arm64.ActiveCfg = Debug|Any CPU {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|x64.ActiveCfg = Debug|Any CPU {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|x64.Build.0 = Debug|Any CPU {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1945,11 +1912,11 @@ Global {691D460F-764F-48E7-9A3F-7D1A32388542}.Release|x64.Build.0 = Release|Any CPU {691D460F-764F-48E7-9A3F-7D1A32388542}.Release|x86.ActiveCfg = Release|Any CPU {691D460F-764F-48E7-9A3F-7D1A32388542}.Release|x86.Build.0 = Release|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|arm.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|arm64.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|x64.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|x86.ActiveCfg = Debug|Any CPU + {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|arm.ActiveCfg = Debug|Any CPU + {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|x64.ActiveCfg = Debug|Any CPU + {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|x86.ActiveCfg = Debug|Any CPU {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1966,11 +1933,11 @@ Global {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Release|x64.Build.0 = Release|Any CPU {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Release|x86.ActiveCfg = Release|Any CPU {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Release|x86.Build.0 = Release|Any CPU - {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|arm.ActiveCfg = Debug|Any CPU - {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|x64.ActiveCfg = Debug|Any CPU - {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|x86.ActiveCfg = Debug|Any CPU + {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|arm.ActiveCfg = Debug|Any CPU + {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|arm64.ActiveCfg = Debug|Any CPU + {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|x64.ActiveCfg = Debug|Any CPU + {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|x86.ActiveCfg = Debug|Any CPU {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Debug|Any CPU.Build.0 = Debug|Any CPU {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1987,11 +1954,11 @@ Global {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Release|x64.Build.0 = Release|Any CPU {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Release|x86.ActiveCfg = Release|Any CPU {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Release|x86.Build.0 = Release|Any CPU - {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|arm.ActiveCfg = Debug|Any CPU - {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|arm64.ActiveCfg = Debug|Any CPU - {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|x64.ActiveCfg = Debug|Any CPU - {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|x86.ActiveCfg = Debug|Any CPU + {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|arm.ActiveCfg = Debug|Any CPU + {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|x64.ActiveCfg = Debug|Any CPU + {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|x86.ActiveCfg = Debug|Any CPU {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Debug|Any CPU.Build.0 = Debug|Any CPU {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2008,11 +1975,11 @@ Global {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Release|x64.Build.0 = Release|Any CPU {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Release|x86.ActiveCfg = Release|Any CPU {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Release|x86.Build.0 = Release|Any CPU - {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|arm.ActiveCfg = Debug|Any CPU - {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|x64.ActiveCfg = Debug|Any CPU - {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|x86.ActiveCfg = Debug|Any CPU + {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|arm.ActiveCfg = Debug|Any CPU + {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|x64.ActiveCfg = Debug|Any CPU + {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|x86.ActiveCfg = Debug|Any CPU {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Debug|Any CPU.Build.0 = Debug|Any CPU {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2029,11 +1996,11 @@ Global {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Release|x64.Build.0 = Release|Any CPU {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Release|x86.ActiveCfg = Release|Any CPU {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Release|x86.Build.0 = Release|Any CPU - {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|arm.ActiveCfg = Debug|Any CPU - {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|x64.ActiveCfg = Debug|Any CPU - {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|x86.ActiveCfg = Debug|Any CPU + {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|arm.ActiveCfg = Debug|Any CPU + {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|arm64.ActiveCfg = Debug|Any CPU + {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|x64.ActiveCfg = Debug|Any CPU + {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|x86.ActiveCfg = Debug|Any CPU {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Debug|Any CPU.Build.0 = Debug|Any CPU {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2050,11 +2017,11 @@ Global {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Release|x64.Build.0 = Release|Any CPU {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Release|x86.ActiveCfg = Release|Any CPU {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Release|x86.Build.0 = Release|Any CPU - {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|arm.ActiveCfg = Debug|Any CPU - {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|arm64.ActiveCfg = Debug|Any CPU - {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|x64.ActiveCfg = Debug|Any CPU - {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|x86.ActiveCfg = Debug|Any CPU + {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|arm.ActiveCfg = Debug|Any CPU + {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|x64.ActiveCfg = Debug|Any CPU + {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|x86.ActiveCfg = Debug|Any CPU {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Debug|Any CPU.Build.0 = Debug|Any CPU {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2071,11 +2038,11 @@ Global {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Release|x64.Build.0 = Release|Any CPU {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Release|x86.ActiveCfg = Release|Any CPU {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Release|x86.Build.0 = Release|Any CPU - {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|arm.ActiveCfg = Debug|Any CPU - {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|x64.ActiveCfg = Debug|Any CPU - {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|x86.ActiveCfg = Debug|Any CPU + {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|arm.ActiveCfg = Debug|Any CPU + {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|x64.ActiveCfg = Debug|Any CPU + {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|x86.ActiveCfg = Debug|Any CPU {D86CC877-79A0-4AFA-9A76-7263B414614D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D86CC877-79A0-4AFA-9A76-7263B414614D}.Debug|Any CPU.Build.0 = Debug|Any CPU {D86CC877-79A0-4AFA-9A76-7263B414614D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2092,11 +2059,11 @@ Global {D86CC877-79A0-4AFA-9A76-7263B414614D}.Release|x64.Build.0 = Release|Any CPU {D86CC877-79A0-4AFA-9A76-7263B414614D}.Release|x86.ActiveCfg = Release|Any CPU {D86CC877-79A0-4AFA-9A76-7263B414614D}.Release|x86.Build.0 = Release|Any CPU - {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|arm.ActiveCfg = Debug|Any CPU - {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|x64.ActiveCfg = Debug|Any CPU - {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|x86.ActiveCfg = Debug|Any CPU + {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|arm.ActiveCfg = Debug|Any CPU + {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|x64.ActiveCfg = Debug|Any CPU + {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|x86.ActiveCfg = Debug|Any CPU {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Debug|Any CPU.Build.0 = Debug|Any CPU {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2113,11 +2080,11 @@ Global {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Release|x64.Build.0 = Release|Any CPU {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Release|x86.ActiveCfg = Release|Any CPU {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Release|x86.Build.0 = Release|Any CPU - {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|arm.ActiveCfg = Debug|Any CPU - {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|x64.ActiveCfg = Debug|Any CPU - {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|x86.ActiveCfg = Debug|Any CPU + {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|arm.ActiveCfg = Debug|Any CPU + {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|arm64.ActiveCfg = Debug|Any CPU + {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|x64.ActiveCfg = Debug|Any CPU + {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|x86.ActiveCfg = Debug|Any CPU {59CD73F2-1310-46EE-B99A-594859FD8A37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {59CD73F2-1310-46EE-B99A-594859FD8A37}.Debug|Any CPU.Build.0 = Debug|Any CPU {59CD73F2-1310-46EE-B99A-594859FD8A37}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2134,11 +2101,11 @@ Global {59CD73F2-1310-46EE-B99A-594859FD8A37}.Release|x64.Build.0 = Release|Any CPU {59CD73F2-1310-46EE-B99A-594859FD8A37}.Release|x86.ActiveCfg = Release|Any CPU {59CD73F2-1310-46EE-B99A-594859FD8A37}.Release|x86.Build.0 = Release|Any CPU - {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|arm.ActiveCfg = Debug|Any CPU - {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|arm64.ActiveCfg = Debug|Any CPU - {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|x64.ActiveCfg = Debug|Any CPU - {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|x86.ActiveCfg = Debug|Any CPU + {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|arm.ActiveCfg = Debug|Any CPU + {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|arm64.ActiveCfg = Debug|Any CPU + {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|x64.ActiveCfg = Debug|Any CPU + {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|x86.ActiveCfg = Debug|Any CPU {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Debug|Any CPU.Build.0 = Debug|Any CPU {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2155,11 +2122,11 @@ Global {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Release|x64.Build.0 = Release|Any CPU {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Release|x86.ActiveCfg = Release|Any CPU {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Release|x86.Build.0 = Release|Any CPU - {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|arm.ActiveCfg = Debug|Any CPU - {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|arm64.ActiveCfg = Debug|Any CPU - {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|x64.ActiveCfg = Debug|Any CPU - {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|x86.ActiveCfg = Debug|Any CPU + {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|arm.ActiveCfg = Debug|Any CPU + {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|arm64.ActiveCfg = Debug|Any CPU + {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|x64.ActiveCfg = Debug|Any CPU + {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|x86.ActiveCfg = Debug|Any CPU {0BF9F165-888D-486A-B6FD-6F3029913D70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0BF9F165-888D-486A-B6FD-6F3029913D70}.Debug|Any CPU.Build.0 = Debug|Any CPU {0BF9F165-888D-486A-B6FD-6F3029913D70}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2176,11 +2143,11 @@ Global {0BF9F165-888D-486A-B6FD-6F3029913D70}.Release|x64.Build.0 = Release|Any CPU {0BF9F165-888D-486A-B6FD-6F3029913D70}.Release|x86.ActiveCfg = Release|Any CPU {0BF9F165-888D-486A-B6FD-6F3029913D70}.Release|x86.Build.0 = Release|Any CPU - {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|arm.ActiveCfg = Debug|Any CPU - {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|arm64.ActiveCfg = Debug|Any CPU - {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|x64.ActiveCfg = Debug|Any CPU - {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|x86.ActiveCfg = Debug|Any CPU + {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|arm.ActiveCfg = Debug|Any CPU + {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|x64.ActiveCfg = Debug|Any CPU + {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|x86.ActiveCfg = Debug|Any CPU {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Debug|Any CPU.Build.0 = Debug|Any CPU {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2197,11 +2164,11 @@ Global {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Release|x64.Build.0 = Release|Any CPU {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Release|x86.ActiveCfg = Release|Any CPU {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Release|x86.Build.0 = Release|Any CPU - {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|arm.ActiveCfg = Debug|Any CPU - {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|x64.ActiveCfg = Debug|Any CPU - {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|x86.ActiveCfg = Debug|Any CPU + {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|arm.ActiveCfg = Debug|Any CPU + {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|x64.ActiveCfg = Debug|Any CPU + {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|x86.ActiveCfg = Debug|Any CPU {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Debug|Any CPU.Build.0 = Debug|Any CPU {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2218,11 +2185,11 @@ Global {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Release|x64.Build.0 = Release|Any CPU {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Release|x86.ActiveCfg = Release|Any CPU {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Release|x86.Build.0 = Release|Any CPU - {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|arm.ActiveCfg = Debug|Any CPU - {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|x64.ActiveCfg = Debug|Any CPU - {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|x86.ActiveCfg = Debug|Any CPU + {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|arm.ActiveCfg = Debug|Any CPU + {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|arm64.ActiveCfg = Debug|Any CPU + {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|x64.ActiveCfg = Debug|Any CPU + {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|x86.ActiveCfg = Debug|Any CPU {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Debug|Any CPU.Build.0 = Debug|Any CPU {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2239,11 +2206,11 @@ Global {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Release|x64.Build.0 = Release|Any CPU {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Release|x86.ActiveCfg = Release|Any CPU {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Release|x86.Build.0 = Release|Any CPU - {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|arm.ActiveCfg = Debug|Any CPU - {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|arm64.ActiveCfg = Debug|Any CPU - {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|x64.ActiveCfg = Debug|Any CPU - {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|x86.ActiveCfg = Debug|Any CPU + {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|arm.ActiveCfg = Debug|Any CPU + {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|x64.ActiveCfg = Debug|Any CPU + {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|x86.ActiveCfg = Debug|Any CPU {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Debug|Any CPU.Build.0 = Debug|Any CPU {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2260,11 +2227,11 @@ Global {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Release|x64.Build.0 = Release|Any CPU {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Release|x86.ActiveCfg = Release|Any CPU {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Release|x86.Build.0 = Release|Any CPU - {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|arm.ActiveCfg = Debug|Any CPU - {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|x64.ActiveCfg = Debug|Any CPU - {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|x86.ActiveCfg = Debug|Any CPU + {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|arm.ActiveCfg = Debug|Any CPU + {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|x64.ActiveCfg = Debug|Any CPU + {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|x86.ActiveCfg = Debug|Any CPU {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Debug|Any CPU.Build.0 = Debug|Any CPU {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2281,11 +2248,11 @@ Global {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Release|x64.Build.0 = Release|Any CPU {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Release|x86.ActiveCfg = Release|Any CPU {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Release|x86.Build.0 = Release|Any CPU - {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|arm.ActiveCfg = Debug|Any CPU - {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|x64.ActiveCfg = Debug|Any CPU - {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|x86.ActiveCfg = Debug|Any CPU + {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|arm.ActiveCfg = Debug|Any CPU + {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|arm64.ActiveCfg = Debug|Any CPU + {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|x64.ActiveCfg = Debug|Any CPU + {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|x86.ActiveCfg = Debug|Any CPU {47E26787-7C27-4572-AD8B-868DE44E2C48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {47E26787-7C27-4572-AD8B-868DE44E2C48}.Debug|Any CPU.Build.0 = Debug|Any CPU {47E26787-7C27-4572-AD8B-868DE44E2C48}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2302,11 +2269,11 @@ Global {47E26787-7C27-4572-AD8B-868DE44E2C48}.Release|x64.Build.0 = Release|Any CPU {47E26787-7C27-4572-AD8B-868DE44E2C48}.Release|x86.ActiveCfg = Release|Any CPU {47E26787-7C27-4572-AD8B-868DE44E2C48}.Release|x86.Build.0 = Release|Any CPU - {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|arm.ActiveCfg = Debug|Any CPU - {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|arm64.ActiveCfg = Debug|Any CPU - {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|x64.ActiveCfg = Debug|Any CPU - {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|x86.ActiveCfg = Debug|Any CPU + {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|arm.ActiveCfg = Debug|Any CPU + {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|x64.ActiveCfg = Debug|Any CPU + {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|x86.ActiveCfg = Debug|Any CPU {C230AC88-A377-4BEB-824F-AB174C14DC86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C230AC88-A377-4BEB-824F-AB174C14DC86}.Debug|Any CPU.Build.0 = Debug|Any CPU {C230AC88-A377-4BEB-824F-AB174C14DC86}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2323,11 +2290,11 @@ Global {C230AC88-A377-4BEB-824F-AB174C14DC86}.Release|x64.Build.0 = Release|Any CPU {C230AC88-A377-4BEB-824F-AB174C14DC86}.Release|x86.ActiveCfg = Release|Any CPU {C230AC88-A377-4BEB-824F-AB174C14DC86}.Release|x86.Build.0 = Release|Any CPU - {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|arm.ActiveCfg = Debug|Any CPU - {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|x64.ActiveCfg = Debug|Any CPU - {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|x86.ActiveCfg = Debug|Any CPU + {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|arm.ActiveCfg = Debug|Any CPU + {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|x64.ActiveCfg = Debug|Any CPU + {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|x86.ActiveCfg = Debug|Any CPU {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Debug|Any CPU.Build.0 = Debug|Any CPU {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2344,11 +2311,11 @@ Global {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Release|x64.Build.0 = Release|Any CPU {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Release|x86.ActiveCfg = Release|Any CPU {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Release|x86.Build.0 = Release|Any CPU - {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|arm.ActiveCfg = Debug|Any CPU - {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|x64.ActiveCfg = Debug|Any CPU - {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|x86.ActiveCfg = Debug|Any CPU + {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|arm.ActiveCfg = Debug|Any CPU + {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|arm64.ActiveCfg = Debug|Any CPU + {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|x64.ActiveCfg = Debug|Any CPU + {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|x86.ActiveCfg = Debug|Any CPU {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Debug|Any CPU.Build.0 = Debug|Any CPU {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2365,11 +2332,11 @@ Global {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Release|x64.Build.0 = Release|Any CPU {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Release|x86.ActiveCfg = Release|Any CPU {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Release|x86.Build.0 = Release|Any CPU - {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|arm.ActiveCfg = Debug|Any CPU - {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|arm64.ActiveCfg = Debug|Any CPU - {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|x64.ActiveCfg = Debug|Any CPU - {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|x86.ActiveCfg = Debug|Any CPU + {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|arm.ActiveCfg = Debug|Any CPU + {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|arm64.ActiveCfg = Debug|Any CPU + {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|x64.ActiveCfg = Debug|Any CPU + {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|x86.ActiveCfg = Debug|Any CPU {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Debug|Any CPU.Build.0 = Debug|Any CPU {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2386,11 +2353,11 @@ Global {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Release|x64.Build.0 = Release|Any CPU {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Release|x86.ActiveCfg = Release|Any CPU {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Release|x86.Build.0 = Release|Any CPU - {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|arm.ActiveCfg = Debug|Any CPU - {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|arm64.ActiveCfg = Debug|Any CPU - {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|x64.ActiveCfg = Debug|Any CPU - {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|x86.ActiveCfg = Debug|Any CPU + {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|arm.ActiveCfg = Debug|Any CPU + {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|arm64.ActiveCfg = Debug|Any CPU + {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|x64.ActiveCfg = Debug|Any CPU + {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|x86.ActiveCfg = Debug|Any CPU {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Debug|Any CPU.Build.0 = Debug|Any CPU {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2407,11 +2374,11 @@ Global {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Release|x64.Build.0 = Release|Any CPU {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Release|x86.ActiveCfg = Release|Any CPU {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Release|x86.Build.0 = Release|Any CPU - {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|arm.ActiveCfg = Debug|Any CPU - {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|arm64.ActiveCfg = Debug|Any CPU - {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|x64.ActiveCfg = Debug|Any CPU - {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|x86.ActiveCfg = Debug|Any CPU + {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|arm.ActiveCfg = Debug|Any CPU + {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|arm64.ActiveCfg = Debug|Any CPU + {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|x64.ActiveCfg = Debug|Any CPU + {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|x86.ActiveCfg = Debug|Any CPU {697C63A2-2517-4F85-8B88-C94E538BE407}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {697C63A2-2517-4F85-8B88-C94E538BE407}.Debug|Any CPU.Build.0 = Debug|Any CPU {697C63A2-2517-4F85-8B88-C94E538BE407}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2428,11 +2395,11 @@ Global {697C63A2-2517-4F85-8B88-C94E538BE407}.Release|x64.Build.0 = Release|Any CPU {697C63A2-2517-4F85-8B88-C94E538BE407}.Release|x86.ActiveCfg = Release|Any CPU {697C63A2-2517-4F85-8B88-C94E538BE407}.Release|x86.Build.0 = Release|Any CPU - {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|arm.ActiveCfg = Debug|Any CPU - {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|arm64.ActiveCfg = Debug|Any CPU - {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|x64.ActiveCfg = Debug|Any CPU - {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|x86.ActiveCfg = Debug|Any CPU + {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|arm.ActiveCfg = Debug|Any CPU + {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|arm64.ActiveCfg = Debug|Any CPU + {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|x64.ActiveCfg = Debug|Any CPU + {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|x86.ActiveCfg = Debug|Any CPU {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Debug|Any CPU.Build.0 = Debug|Any CPU {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2449,13 +2416,13 @@ Global {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Release|x64.Build.0 = Release|Any CPU {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Release|x86.ActiveCfg = Release|Any CPU {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Release|x86.Build.0 = Release|Any CPU - {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|arm.ActiveCfg = Debug|Any CPU - {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|arm64.ActiveCfg = Debug|Any CPU - {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|x64.ActiveCfg = Debug|Any CPU - {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|x86.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|arm.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|arm64.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|x64.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|x86.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|Any CPU.Build.0 = Debug|Any CPU {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|arm.ActiveCfg = Debug|Any CPU {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|arm64.ActiveCfg = Debug|Any CPU {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -2470,11 +2437,11 @@ Global {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Release|x64.Build.0 = Release|Any CPU {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Release|x86.ActiveCfg = Release|Any CPU {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Release|x86.Build.0 = Release|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|arm.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|arm64.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|x64.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|x86.ActiveCfg = Debug|Any CPU + {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|arm.ActiveCfg = Debug|Any CPU + {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|arm64.ActiveCfg = Debug|Any CPU + {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|x64.ActiveCfg = Debug|Any CPU + {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|x86.ActiveCfg = Debug|Any CPU {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Debug|Any CPU.Build.0 = Debug|Any CPU {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2491,11 +2458,11 @@ Global {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Release|x64.Build.0 = Release|Any CPU {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Release|x86.ActiveCfg = Release|Any CPU {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Release|x86.Build.0 = Release|Any CPU - {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|arm.ActiveCfg = Debug|Any CPU - {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|arm64.ActiveCfg = Debug|Any CPU - {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|x64.ActiveCfg = Debug|Any CPU - {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|x86.ActiveCfg = Debug|Any CPU + {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|arm.ActiveCfg = Debug|Any CPU + {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|arm64.ActiveCfg = Debug|Any CPU + {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|x64.ActiveCfg = Debug|Any CPU + {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|x86.ActiveCfg = Debug|Any CPU {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Debug|Any CPU.Build.0 = Debug|Any CPU {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2512,11 +2479,11 @@ Global {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Release|x64.Build.0 = Release|Any CPU {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Release|x86.ActiveCfg = Release|Any CPU {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Release|x86.Build.0 = Release|Any CPU - {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|arm.ActiveCfg = Debug|Any CPU - {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|arm64.ActiveCfg = Debug|Any CPU - {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|x64.ActiveCfg = Debug|Any CPU - {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|x86.ActiveCfg = Debug|Any CPU + {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|arm.ActiveCfg = Debug|Any CPU + {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|arm64.ActiveCfg = Debug|Any CPU + {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|x64.ActiveCfg = Debug|Any CPU + {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|x86.ActiveCfg = Debug|Any CPU {78C45C87-93B6-4FCE-B174-520756DE4E74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {78C45C87-93B6-4FCE-B174-520756DE4E74}.Debug|Any CPU.Build.0 = Debug|Any CPU {78C45C87-93B6-4FCE-B174-520756DE4E74}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2533,11 +2500,11 @@ Global {78C45C87-93B6-4FCE-B174-520756DE4E74}.Release|x64.Build.0 = Release|Any CPU {78C45C87-93B6-4FCE-B174-520756DE4E74}.Release|x86.ActiveCfg = Release|Any CPU {78C45C87-93B6-4FCE-B174-520756DE4E74}.Release|x86.Build.0 = Release|Any CPU - {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|arm.ActiveCfg = Debug|Any CPU - {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|arm64.ActiveCfg = Debug|Any CPU - {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|x64.ActiveCfg = Debug|Any CPU - {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|x86.ActiveCfg = Debug|Any CPU + {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|arm.ActiveCfg = Debug|Any CPU + {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|arm64.ActiveCfg = Debug|Any CPU + {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|x64.ActiveCfg = Debug|Any CPU + {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|x86.ActiveCfg = Debug|Any CPU {07197CBF-7C41-47B6-9E52-88A6D4485219}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {07197CBF-7C41-47B6-9E52-88A6D4485219}.Debug|Any CPU.Build.0 = Debug|Any CPU {07197CBF-7C41-47B6-9E52-88A6D4485219}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2554,11 +2521,11 @@ Global {07197CBF-7C41-47B6-9E52-88A6D4485219}.Release|x64.Build.0 = Release|Any CPU {07197CBF-7C41-47B6-9E52-88A6D4485219}.Release|x86.ActiveCfg = Release|Any CPU {07197CBF-7C41-47B6-9E52-88A6D4485219}.Release|x86.Build.0 = Release|Any CPU - {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|arm.ActiveCfg = Debug|Any CPU - {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|arm64.ActiveCfg = Debug|Any CPU - {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|x64.ActiveCfg = Debug|Any CPU - {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|x86.ActiveCfg = Debug|Any CPU + {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|arm.ActiveCfg = Debug|Any CPU + {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|x64.ActiveCfg = Debug|Any CPU + {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|x86.ActiveCfg = Debug|Any CPU {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2575,11 +2542,11 @@ Global {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Release|x64.Build.0 = Release|Any CPU {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Release|x86.ActiveCfg = Release|Any CPU {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Release|x86.Build.0 = Release|Any CPU - {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|arm.ActiveCfg = Debug|Any CPU - {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|x64.ActiveCfg = Debug|Any CPU - {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|x86.ActiveCfg = Debug|Any CPU + {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|arm.ActiveCfg = Debug|Any CPU + {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|x64.ActiveCfg = Debug|Any CPU + {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|x86.ActiveCfg = Debug|Any CPU {F6A8185B-07C6-401D-9B40-3C560239E05F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F6A8185B-07C6-401D-9B40-3C560239E05F}.Debug|Any CPU.Build.0 = Debug|Any CPU {F6A8185B-07C6-401D-9B40-3C560239E05F}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2596,11 +2563,11 @@ Global {F6A8185B-07C6-401D-9B40-3C560239E05F}.Release|x64.Build.0 = Release|Any CPU {F6A8185B-07C6-401D-9B40-3C560239E05F}.Release|x86.ActiveCfg = Release|Any CPU {F6A8185B-07C6-401D-9B40-3C560239E05F}.Release|x86.Build.0 = Release|Any CPU - {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|arm.ActiveCfg = Debug|Any CPU - {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|x64.ActiveCfg = Debug|Any CPU - {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|x86.ActiveCfg = Debug|Any CPU + {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|arm.ActiveCfg = Debug|Any CPU + {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|x64.ActiveCfg = Debug|Any CPU + {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|x86.ActiveCfg = Debug|Any CPU {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Debug|Any CPU.Build.0 = Debug|Any CPU {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2617,11 +2584,11 @@ Global {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Release|x64.Build.0 = Release|Any CPU {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Release|x86.ActiveCfg = Release|Any CPU {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Release|x86.Build.0 = Release|Any CPU - {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|arm.ActiveCfg = Debug|Any CPU - {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|x64.ActiveCfg = Debug|Any CPU - {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|x86.ActiveCfg = Debug|Any CPU + {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|arm.ActiveCfg = Debug|Any CPU + {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|arm64.ActiveCfg = Debug|Any CPU + {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|x64.ActiveCfg = Debug|Any CPU + {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|x86.ActiveCfg = Debug|Any CPU {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Debug|Any CPU.Build.0 = Debug|Any CPU {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2638,11 +2605,11 @@ Global {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Release|x64.Build.0 = Release|Any CPU {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Release|x86.ActiveCfg = Release|Any CPU {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Release|x86.Build.0 = Release|Any CPU - {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|arm.ActiveCfg = Debug|Any CPU - {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|arm64.ActiveCfg = Debug|Any CPU - {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|x64.ActiveCfg = Debug|Any CPU - {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|x86.ActiveCfg = Debug|Any CPU + {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|arm.ActiveCfg = Debug|Any CPU + {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|arm64.ActiveCfg = Debug|Any CPU + {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|x64.ActiveCfg = Debug|Any CPU + {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|x86.ActiveCfg = Debug|Any CPU {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2659,11 +2626,11 @@ Global {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Release|x64.Build.0 = Release|Any CPU {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Release|x86.ActiveCfg = Release|Any CPU {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Release|x86.Build.0 = Release|Any CPU - {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|arm.ActiveCfg = Debug|Any CPU - {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|arm64.ActiveCfg = Debug|Any CPU - {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|x64.ActiveCfg = Debug|Any CPU - {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|x86.ActiveCfg = Debug|Any CPU + {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|arm.ActiveCfg = Debug|Any CPU + {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|arm64.ActiveCfg = Debug|Any CPU + {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|x64.ActiveCfg = Debug|Any CPU + {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|x86.ActiveCfg = Debug|Any CPU {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Debug|Any CPU.Build.0 = Debug|Any CPU {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2680,11 +2647,11 @@ Global {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Release|x64.Build.0 = Release|Any CPU {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Release|x86.ActiveCfg = Release|Any CPU {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Release|x86.Build.0 = Release|Any CPU - {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|arm.ActiveCfg = Debug|Any CPU - {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|arm64.ActiveCfg = Debug|Any CPU - {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|x64.ActiveCfg = Debug|Any CPU - {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|x86.ActiveCfg = Debug|Any CPU + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|arm.ActiveCfg = Debug|Any CPU + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|x64.ActiveCfg = Debug|Any CPU + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|x86.ActiveCfg = Debug|Any CPU {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Debug|Any CPU.Build.0 = Debug|Any CPU {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2701,11 +2668,11 @@ Global {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Release|x64.Build.0 = Release|Any CPU {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Release|x86.ActiveCfg = Release|Any CPU {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Release|x86.Build.0 = Release|Any CPU - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|arm.ActiveCfg = Debug|Any CPU - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|x64.ActiveCfg = Debug|Any CPU - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|x86.ActiveCfg = Debug|Any CPU + {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|arm.ActiveCfg = Debug|Any CPU + {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|arm64.ActiveCfg = Debug|Any CPU + {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|x64.ActiveCfg = Debug|Any CPU + {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|x86.ActiveCfg = Debug|Any CPU {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Debug|Any CPU.Build.0 = Debug|Any CPU {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2722,11 +2689,11 @@ Global {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Release|x64.Build.0 = Release|Any CPU {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Release|x86.ActiveCfg = Release|Any CPU {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Release|x86.Build.0 = Release|Any CPU - {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|arm.ActiveCfg = Debug|Any CPU - {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|arm64.ActiveCfg = Debug|Any CPU - {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|x64.ActiveCfg = Debug|Any CPU - {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|x86.ActiveCfg = Debug|Any CPU + {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|arm.ActiveCfg = Debug|Any CPU + {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|arm64.ActiveCfg = Debug|Any CPU + {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|x64.ActiveCfg = Debug|Any CPU + {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|x86.ActiveCfg = Debug|Any CPU {50F1165C-5F71-472C-B317-35FFC14665EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {50F1165C-5F71-472C-B317-35FFC14665EA}.Debug|Any CPU.Build.0 = Debug|Any CPU {50F1165C-5F71-472C-B317-35FFC14665EA}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2743,11 +2710,11 @@ Global {50F1165C-5F71-472C-B317-35FFC14665EA}.Release|x64.Build.0 = Release|Any CPU {50F1165C-5F71-472C-B317-35FFC14665EA}.Release|x86.ActiveCfg = Release|Any CPU {50F1165C-5F71-472C-B317-35FFC14665EA}.Release|x86.Build.0 = Release|Any CPU - {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|arm.ActiveCfg = Debug|Any CPU - {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|arm64.ActiveCfg = Debug|Any CPU - {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|x64.ActiveCfg = Debug|Any CPU - {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|x86.ActiveCfg = Debug|Any CPU + {82728202-1098-4E16-B598-5762EAF67D08}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {82728202-1098-4E16-B598-5762EAF67D08}.Checked|arm.ActiveCfg = Debug|Any CPU + {82728202-1098-4E16-B598-5762EAF67D08}.Checked|arm64.ActiveCfg = Debug|Any CPU + {82728202-1098-4E16-B598-5762EAF67D08}.Checked|x64.ActiveCfg = Debug|Any CPU + {82728202-1098-4E16-B598-5762EAF67D08}.Checked|x86.ActiveCfg = Debug|Any CPU {82728202-1098-4E16-B598-5762EAF67D08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {82728202-1098-4E16-B598-5762EAF67D08}.Debug|Any CPU.Build.0 = Debug|Any CPU {82728202-1098-4E16-B598-5762EAF67D08}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2764,11 +2731,11 @@ Global {82728202-1098-4E16-B598-5762EAF67D08}.Release|x64.Build.0 = Release|Any CPU {82728202-1098-4E16-B598-5762EAF67D08}.Release|x86.ActiveCfg = Release|Any CPU {82728202-1098-4E16-B598-5762EAF67D08}.Release|x86.Build.0 = Release|Any CPU - {82728202-1098-4E16-B598-5762EAF67D08}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {82728202-1098-4E16-B598-5762EAF67D08}.Checked|arm.ActiveCfg = Debug|Any CPU - {82728202-1098-4E16-B598-5762EAF67D08}.Checked|arm64.ActiveCfg = Debug|Any CPU - {82728202-1098-4E16-B598-5762EAF67D08}.Checked|x64.ActiveCfg = Debug|Any CPU - {82728202-1098-4E16-B598-5762EAF67D08}.Checked|x86.ActiveCfg = Debug|Any CPU + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|arm.ActiveCfg = Debug|Any CPU + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|arm64.ActiveCfg = Debug|Any CPU + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|x64.ActiveCfg = Debug|Any CPU + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|x86.ActiveCfg = Debug|Any CPU {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Debug|Any CPU.Build.0 = Debug|Any CPU {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2785,11 +2752,11 @@ Global {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Release|x64.Build.0 = Release|Any CPU {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Release|x86.ActiveCfg = Release|Any CPU {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Release|x86.Build.0 = Release|Any CPU - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|arm.ActiveCfg = Debug|Any CPU - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|arm64.ActiveCfg = Debug|Any CPU - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|x64.ActiveCfg = Debug|Any CPU - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|x86.ActiveCfg = Debug|Any CPU + {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|arm.ActiveCfg = Debug|Any CPU + {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|x64.ActiveCfg = Debug|Any CPU + {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|x86.ActiveCfg = Debug|Any CPU {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Debug|Any CPU.Build.0 = Debug|Any CPU {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2806,11 +2773,11 @@ Global {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Release|x64.Build.0 = Release|Any CPU {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Release|x86.ActiveCfg = Release|Any CPU {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Release|x86.Build.0 = Release|Any CPU - {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|arm.ActiveCfg = Debug|Any CPU - {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|x64.ActiveCfg = Debug|Any CPU - {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|x86.ActiveCfg = Debug|Any CPU + {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|arm.ActiveCfg = Debug|Any CPU + {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|x64.ActiveCfg = Debug|Any CPU + {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|x86.ActiveCfg = Debug|Any CPU {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Debug|Any CPU.Build.0 = Debug|Any CPU {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2827,11 +2794,11 @@ Global {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Release|x64.Build.0 = Release|Any CPU {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Release|x86.ActiveCfg = Release|Any CPU {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Release|x86.Build.0 = Release|Any CPU - {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|arm.ActiveCfg = Debug|Any CPU - {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|x64.ActiveCfg = Debug|Any CPU - {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|x86.ActiveCfg = Debug|Any CPU + {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|arm.ActiveCfg = Debug|Any CPU + {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|x64.ActiveCfg = Debug|Any CPU + {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|x86.ActiveCfg = Debug|Any CPU {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Debug|Any CPU.Build.0 = Debug|Any CPU {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2848,11 +2815,11 @@ Global {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Release|x64.Build.0 = Release|Any CPU {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Release|x86.ActiveCfg = Release|Any CPU {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Release|x86.Build.0 = Release|Any CPU - {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|arm.ActiveCfg = Debug|Any CPU - {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|x64.ActiveCfg = Debug|Any CPU - {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|x86.ActiveCfg = Debug|Any CPU + {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|arm.ActiveCfg = Debug|Any CPU + {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|arm64.ActiveCfg = Debug|Any CPU + {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|x64.ActiveCfg = Debug|Any CPU + {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|x86.ActiveCfg = Debug|Any CPU {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Debug|Any CPU.Build.0 = Debug|Any CPU {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2869,11 +2836,11 @@ Global {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Release|x64.Build.0 = Release|Any CPU {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Release|x86.ActiveCfg = Release|Any CPU {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Release|x86.Build.0 = Release|Any CPU - {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|arm.ActiveCfg = Debug|Any CPU - {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|arm64.ActiveCfg = Debug|Any CPU - {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|x64.ActiveCfg = Debug|Any CPU - {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|x86.ActiveCfg = Debug|Any CPU + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|arm.ActiveCfg = Debug|Any CPU + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|arm64.ActiveCfg = Debug|Any CPU + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|x64.ActiveCfg = Debug|Any CPU + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|x86.ActiveCfg = Debug|Any CPU {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Debug|Any CPU.Build.0 = Debug|Any CPU {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2890,69 +2857,67 @@ Global {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Release|x64.Build.0 = Release|Any CPU {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Release|x86.ActiveCfg = Release|Any CPU {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Release|x86.Build.0 = Release|Any CPU - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|arm.ActiveCfg = Debug|Any CPU - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|arm64.ActiveCfg = Debug|Any CPU - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|x64.ActiveCfg = Debug|Any CPU - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|x86.ActiveCfg = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {71AB8240-F179-4B21-A8BE-8BE6CD774ED9} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {F86D6534-1A96-489E-A807-C14E616686D6} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {FB17AC52-1633-4845-932B-9218DF895957} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {21791340-49C4-4C07-97FD-CAA1B72D3256} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {5719BF19-2F1E-4ECC-9285-8DE445D23F5F} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {86CF47B3-D607-4F59-896F-982FEA116086} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {484B12B8-F027-4960-BAA9-14D646C80A28} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {D16B3A49-5709-44CB-B6F8-8E3D585D236F} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {F0BB4F76-7697-49A8-8204-FD4516EB325C} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {B876CC90-CB87-4B1B-B6F5-247990192578} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {999B1A08-2C7F-43AD-BC50-5F950320BBFF} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {53EFB849-6776-4316-B631-5B5F0D9624E6} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {019A13D1-3493-4024-8223-FCB6763F80B4} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {9ECF9E5C-860F-49C3-95D0-501147F19548} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {8F97C1DE-07F7-449F-AA22-84A6D6836D82} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {B11DD674-FFF7-4343-BA1B-F4C788B16DDA} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {3C01DB47-20B0-40E0-AB7C-A5611345AC44} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3} = {13818769-DC01-4715-9590-E000D03E42A9} + {E64D31D0-8F38-4FDF-B60D-F955D2475566} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {91D01772-0D5A-451F-A56C-56FBB0961ED8} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {4367BB9C-7EC2-4238-82E2-643DE24CC23E} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {F977B04F-675C-4B78-8FCE-19D70504166D} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {379BC6E6-1900-44F8-8D8C-AA2968A70008} = {13818769-DC01-4715-9590-E000D03E42A9} + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590} = {13818769-DC01-4715-9590-E000D03E42A9} + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9} = {13818769-DC01-4715-9590-E000D03E42A9} + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37} = {13818769-DC01-4715-9590-E000D03E42A9} + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {A83A8520-F5E2-49B4-83BC-0F82A412951D} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {F6A8185B-07C6-401D-9B40-3C560239E05F} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {8C0E3201-1F0E-45A0-9897-A679C0C4F684} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {50F1165C-5F71-472C-B317-35FFC14665EA} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {A3873DDB-47E7-4DB6-872C-4B46A779913A} = {49849A80-4C86-4DBD-A138-B98A07BFA4F8} - {49849A80-4C86-4DBD-A138-B98A07BFA4F8} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {23D41678-453F-4F2A-85F1-167E63DA6D67} = {FA882920-3BC3-4FB7-BA9A-263CE3E4F8D9} - {FA882920-3BC3-4FB7-BA9A-263CE3E4F8D9} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {6790611D-ACE0-47C6-83E0-E404364B5210} = {F283372A-5CA9-40D8-BA0D-5C65060F7D7F} - {F283372A-5CA9-40D8-BA0D-5C65060F7D7F} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9} = {329E1643-B54D-4A88-9E96-716709AB931B} - {329E1643-B54D-4A88-9E96-716709AB931B} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {B73090B8-20CB-4586-A586-B7F37C1A06FF} = {7750E8BA-A054-4176-971B-FA3B4A9ECF23} - {4C1F2761-857C-40A4-8CDD-7139380DA4D7} = {7750E8BA-A054-4176-971B-FA3B4A9ECF23} {70441C80-1F14-42F9-8225-A891E3C9A82A} = {7750E8BA-A054-4176-971B-FA3B4A9ECF23} {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6} = {7750E8BA-A054-4176-971B-FA3B4A9ECF23} - {7750E8BA-A054-4176-971B-FA3B4A9ECF23} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {1C44735B-C77E-479A-ABBB-8B6EB83299CF} = {A1C3A699-4772-45AC-BED4-F0D6E8282EDB} {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531} = {A1C3A699-4772-45AC-BED4-F0D6E8282EDB} {CA97D5F2-4D71-4448-8DEB-E18C237C76B3} = {A1C3A699-4772-45AC-BED4-F0D6E8282EDB} - {A1C3A699-4772-45AC-BED4-F0D6E8282EDB} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {988AECC5-6EB4-48AB-9467-3FB63619631B} = {FC0E8825-6D78-47C9-9758-59D61AD38895} - {C5F86889-E147-4424-9165-D2DF453741F2} = {FC0E8825-6D78-47C9-9758-59D61AD38895} {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E} = {FC0E8825-6D78-47C9-9758-59D61AD38895} {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12} = {FC0E8825-6D78-47C9-9758-59D61AD38895} {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9} = {FC0E8825-6D78-47C9-9758-59D61AD38895} {32247916-74DE-4A62-AE68-04976D2B0149} = {FC0E8825-6D78-47C9-9758-59D61AD38895} {5090E2BE-4BC9-4027-BF67-452049996F43} = {FC0E8825-6D78-47C9-9758-59D61AD38895} - {FC0E8825-6D78-47C9-9758-59D61AD38895} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {61164A2A-D90F-4122-AF5D-9704564E80E0} = {1131BBB2-AEBC-4020-9643-59C8EA73E848} - {1131BBB2-AEBC-4020-9643-59C8EA73E848} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6} = {5B928A02-3C49-4E29-8C05-E9AEF0E4F39A} {652F0921-C134-4882-A9D0-0CBB2F8D75B2} = {5B928A02-3C49-4E29-8C05-E9AEF0E4F39A} {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016} = {5B928A02-3C49-4E29-8C05-E9AEF0E4F39A} - {5B928A02-3C49-4E29-8C05-E9AEF0E4F39A} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {CFC724F4-18A2-401F-AED4-7D7A779CE3EA} = {B5010729-BAD4-418F-B801-CEECF4890CB2} - {B5010729-BAD4-418F-B801-CEECF4890CB2} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B} = {159EA645-58B0-447C-90BC-FF6AC3BBEEF1} - {159EA645-58B0-447C-90BC-FF6AC3BBEEF1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {E73952E5-C929-4566-962A-B9AF65289871} = {6FC63FB9-025D-4821-A346-CF3B34788331} {9299BE78-5A00-425A-A38F-7F1DC9C3F63E} = {6FC63FB9-025D-4821-A346-CF3B34788331} {A6D86695-D570-43F9-99A3-6C7445362D53} = {6FC63FB9-025D-4821-A346-CF3B34788331} @@ -2973,24 +2938,17 @@ Global {049319F0-D438-404C-A6D4-4D1E99DAE647} = {6FC63FB9-025D-4821-A346-CF3B34788331} {691D460F-764F-48E7-9A3F-7D1A32388542} = {6FC63FB9-025D-4821-A346-CF3B34788331} {9F1AC402-BFAD-4EA2-AD31-BBCA73375953} = {6FC63FB9-025D-4821-A346-CF3B34788331} - {6FC63FB9-025D-4821-A346-CF3B34788331} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1} = {C5CD099F-649E-4464-BBD9-1F0A9FE7C311} - {C5CD099F-649E-4464-BBD9-1F0A9FE7C311} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C} = {685D170C-E2BF-413A-A506-B09AF1E71DC1} - {685D170C-E2BF-413A-A506-B09AF1E71DC1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {E88FDBA9-3D1D-480D-8AB3-341C9E442D03} = {EC6D590E-2278-4E86-B1B0-E6900D0F31BD} - {EC6D590E-2278-4E86-B1B0-E6900D0F31BD} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {AD4767E9-57F6-47DD-ABD3-D3AFDF384703} = {2655BE48-E889-4354-9499-4CCC6DA9F378} {E1847313-0072-49CA-A1E6-6C05CECAB77A} = {2655BE48-E889-4354-9499-4CCC6DA9F378} {D86CC877-79A0-4AFA-9A76-7263B414614D} = {2655BE48-E889-4354-9499-4CCC6DA9F378} {E5E5C278-EBB9-4704-B7BA-56D39A5A343C} = {2655BE48-E889-4354-9499-4CCC6DA9F378} {59CD73F2-1310-46EE-B99A-594859FD8A37} = {2655BE48-E889-4354-9499-4CCC6DA9F378} {3D58505D-F17F-49E0-9131-42F273E3F5B9} = {2655BE48-E889-4354-9499-4CCC6DA9F378} - {2655BE48-E889-4354-9499-4CCC6DA9F378} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {0BF9F165-888D-486A-B6FD-6F3029913D70} = {174A9FAB-F46D-49A9-AC69-0FF55ACDE4F7} - {174A9FAB-F46D-49A9-AC69-0FF55ACDE4F7} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {C485C170-2B88-4EA9-8826-7BC4C9BA2324} = {CE6BCA93-D862-4435-8FEB-07A98DD43655} - {CE6BCA93-D862-4435-8FEB-07A98DD43655} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {43C40A0B-0B0E-4D27-8534-11CD5A540F7C} = {71C519F0-621A-413B-B262-A5106C2CCA64} {3B79DD71-8C2F-41BC-A1A7-86A490D6C726} = {71C519F0-621A-413B-B262-A5106C2CCA64} {4EE36055-AD7C-4779-B3F6-08687960DCC3} = {71C519F0-621A-413B-B262-A5106C2CCA64} @@ -3000,58 +2958,65 @@ Global {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC} = {71C519F0-621A-413B-B262-A5106C2CCA64} {0F83B07B-2E3F-4708-BE6D-7A8DA8168803} = {71C519F0-621A-413B-B262-A5106C2CCA64} {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD} = {71C519F0-621A-413B-B262-A5106C2CCA64} - {71C519F0-621A-413B-B262-A5106C2CCA64} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B} = {FC75126D-0CBD-4927-A91D-BAF04DF8EC13} - {FC75126D-0CBD-4927-A91D-BAF04DF8EC13} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {697C63A2-2517-4F85-8B88-C94E538BE407} = {32160B7C-7125-48FD-8ECE-9E542D321FB1} - {32160B7C-7125-48FD-8ECE-9E542D321FB1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19} = {69F454E3-4E56-42BD-957A-E20E15CBB1A8} - {69F454E3-4E56-42BD-957A-E20E15CBB1A8} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {172F6EB9-6001-4657-8AE2-83DB23B371CA} = {6DE592D4-860B-4C5E-86A4-741BFAD8CEF3} - {6DE592D4-860B-4C5E-86A4-741BFAD8CEF3} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {7E3B4C81-9010-4473-BD3C-5B90F9533CD7} = {ADE0FF1A-EF61-4D71-9E61-DC5656DC7943} - {ADE0FF1A-EF61-4D71-9E61-DC5656DC7943} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {BBC59E42-DC0B-4847-B336-13ACF4279F17} = {377FD142-D005-4CC6-9CE4-66AE72E9DF84} - {377FD142-D005-4CC6-9CE4-66AE72E9DF84} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {F86D6534-1A96-489E-A807-C14E616686D6} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {FB17AC52-1633-4845-932B-9218DF895957} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {86CF47B3-D607-4F59-896F-982FEA116086} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {484B12B8-F027-4960-BAA9-14D646C80A28} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {F0BB4F76-7697-49A8-8204-FD4516EB325C} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {019A13D1-3493-4024-8223-FCB6763F80B4} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {8F97C1DE-07F7-449F-AA22-84A6D6836D82} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {3C01DB47-20B0-40E0-AB7C-A5611345AC44} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {E64D31D0-8F38-4FDF-B60D-F955D2475566} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {4367BB9C-7EC2-4238-82E2-643DE24CC23E} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {78C45C87-93B6-4FCE-B174-520756DE4E74} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {07197CBF-7C41-47B6-9E52-88A6D4485219} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {F6A8185B-07C6-401D-9B40-3C560239E05F} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {1E6C7D88-7584-444C-97CD-2FAAB5BEF465} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {12E1EFEA-60DE-41D7-B148-AB0182594C1B} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {8C0E3201-1F0E-45A0-9897-A679C0C4F684} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {25E8AB9D-2D10-44F5-9F83-5A5134526771} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {50F1165C-5F71-472C-B317-35FFC14665EA} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {82728202-1098-4E16-B598-5762EAF67D08} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3} = {13818769-DC01-4715-9590-E000D03E42A9} - {379BC6E6-1900-44F8-8D8C-AA2968A70008} = {13818769-DC01-4715-9590-E000D03E42A9} - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590} = {13818769-DC01-4715-9590-E000D03E42A9} - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9} = {13818769-DC01-4715-9590-E000D03E42A9} - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37} = {13818769-DC01-4715-9590-E000D03E42A9} + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {CFAB1236-51C3-4A13-A57F-16022FD0A7EE} = {28FBA7EA-0592-4446-82F2-2E9819684236} {4CBDF585-FD15-44E9-9795-1BED79BC4960} = {28FBA7EA-0592-4446-82F2-2E9819684236} - {28FBA7EA-0592-4446-82F2-2E9819684236} = {67DCB1C2-0B95-40B6-ACE8-9812BF57EB19} {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8} = {866503B5-5CD2-438C-A125-B947A2F38D34} {AF7CC240-B4D5-4C37-9B04-473CBCC52330} = {866503B5-5CD2-438C-A125-B947A2F38D34} - {866503B5-5CD2-438C-A125-B947A2F38D34} = {67DCB1C2-0B95-40B6-ACE8-9812BF57EB19} {3F5ABC5D-42DE-44C4-BEFC-741F4974C744} = {978D3888-2C89-41B7-BC09-33A4E49A6A00} + {49849A80-4C86-4DBD-A138-B98A07BFA4F8} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {FA882920-3BC3-4FB7-BA9A-263CE3E4F8D9} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {F283372A-5CA9-40D8-BA0D-5C65060F7D7F} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {329E1643-B54D-4A88-9E96-716709AB931B} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {7750E8BA-A054-4176-971B-FA3B4A9ECF23} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {A1C3A699-4772-45AC-BED4-F0D6E8282EDB} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {FC0E8825-6D78-47C9-9758-59D61AD38895} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {1131BBB2-AEBC-4020-9643-59C8EA73E848} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {5B928A02-3C49-4E29-8C05-E9AEF0E4F39A} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {B5010729-BAD4-418F-B801-CEECF4890CB2} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {159EA645-58B0-447C-90BC-FF6AC3BBEEF1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {6FC63FB9-025D-4821-A346-CF3B34788331} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {C5CD099F-649E-4464-BBD9-1F0A9FE7C311} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {685D170C-E2BF-413A-A506-B09AF1E71DC1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {EC6D590E-2278-4E86-B1B0-E6900D0F31BD} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {2655BE48-E889-4354-9499-4CCC6DA9F378} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {174A9FAB-F46D-49A9-AC69-0FF55ACDE4F7} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {CE6BCA93-D862-4435-8FEB-07A98DD43655} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {71C519F0-621A-413B-B262-A5106C2CCA64} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {FC75126D-0CBD-4927-A91D-BAF04DF8EC13} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {32160B7C-7125-48FD-8ECE-9E542D321FB1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {69F454E3-4E56-42BD-957A-E20E15CBB1A8} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {6DE592D4-860B-4C5E-86A4-741BFAD8CEF3} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {ADE0FF1A-EF61-4D71-9E61-DC5656DC7943} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {377FD142-D005-4CC6-9CE4-66AE72E9DF84} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {28FBA7EA-0592-4446-82F2-2E9819684236} = {67DCB1C2-0B95-40B6-ACE8-9812BF57EB19} + {866503B5-5CD2-438C-A125-B947A2F38D34} = {67DCB1C2-0B95-40B6-ACE8-9812BF57EB19} {978D3888-2C89-41B7-BC09-33A4E49A6A00} = {67DCB1C2-0B95-40B6-ACE8-9812BF57EB19} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {19706846-1F47-42ED-B649-B0982EE96E6B} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{4cbdf585-fd15-44e9-9795-1bed79bc4960}*SharedItemsImports = 5 + ..\System.Private.CoreLib\src\System.Private.CoreLib.Shared.projitems*{71ab8240-f179-4b21-a8be-8be6cd774ed9}*SharedItemsImports = 5 + ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{af7cc240-b4d5-4c37-9b04-473cbcc52330}*SharedItemsImports = 5 + EndGlobalSection EndGlobal From a585d3192804785c680603999d161269d27c0963 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Thu, 13 Feb 2025 10:42:37 -0600 Subject: [PATCH 24/24] Undo .sln changes; rename a variable --- .../System/Reflection/InvokeSignatureInfo.cs | 14 +- .../System.Reflection.Emit.sln | 361 ++-- .../System.Runtime/System.Runtime.sln | 1453 +++++++++-------- 3 files changed, 927 insertions(+), 901 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs index ba68160e063261..fae9ed9b490dee 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/InvokeSignatureInfo.cs @@ -114,19 +114,19 @@ public InvokeSignatureInfoKey(Type? declaringType, Type[] parameterTypes, Type r public Type ReturnType => _returnType; public bool IsStatic => _isStatic; - public static bool AlternativeEquals(in InvokeSignatureInfoKey @this, InvokeSignatureInfo signatureInfo) + public static bool AlternativeEquals(in InvokeSignatureInfoKey key, InvokeSignatureInfo signatureInfo) { - if (!ReferenceEquals(@this._declaringType, signatureInfo._declaringType) || - !ReferenceEquals(@this._returnType, signatureInfo._returnType) || - @this._isStatic != signatureInfo._isStatic || - @this._parameterTypes.Length != signatureInfo._parameterTypes.Length) + if (!ReferenceEquals(key._declaringType, signatureInfo._declaringType) || + !ReferenceEquals(key._returnType, signatureInfo._returnType) || + key._isStatic != signatureInfo._isStatic || + key._parameterTypes.Length != signatureInfo._parameterTypes.Length) { return false; } - for (int i = 0; i < @this._parameterTypes.Length; i++) + for (int i = 0; i < key._parameterTypes.Length; i++) { - if (!ReferenceEquals(@this._parameterTypes[i], signatureInfo._parameterTypes[i])) + if (!ReferenceEquals(key._parameterTypes[i], signatureInfo._parameterTypes[i])) { return false; } diff --git a/src/libraries/System.Reflection.Emit/System.Reflection.Emit.sln b/src/libraries/System.Reflection.Emit/System.Reflection.Emit.sln index 3aa057ce45ef16..793b25bee5c900 100644 --- a/src/libraries/System.Reflection.Emit/System.Reflection.Emit.sln +++ b/src/libraries/System.Reflection.Emit/System.Reflection.Emit.sln @@ -1,8 +1,4 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.13.35617.110 d17.13 -MinimumVisualStudioVersion = 10.0.40219.1 +Microsoft Visual Studio Solution File, Format Version 12.00 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Private.CoreLib", "..\..\coreclr\System.Private.CoreLib\System.Private.CoreLib.csproj", "{772C93D4-FC45-46AA-B09F-26F01B672EDC}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestUtilities", "..\Common\tests\TestUtilities\TestUtilities.csproj", "{E5543842-139D-43BD-B604-E65EBB91649E}" @@ -71,21 +67,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{C36D185D-9B3 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{611CB559-49A7-4046-9425-50E25205E891}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "tools\gen", "{611CB559-49A7-4046-9425-50E25205E891}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{59251F20-422C-41BC-9C0E-4517B5C2018D}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "tools\src", "{59251F20-422C-41BC-9C0E-4517B5C2018D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{AA8FF9D5-BB95-481B-A56A-E8FAF9725F97}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "tools\ref", "{AA8FF9D5-BB95-481B-A56A-E8FAF9725F97}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{A3402532-58BD-4AB1-870F-CFD829CEAD18}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Checked|Any CPU = Checked|Any CPU - Checked|arm = Checked|arm - Checked|arm64 = Checked|arm64 - Checked|x64 = Checked|x64 - Checked|x86 = Checked|x86 Debug|Any CPU = Debug|Any CPU Debug|arm = Debug|arm Debug|arm64 = Debug|arm64 @@ -96,18 +87,13 @@ Global Release|arm64 = Release|arm64 Release|x64 = Release|x64 Release|x86 = Release|x86 + Checked|Any CPU = Checked|Any CPU + Checked|arm = Checked|arm + Checked|arm64 = Checked|arm64 + Checked|x64 = Checked|x64 + Checked|x86 = Checked|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|Any CPU.ActiveCfg = Checked|x64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|Any CPU.Build.0 = Checked|x64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm.ActiveCfg = Checked|arm - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm.Build.0 = Checked|arm - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm64.ActiveCfg = Checked|arm64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm64.Build.0 = Checked|arm64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x64.ActiveCfg = Checked|x64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x64.Build.0 = Checked|x64 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x86.ActiveCfg = Checked|x86 - {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x86.Build.0 = Checked|x86 {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Debug|Any CPU.ActiveCfg = Debug|x64 {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Debug|Any CPU.Build.0 = Debug|x64 {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Debug|arm.ActiveCfg = Debug|arm @@ -128,11 +114,16 @@ Global {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Release|x64.Build.0 = Release|x64 {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Release|x86.ActiveCfg = Release|x86 {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Release|x86.Build.0 = Release|x86 - {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|arm.ActiveCfg = Debug|Any CPU - {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|x64.ActiveCfg = Debug|Any CPU - {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|x86.ActiveCfg = Debug|Any CPU + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|Any CPU.ActiveCfg = Checked|x64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|Any CPU.Build.0 = Checked|x64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm.ActiveCfg = Checked|arm + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm.Build.0 = Checked|arm + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm64.ActiveCfg = Checked|arm64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|arm64.Build.0 = Checked|arm64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x64.ActiveCfg = Checked|x64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x64.Build.0 = Checked|x64 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x86.ActiveCfg = Checked|x86 + {772C93D4-FC45-46AA-B09F-26F01B672EDC}.Checked|x86.Build.0 = Checked|x86 {E5543842-139D-43BD-B604-E65EBB91649E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E5543842-139D-43BD-B604-E65EBB91649E}.Debug|Any CPU.Build.0 = Debug|Any CPU {E5543842-139D-43BD-B604-E65EBB91649E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -149,11 +140,11 @@ Global {E5543842-139D-43BD-B604-E65EBB91649E}.Release|x64.Build.0 = Release|Any CPU {E5543842-139D-43BD-B604-E65EBB91649E}.Release|x86.ActiveCfg = Release|Any CPU {E5543842-139D-43BD-B604-E65EBB91649E}.Release|x86.Build.0 = Release|Any CPU - {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|arm.ActiveCfg = Debug|Any CPU - {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|arm64.ActiveCfg = Debug|Any CPU - {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|x64.ActiveCfg = Debug|Any CPU - {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|x86.ActiveCfg = Debug|Any CPU + {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|arm.ActiveCfg = Debug|Any CPU + {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|x64.ActiveCfg = Debug|Any CPU + {E5543842-139D-43BD-B604-E65EBB91649E}.Checked|x86.ActiveCfg = Debug|Any CPU {DE04D45B-7E15-409D-A176-985D814A6AEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DE04D45B-7E15-409D-A176-985D814A6AEB}.Debug|Any CPU.Build.0 = Debug|Any CPU {DE04D45B-7E15-409D-A176-985D814A6AEB}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -170,11 +161,11 @@ Global {DE04D45B-7E15-409D-A176-985D814A6AEB}.Release|x64.Build.0 = Release|Any CPU {DE04D45B-7E15-409D-A176-985D814A6AEB}.Release|x86.ActiveCfg = Release|Any CPU {DE04D45B-7E15-409D-A176-985D814A6AEB}.Release|x86.Build.0 = Release|Any CPU - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|arm.ActiveCfg = Debug|Any CPU - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|x64.ActiveCfg = Debug|Any CPU - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|x86.ActiveCfg = Debug|Any CPU + {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|arm.ActiveCfg = Debug|Any CPU + {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|arm64.ActiveCfg = Debug|Any CPU + {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|x64.ActiveCfg = Debug|Any CPU + {DE04D45B-7E15-409D-A176-985D814A6AEB}.Checked|x86.ActiveCfg = Debug|Any CPU {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Debug|Any CPU.Build.0 = Debug|Any CPU {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -191,11 +182,11 @@ Global {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Release|x64.Build.0 = Release|Any CPU {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Release|x86.ActiveCfg = Release|Any CPU {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Release|x86.Build.0 = Release|Any CPU - {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|arm.ActiveCfg = Debug|Any CPU - {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|x64.ActiveCfg = Debug|Any CPU - {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|x86.ActiveCfg = Debug|Any CPU + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|arm.ActiveCfg = Debug|Any CPU + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|x64.ActiveCfg = Debug|Any CPU + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40}.Checked|x86.ActiveCfg = Debug|Any CPU {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Debug|Any CPU.Build.0 = Debug|Any CPU {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -212,11 +203,11 @@ Global {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Release|x64.Build.0 = Release|Any CPU {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Release|x86.ActiveCfg = Release|Any CPU {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Release|x86.Build.0 = Release|Any CPU - {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|arm.ActiveCfg = Debug|Any CPU - {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|arm64.ActiveCfg = Debug|Any CPU - {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|x64.ActiveCfg = Debug|Any CPU - {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|x86.ActiveCfg = Debug|Any CPU + {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|arm.ActiveCfg = Debug|Any CPU + {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|x64.ActiveCfg = Debug|Any CPU + {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D}.Checked|x86.ActiveCfg = Debug|Any CPU {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Debug|Any CPU.Build.0 = Debug|Any CPU {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -233,11 +224,11 @@ Global {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Release|x64.Build.0 = Release|Any CPU {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Release|x86.ActiveCfg = Release|Any CPU {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Release|x86.Build.0 = Release|Any CPU - {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|arm.ActiveCfg = Debug|Any CPU - {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|arm64.ActiveCfg = Debug|Any CPU - {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|x64.ActiveCfg = Debug|Any CPU - {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|x86.ActiveCfg = Debug|Any CPU + {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|arm.ActiveCfg = Debug|Any CPU + {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|arm64.ActiveCfg = Debug|Any CPU + {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|x64.ActiveCfg = Debug|Any CPU + {62BB75B8-691F-4416-B162-16CB3DE04BBB}.Checked|x86.ActiveCfg = Debug|Any CPU {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Debug|Any CPU.Build.0 = Debug|Any CPU {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -254,11 +245,11 @@ Global {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Release|x64.Build.0 = Release|Any CPU {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Release|x86.ActiveCfg = Release|Any CPU {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Release|x86.Build.0 = Release|Any CPU - {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|arm.ActiveCfg = Debug|Any CPU - {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|x64.ActiveCfg = Debug|Any CPU - {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|x86.ActiveCfg = Debug|Any CPU + {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|arm.ActiveCfg = Debug|Any CPU + {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|arm64.ActiveCfg = Debug|Any CPU + {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|x64.ActiveCfg = Debug|Any CPU + {848EFB55-86B5-4259-BAA2-A49C6E3421A9}.Checked|x86.ActiveCfg = Debug|Any CPU {C5EC183F-7276-43DB-9916-E861AEC47418}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C5EC183F-7276-43DB-9916-E861AEC47418}.Debug|Any CPU.Build.0 = Debug|Any CPU {C5EC183F-7276-43DB-9916-E861AEC47418}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -275,11 +266,11 @@ Global {C5EC183F-7276-43DB-9916-E861AEC47418}.Release|x64.Build.0 = Release|Any CPU {C5EC183F-7276-43DB-9916-E861AEC47418}.Release|x86.ActiveCfg = Release|Any CPU {C5EC183F-7276-43DB-9916-E861AEC47418}.Release|x86.Build.0 = Release|Any CPU - {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|arm.ActiveCfg = Debug|Any CPU - {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|x64.ActiveCfg = Debug|Any CPU - {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|x86.ActiveCfg = Debug|Any CPU + {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|arm.ActiveCfg = Debug|Any CPU + {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|x64.ActiveCfg = Debug|Any CPU + {C5EC183F-7276-43DB-9916-E861AEC47418}.Checked|x86.ActiveCfg = Debug|Any CPU {D5FD16CF-7435-4E47-928A-9BC94968091D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5FD16CF-7435-4E47-928A-9BC94968091D}.Debug|Any CPU.Build.0 = Debug|Any CPU {D5FD16CF-7435-4E47-928A-9BC94968091D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -296,11 +287,11 @@ Global {D5FD16CF-7435-4E47-928A-9BC94968091D}.Release|x64.Build.0 = Release|Any CPU {D5FD16CF-7435-4E47-928A-9BC94968091D}.Release|x86.ActiveCfg = Release|Any CPU {D5FD16CF-7435-4E47-928A-9BC94968091D}.Release|x86.Build.0 = Release|Any CPU - {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|arm.ActiveCfg = Debug|Any CPU - {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|arm64.ActiveCfg = Debug|Any CPU - {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|x64.ActiveCfg = Debug|Any CPU - {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|x86.ActiveCfg = Debug|Any CPU + {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|arm.ActiveCfg = Debug|Any CPU + {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|x64.ActiveCfg = Debug|Any CPU + {D5FD16CF-7435-4E47-928A-9BC94968091D}.Checked|x86.ActiveCfg = Debug|Any CPU {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Debug|Any CPU.Build.0 = Debug|Any CPU {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -317,11 +308,11 @@ Global {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Release|x64.Build.0 = Release|Any CPU {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Release|x86.ActiveCfg = Release|Any CPU {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Release|x86.Build.0 = Release|Any CPU - {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|arm.ActiveCfg = Debug|Any CPU - {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|arm64.ActiveCfg = Debug|Any CPU - {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|x64.ActiveCfg = Debug|Any CPU - {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|x86.ActiveCfg = Debug|Any CPU + {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|arm.ActiveCfg = Debug|Any CPU + {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|arm64.ActiveCfg = Debug|Any CPU + {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|x64.ActiveCfg = Debug|Any CPU + {8D5878A9-E855-4E70-A3D5-42EB71037D96}.Checked|x86.ActiveCfg = Debug|Any CPU {6A176C5B-206D-4550-AC36-0530218E29F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6A176C5B-206D-4550-AC36-0530218E29F5}.Debug|Any CPU.Build.0 = Debug|Any CPU {6A176C5B-206D-4550-AC36-0530218E29F5}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -338,11 +329,11 @@ Global {6A176C5B-206D-4550-AC36-0530218E29F5}.Release|x64.Build.0 = Release|Any CPU {6A176C5B-206D-4550-AC36-0530218E29F5}.Release|x86.ActiveCfg = Release|Any CPU {6A176C5B-206D-4550-AC36-0530218E29F5}.Release|x86.Build.0 = Release|Any CPU - {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|arm.ActiveCfg = Debug|Any CPU - {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|x64.ActiveCfg = Debug|Any CPU - {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|x86.ActiveCfg = Debug|Any CPU + {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|arm.ActiveCfg = Debug|Any CPU + {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|arm64.ActiveCfg = Debug|Any CPU + {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|x64.ActiveCfg = Debug|Any CPU + {6A176C5B-206D-4550-AC36-0530218E29F5}.Checked|x86.ActiveCfg = Debug|Any CPU {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Debug|Any CPU.Build.0 = Debug|Any CPU {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -359,11 +350,11 @@ Global {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Release|x64.Build.0 = Release|Any CPU {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Release|x86.ActiveCfg = Release|Any CPU {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Release|x86.Build.0 = Release|Any CPU - {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|arm.ActiveCfg = Debug|Any CPU - {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|x64.ActiveCfg = Debug|Any CPU - {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|x86.ActiveCfg = Debug|Any CPU + {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|arm.ActiveCfg = Debug|Any CPU + {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|x64.ActiveCfg = Debug|Any CPU + {B479A4BF-A3A5-4255-A3EF-135015BD877F}.Checked|x86.ActiveCfg = Debug|Any CPU {82899000-791E-42FF-A594-6DE65DE07C9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {82899000-791E-42FF-A594-6DE65DE07C9E}.Debug|Any CPU.Build.0 = Debug|Any CPU {82899000-791E-42FF-A594-6DE65DE07C9E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -380,11 +371,11 @@ Global {82899000-791E-42FF-A594-6DE65DE07C9E}.Release|x64.Build.0 = Release|Any CPU {82899000-791E-42FF-A594-6DE65DE07C9E}.Release|x86.ActiveCfg = Release|Any CPU {82899000-791E-42FF-A594-6DE65DE07C9E}.Release|x86.Build.0 = Release|Any CPU - {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|arm.ActiveCfg = Debug|Any CPU - {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|x64.ActiveCfg = Debug|Any CPU - {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|x86.ActiveCfg = Debug|Any CPU + {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|arm.ActiveCfg = Debug|Any CPU + {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|x64.ActiveCfg = Debug|Any CPU + {82899000-791E-42FF-A594-6DE65DE07C9E}.Checked|x86.ActiveCfg = Debug|Any CPU {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Debug|Any CPU.Build.0 = Debug|Any CPU {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -401,11 +392,11 @@ Global {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Release|x64.Build.0 = Release|Any CPU {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Release|x86.ActiveCfg = Release|Any CPU {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Release|x86.Build.0 = Release|Any CPU - {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|arm.ActiveCfg = Debug|Any CPU - {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|x64.ActiveCfg = Debug|Any CPU - {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|x86.ActiveCfg = Debug|Any CPU + {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|arm.ActiveCfg = Debug|Any CPU + {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|x64.ActiveCfg = Debug|Any CPU + {E468274C-8F7E-49FC-BC2A-82C8B9E5B026}.Checked|x86.ActiveCfg = Debug|Any CPU {F33093A8-FF33-4F95-B256-F2AB712C956A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F33093A8-FF33-4F95-B256-F2AB712C956A}.Debug|Any CPU.Build.0 = Debug|Any CPU {F33093A8-FF33-4F95-B256-F2AB712C956A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -422,11 +413,11 @@ Global {F33093A8-FF33-4F95-B256-F2AB712C956A}.Release|x64.Build.0 = Release|Any CPU {F33093A8-FF33-4F95-B256-F2AB712C956A}.Release|x86.ActiveCfg = Release|Any CPU {F33093A8-FF33-4F95-B256-F2AB712C956A}.Release|x86.Build.0 = Release|Any CPU - {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|arm.ActiveCfg = Debug|Any CPU - {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|x64.ActiveCfg = Debug|Any CPU - {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|x86.ActiveCfg = Debug|Any CPU + {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|arm.ActiveCfg = Debug|Any CPU + {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|x64.ActiveCfg = Debug|Any CPU + {F33093A8-FF33-4F95-B256-F2AB712C956A}.Checked|x86.ActiveCfg = Debug|Any CPU {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Debug|Any CPU.Build.0 = Debug|Any CPU {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -443,11 +434,11 @@ Global {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Release|x64.Build.0 = Release|Any CPU {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Release|x86.ActiveCfg = Release|Any CPU {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Release|x86.Build.0 = Release|Any CPU - {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|arm.ActiveCfg = Debug|Any CPU - {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|x64.ActiveCfg = Debug|Any CPU - {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|x86.ActiveCfg = Debug|Any CPU + {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|arm.ActiveCfg = Debug|Any CPU + {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|x64.ActiveCfg = Debug|Any CPU + {B2FAA0B4-2976-4742-B186-9C4928BCF9AF}.Checked|x86.ActiveCfg = Debug|Any CPU {9F3970FF-F138-4F23-A2F8-2387858E723D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F3970FF-F138-4F23-A2F8-2387858E723D}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F3970FF-F138-4F23-A2F8-2387858E723D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -464,11 +455,11 @@ Global {9F3970FF-F138-4F23-A2F8-2387858E723D}.Release|x64.Build.0 = Release|Any CPU {9F3970FF-F138-4F23-A2F8-2387858E723D}.Release|x86.ActiveCfg = Release|Any CPU {9F3970FF-F138-4F23-A2F8-2387858E723D}.Release|x86.Build.0 = Release|Any CPU - {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|arm.ActiveCfg = Debug|Any CPU - {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|arm64.ActiveCfg = Debug|Any CPU - {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|x64.ActiveCfg = Debug|Any CPU - {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|x86.ActiveCfg = Debug|Any CPU + {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|arm.ActiveCfg = Debug|Any CPU + {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|x64.ActiveCfg = Debug|Any CPU + {9F3970FF-F138-4F23-A2F8-2387858E723D}.Checked|x86.ActiveCfg = Debug|Any CPU {FD4D647F-490B-420A-B2FD-29751E0C3454}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FD4D647F-490B-420A-B2FD-29751E0C3454}.Debug|Any CPU.Build.0 = Debug|Any CPU {FD4D647F-490B-420A-B2FD-29751E0C3454}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -485,11 +476,11 @@ Global {FD4D647F-490B-420A-B2FD-29751E0C3454}.Release|x64.Build.0 = Release|Any CPU {FD4D647F-490B-420A-B2FD-29751E0C3454}.Release|x86.ActiveCfg = Release|Any CPU {FD4D647F-490B-420A-B2FD-29751E0C3454}.Release|x86.Build.0 = Release|Any CPU - {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|arm.ActiveCfg = Debug|Any CPU - {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|x64.ActiveCfg = Debug|Any CPU - {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|x86.ActiveCfg = Debug|Any CPU + {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|arm.ActiveCfg = Debug|Any CPU + {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|arm64.ActiveCfg = Debug|Any CPU + {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|x64.ActiveCfg = Debug|Any CPU + {FD4D647F-490B-420A-B2FD-29751E0C3454}.Checked|x86.ActiveCfg = Debug|Any CPU {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Debug|Any CPU.Build.0 = Debug|Any CPU {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -506,11 +497,11 @@ Global {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Release|x64.Build.0 = Release|Any CPU {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Release|x86.ActiveCfg = Release|Any CPU {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Release|x86.Build.0 = Release|Any CPU - {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|arm.ActiveCfg = Debug|Any CPU - {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|x64.ActiveCfg = Debug|Any CPU - {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|x86.ActiveCfg = Debug|Any CPU + {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|arm.ActiveCfg = Debug|Any CPU + {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|x64.ActiveCfg = Debug|Any CPU + {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96}.Checked|x86.ActiveCfg = Debug|Any CPU {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -527,11 +518,11 @@ Global {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Release|x64.Build.0 = Release|Any CPU {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Release|x86.ActiveCfg = Release|Any CPU {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Release|x86.Build.0 = Release|Any CPU - {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|arm.ActiveCfg = Debug|Any CPU - {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|arm64.ActiveCfg = Debug|Any CPU - {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|x64.ActiveCfg = Debug|Any CPU - {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|x86.ActiveCfg = Debug|Any CPU + {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|arm.ActiveCfg = Debug|Any CPU + {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|x64.ActiveCfg = Debug|Any CPU + {1B329538-0FC3-476A-A986-3EFB0B66CDD0}.Checked|x86.ActiveCfg = Debug|Any CPU {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Debug|Any CPU.Build.0 = Debug|Any CPU {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -548,11 +539,11 @@ Global {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Release|x64.Build.0 = Release|Any CPU {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Release|x86.ActiveCfg = Release|Any CPU {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Release|x86.Build.0 = Release|Any CPU - {506EBBFA-FF57-4141-A725-882110C17598}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {506EBBFA-FF57-4141-A725-882110C17598}.Checked|arm.ActiveCfg = Debug|Any CPU - {506EBBFA-FF57-4141-A725-882110C17598}.Checked|arm64.ActiveCfg = Debug|Any CPU - {506EBBFA-FF57-4141-A725-882110C17598}.Checked|x64.ActiveCfg = Debug|Any CPU - {506EBBFA-FF57-4141-A725-882110C17598}.Checked|x86.ActiveCfg = Debug|Any CPU + {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|arm.ActiveCfg = Debug|Any CPU + {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|arm64.ActiveCfg = Debug|Any CPU + {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|x64.ActiveCfg = Debug|Any CPU + {73EA94AD-0C65-47C8-851C-12D136A0DCC1}.Checked|x86.ActiveCfg = Debug|Any CPU {506EBBFA-FF57-4141-A725-882110C17598}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {506EBBFA-FF57-4141-A725-882110C17598}.Debug|Any CPU.Build.0 = Debug|Any CPU {506EBBFA-FF57-4141-A725-882110C17598}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -569,11 +560,11 @@ Global {506EBBFA-FF57-4141-A725-882110C17598}.Release|x64.Build.0 = Release|Any CPU {506EBBFA-FF57-4141-A725-882110C17598}.Release|x86.ActiveCfg = Release|Any CPU {506EBBFA-FF57-4141-A725-882110C17598}.Release|x86.Build.0 = Release|Any CPU - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|arm.ActiveCfg = Debug|Any CPU - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|x64.ActiveCfg = Debug|Any CPU - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|x86.ActiveCfg = Debug|Any CPU + {506EBBFA-FF57-4141-A725-882110C17598}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {506EBBFA-FF57-4141-A725-882110C17598}.Checked|arm.ActiveCfg = Debug|Any CPU + {506EBBFA-FF57-4141-A725-882110C17598}.Checked|arm64.ActiveCfg = Debug|Any CPU + {506EBBFA-FF57-4141-A725-882110C17598}.Checked|x64.ActiveCfg = Debug|Any CPU + {506EBBFA-FF57-4141-A725-882110C17598}.Checked|x86.ActiveCfg = Debug|Any CPU {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -590,11 +581,11 @@ Global {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Release|x64.Build.0 = Release|Any CPU {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Release|x86.ActiveCfg = Release|Any CPU {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Release|x86.Build.0 = Release|Any CPU - {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|arm.ActiveCfg = Debug|Any CPU - {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|arm64.ActiveCfg = Debug|Any CPU - {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|x64.ActiveCfg = Debug|Any CPU - {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|x86.ActiveCfg = Debug|Any CPU + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|arm.ActiveCfg = Debug|Any CPU + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|x64.ActiveCfg = Debug|Any CPU + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6}.Checked|x86.ActiveCfg = Debug|Any CPU {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Debug|Any CPU.Build.0 = Debug|Any CPU {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -611,11 +602,11 @@ Global {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Release|x64.Build.0 = Release|Any CPU {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Release|x86.ActiveCfg = Release|Any CPU {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Release|x86.Build.0 = Release|Any CPU - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|arm.ActiveCfg = Debug|Any CPU - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|x64.ActiveCfg = Debug|Any CPU - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|x86.ActiveCfg = Debug|Any CPU + {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|arm.ActiveCfg = Debug|Any CPU + {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|arm64.ActiveCfg = Debug|Any CPU + {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|x64.ActiveCfg = Debug|Any CPU + {613C42F2-847A-42B3-9F5E-F5A670356BF7}.Checked|x86.ActiveCfg = Debug|Any CPU {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Debug|Any CPU.Build.0 = Debug|Any CPU {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -632,11 +623,11 @@ Global {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Release|x64.Build.0 = Release|Any CPU {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Release|x86.ActiveCfg = Release|Any CPU {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Release|x86.Build.0 = Release|Any CPU - {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|arm.ActiveCfg = Debug|Any CPU - {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|x64.ActiveCfg = Debug|Any CPU - {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|x86.ActiveCfg = Debug|Any CPU + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|arm.ActiveCfg = Debug|Any CPU + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|x64.ActiveCfg = Debug|Any CPU + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A}.Checked|x86.ActiveCfg = Debug|Any CPU {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Debug|Any CPU.Build.0 = Debug|Any CPU {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -653,11 +644,11 @@ Global {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Release|x64.Build.0 = Release|Any CPU {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Release|x86.ActiveCfg = Release|Any CPU {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Release|x86.Build.0 = Release|Any CPU - {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|arm.ActiveCfg = Debug|Any CPU - {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|x64.ActiveCfg = Debug|Any CPU - {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|x86.ActiveCfg = Debug|Any CPU + {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|arm.ActiveCfg = Debug|Any CPU + {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|x64.ActiveCfg = Debug|Any CPU + {AD7C04D0-8F8C-4114-975F-804C5E30C5D6}.Checked|x86.ActiveCfg = Debug|Any CPU {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Debug|Any CPU.Build.0 = Debug|Any CPU {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -674,11 +665,11 @@ Global {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Release|x64.Build.0 = Release|Any CPU {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Release|x86.ActiveCfg = Release|Any CPU {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Release|x86.Build.0 = Release|Any CPU - {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|arm.ActiveCfg = Debug|Any CPU - {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|arm64.ActiveCfg = Debug|Any CPU - {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|x64.ActiveCfg = Debug|Any CPU - {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|x86.ActiveCfg = Debug|Any CPU + {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|arm.ActiveCfg = Debug|Any CPU + {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|x64.ActiveCfg = Debug|Any CPU + {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D}.Checked|x86.ActiveCfg = Debug|Any CPU {30B7883D-A8B5-47F2-B242-971D585483B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {30B7883D-A8B5-47F2-B242-971D585483B8}.Debug|Any CPU.Build.0 = Debug|Any CPU {30B7883D-A8B5-47F2-B242-971D585483B8}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -695,11 +686,11 @@ Global {30B7883D-A8B5-47F2-B242-971D585483B8}.Release|x64.Build.0 = Release|Any CPU {30B7883D-A8B5-47F2-B242-971D585483B8}.Release|x86.ActiveCfg = Release|Any CPU {30B7883D-A8B5-47F2-B242-971D585483B8}.Release|x86.Build.0 = Release|Any CPU - {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|arm.ActiveCfg = Debug|Any CPU - {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|arm64.ActiveCfg = Debug|Any CPU - {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|x64.ActiveCfg = Debug|Any CPU - {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|x86.ActiveCfg = Debug|Any CPU + {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|arm.ActiveCfg = Debug|Any CPU + {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|arm64.ActiveCfg = Debug|Any CPU + {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|x64.ActiveCfg = Debug|Any CPU + {30B7883D-A8B5-47F2-B242-971D585483B8}.Checked|x86.ActiveCfg = Debug|Any CPU {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Debug|Any CPU.Build.0 = Debug|Any CPU {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -716,11 +707,11 @@ Global {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Release|x64.Build.0 = Release|Any CPU {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Release|x86.ActiveCfg = Release|Any CPU {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Release|x86.Build.0 = Release|Any CPU - {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|arm.ActiveCfg = Debug|Any CPU - {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|x64.ActiveCfg = Debug|Any CPU - {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|x86.ActiveCfg = Debug|Any CPU + {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|arm.ActiveCfg = Debug|Any CPU + {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|arm64.ActiveCfg = Debug|Any CPU + {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|x64.ActiveCfg = Debug|Any CPU + {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258}.Checked|x86.ActiveCfg = Debug|Any CPU {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -737,51 +728,51 @@ Global {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Release|x64.Build.0 = Release|Any CPU {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Release|x86.ActiveCfg = Release|Any CPU {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Release|x86.Build.0 = Release|Any CPU + {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|arm.ActiveCfg = Debug|Any CPU + {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|x64.ActiveCfg = Debug|Any CPU + {4F5987F2-614A-42B6-A652-FE4C03330DE0}.Checked|x86.ActiveCfg = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {772C93D4-FC45-46AA-B09F-26F01B672EDC} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} + {C2FF5BC7-825E-437E-92C3-F505EB6D1D40} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} + {D5FD16CF-7435-4E47-928A-9BC94968091D} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} + {B479A4BF-A3A5-4255-A3EF-135015BD877F} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} + {F33093A8-FF33-4F95-B256-F2AB712C956A} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} + {9F3970FF-F138-4F23-A2F8-2387858E723D} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} + {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {E5543842-139D-43BD-B604-E65EBB91649E} = {2FC35C2F-76DB-4D84-B421-9700BEA4D161} + {82899000-791E-42FF-A594-6DE65DE07C9E} = {2FC35C2F-76DB-4D84-B421-9700BEA4D161} {DE04D45B-7E15-409D-A176-985D814A6AEB} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {C2FF5BC7-825E-437E-92C3-F505EB6D1D40} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {6DEFA77D-1BCB-4E95-B4FB-BCD2D943340D} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} {62BB75B8-691F-4416-B162-16CB3DE04BBB} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {848EFB55-86B5-4259-BAA2-A49C6E3421A9} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} {C5EC183F-7276-43DB-9916-E861AEC47418} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {D5FD16CF-7435-4E47-928A-9BC94968091D} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {8D5878A9-E855-4E70-A3D5-42EB71037D96} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} {6A176C5B-206D-4550-AC36-0530218E29F5} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {B479A4BF-A3A5-4255-A3EF-135015BD877F} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} - {82899000-791E-42FF-A594-6DE65DE07C9E} = {2FC35C2F-76DB-4D84-B421-9700BEA4D161} {E468274C-8F7E-49FC-BC2A-82C8B9E5B026} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {F33093A8-FF33-4F95-B256-F2AB712C956A} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {B2FAA0B4-2976-4742-B186-9C4928BCF9AF} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {9F3970FF-F138-4F23-A2F8-2387858E723D} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {FD4D647F-490B-420A-B2FD-29751E0C3454} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {613C42F2-847A-42B3-9F5E-F5A670356BF7} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} + {848EFB55-86B5-4259-BAA2-A49C6E3421A9} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} {A2A7CB52-1BC2-40EA-885F-DD5DE607AC96} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} {1B329538-0FC3-476A-A986-3EFB0B66CDD0} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} {73EA94AD-0C65-47C8-851C-12D136A0DCC1} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} {506EBBFA-FF57-4141-A725-882110C17598} = {EB17DB9D-7058-48E8-98C3-A3B3C3BCE99B} - {8E08BBCB-E2D1-464F-96F1-7B1801CE48B6} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {613C42F2-847A-42B3-9F5E-F5A670356BF7} = {C36D185D-9B3D-42E5-985F-E21B3BAF3B6D} - {BB96A2BA-44E9-43FA-91B1-CCEE212C6A8A} = {74F4AB97-3DBC-48FB-A2EA-2B4141749800} {AD7C04D0-8F8C-4114-975F-804C5E30C5D6} = {611CB559-49A7-4046-9425-50E25205E891} {90044FD3-5C5C-4FB8-B7C7-F9DEF519EE7D} = {611CB559-49A7-4046-9425-50E25205E891} + {611CB559-49A7-4046-9425-50E25205E891} = {A3402532-58BD-4AB1-870F-CFD829CEAD18} {30B7883D-A8B5-47F2-B242-971D585483B8} = {59251F20-422C-41BC-9C0E-4517B5C2018D} {5D8AE6D8-F7EC-43AC-AE7E-80B85A460258} = {59251F20-422C-41BC-9C0E-4517B5C2018D} - {4F5987F2-614A-42B6-A652-FE4C03330DE0} = {AA8FF9D5-BB95-481B-A56A-E8FAF9725F97} - {611CB559-49A7-4046-9425-50E25205E891} = {A3402532-58BD-4AB1-870F-CFD829CEAD18} {59251F20-422C-41BC-9C0E-4517B5C2018D} = {A3402532-58BD-4AB1-870F-CFD829CEAD18} + {4F5987F2-614A-42B6-A652-FE4C03330DE0} = {AA8FF9D5-BB95-481B-A56A-E8FAF9725F97} {AA8FF9D5-BB95-481B-A56A-E8FAF9725F97} = {A3402532-58BD-4AB1-870F-CFD829CEAD18} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {739AA767-154B-4C69-8C9B-C3D332833D92} EndGlobalSection - GlobalSection(SharedMSBuildProjectFiles) = preSolution - ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{5d8ae6d8-f7ec-43ac-ae7e-80b85a460258}*SharedItemsImports = 5 - ..\System.Private.CoreLib\src\System.Private.CoreLib.Shared.projitems*{772c93d4-fc45-46aa-b09f-26f01b672edc}*SharedItemsImports = 5 - ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{90044fd3-5c5c-4fb8-b7c7-f9def519ee7d}*SharedItemsImports = 5 - EndGlobalSection EndGlobal diff --git a/src/libraries/System.Runtime/System.Runtime.sln b/src/libraries/System.Runtime/System.Runtime.sln index 6192820072c52d..4af0484c2667c7 100644 --- a/src/libraries/System.Runtime/System.Runtime.sln +++ b/src/libraries/System.Runtime/System.Runtime.sln @@ -1,8 +1,4 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.13.35617.110 d17.13 -MinimumVisualStudioVersion = 10.0.40219.1 +Microsoft Visual Studio Solution File, Format Version 12.00 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Private.CoreLib", "..\..\coreclr\System.Private.CoreLib\System.Private.CoreLib.csproj", "{71AB8240-F179-4B21-A8BE-8BE6CD774ED9}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StreamConformanceTests", "..\Common\tests\StreamConformanceTests\StreamConformanceTests.csproj", "{F86D6534-1A96-489E-A807-C14E616686D6}" @@ -245,55 +241,55 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Linker", "..\..\tools\ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{04D0E381-5B43-42C0-8E08-FADBFCECB353}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Buffers.Tests", "System.Buffers.Tests", "{49849A80-4C86-4DBD-A138-B98A07BFA4F8}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Buffers.Tests", "tests\System.Buffers.Tests", "{49849A80-4C86-4DBD-A138-B98A07BFA4F8}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Diagnostics.Debug.Tests", "System.Diagnostics.Debug.Tests", "{FA882920-3BC3-4FB7-BA9A-263CE3E4F8D9}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Diagnostics.Debug.Tests", "tests\System.Diagnostics.Debug.Tests", "{FA882920-3BC3-4FB7-BA9A-263CE3E4F8D9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Diagnostics.Tools.Tests", "System.Diagnostics.Tools.Tests", "{F283372A-5CA9-40D8-BA0D-5C65060F7D7F}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Diagnostics.Tools.Tests", "tests\System.Diagnostics.Tools.Tests", "{F283372A-5CA9-40D8-BA0D-5C65060F7D7F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Dynamic.Runtime.Tests", "System.Dynamic.Runtime.Tests", "{329E1643-B54D-4A88-9E96-716709AB931B}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Dynamic.Runtime.Tests", "tests\System.Dynamic.Runtime.Tests", "{329E1643-B54D-4A88-9E96-716709AB931B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Calendars.Tests", "System.Globalization.Calendars.Tests", "{7750E8BA-A054-4176-971B-FA3B4A9ECF23}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Calendars.Tests", "tests\System.Globalization.Calendars.Tests", "{7750E8BA-A054-4176-971B-FA3B4A9ECF23}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Extensions.Tests", "System.Globalization.Extensions.Tests", "{A1C3A699-4772-45AC-BED4-F0D6E8282EDB}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Extensions.Tests", "tests\System.Globalization.Extensions.Tests", "{A1C3A699-4772-45AC-BED4-F0D6E8282EDB}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Tests", "System.Globalization.Tests", "{FC0E8825-6D78-47C9-9758-59D61AD38895}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Globalization.Tests", "tests\System.Globalization.Tests", "{FC0E8825-6D78-47C9-9758-59D61AD38895}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.FileSystem.Primitives.Tests", "System.IO.FileSystem.Primitives.Tests", "{1131BBB2-AEBC-4020-9643-59C8EA73E848}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.FileSystem.Primitives.Tests", "tests\System.IO.FileSystem.Primitives.Tests", "{1131BBB2-AEBC-4020-9643-59C8EA73E848}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.FileSystem.Tests", "System.IO.FileSystem.Tests", "{5B928A02-3C49-4E29-8C05-E9AEF0E4F39A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.FileSystem.Tests", "tests\System.IO.FileSystem.Tests", "{5B928A02-3C49-4E29-8C05-E9AEF0E4F39A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.Tests", "System.IO.Tests", "{B5010729-BAD4-418F-B801-CEECF4890CB2}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.Tests", "tests\System.IO.Tests", "{B5010729-BAD4-418F-B801-CEECF4890CB2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.UnmanagedMemoryStream.Tests", "System.IO.UnmanagedMemoryStream.Tests", "{159EA645-58B0-447C-90BC-FF6AC3BBEEF1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.IO.UnmanagedMemoryStream.Tests", "tests\System.IO.UnmanagedMemoryStream.Tests", "{159EA645-58B0-447C-90BC-FF6AC3BBEEF1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Reflection.Tests", "System.Reflection.Tests", "{6FC63FB9-025D-4821-A346-CF3B34788331}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Reflection.Tests", "tests\System.Reflection.Tests", "{6FC63FB9-025D-4821-A346-CF3B34788331}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Resources.Reader.Tests", "System.Resources.Reader.Tests", "{C5CD099F-649E-4464-BBD9-1F0A9FE7C311}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Resources.Reader.Tests", "tests\System.Resources.Reader.Tests", "{C5CD099F-649E-4464-BBD9-1F0A9FE7C311}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Resources.ResourceManager.Tests", "System.Resources.ResourceManager.Tests", "{685D170C-E2BF-413A-A506-B09AF1E71DC1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Resources.ResourceManager.Tests", "tests\System.Resources.ResourceManager.Tests", "{685D170C-E2BF-413A-A506-B09AF1E71DC1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.CompilerServices.Unsafe.Tests", "System.Runtime.CompilerServices.Unsafe.Tests", "{EC6D590E-2278-4E86-B1B0-E6900D0F31BD}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.CompilerServices.Unsafe.Tests", "tests\System.Runtime.CompilerServices.Unsafe.Tests", "{EC6D590E-2278-4E86-B1B0-E6900D0F31BD}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Extensions.Tests", "System.Runtime.Extensions.Tests", "{2655BE48-E889-4354-9499-4CCC6DA9F378}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Extensions.Tests", "tests\System.Runtime.Extensions.Tests", "{2655BE48-E889-4354-9499-4CCC6DA9F378}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Handles.Tests", "System.Runtime.Handles.Tests", "{174A9FAB-F46D-49A9-AC69-0FF55ACDE4F7}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Handles.Tests", "tests\System.Runtime.Handles.Tests", "{174A9FAB-F46D-49A9-AC69-0FF55ACDE4F7}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.InteropServices.RuntimeInformation.Tests", "System.Runtime.InteropServices.RuntimeInformation.Tests", "{CE6BCA93-D862-4435-8FEB-07A98DD43655}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.InteropServices.RuntimeInformation.Tests", "tests\System.Runtime.InteropServices.RuntimeInformation.Tests", "{CE6BCA93-D862-4435-8FEB-07A98DD43655}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Tests", "System.Runtime.Tests", "{71C519F0-621A-413B-B262-A5106C2CCA64}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Runtime.Tests", "tests\System.Runtime.Tests", "{71C519F0-621A-413B-B262-A5106C2CCA64}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Security.SecureString.Tests", "System.Security.SecureString.Tests", "{FC75126D-0CBD-4927-A91D-BAF04DF8EC13}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Security.SecureString.Tests", "tests\System.Security.SecureString.Tests", "{FC75126D-0CBD-4927-A91D-BAF04DF8EC13}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Text.Encoding.Tests", "System.Text.Encoding.Tests", "{32160B7C-7125-48FD-8ECE-9E542D321FB1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Text.Encoding.Tests", "tests\System.Text.Encoding.Tests", "{32160B7C-7125-48FD-8ECE-9E542D321FB1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Tasks.Extensions.Tests", "System.Threading.Tasks.Extensions.Tests", "{69F454E3-4E56-42BD-957A-E20E15CBB1A8}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Tasks.Extensions.Tests", "tests\System.Threading.Tasks.Extensions.Tests", "{69F454E3-4E56-42BD-957A-E20E15CBB1A8}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Tasks.Tests", "System.Threading.Tasks.Tests", "{6DE592D4-860B-4C5E-86A4-741BFAD8CEF3}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Tasks.Tests", "tests\System.Threading.Tasks.Tests", "{6DE592D4-860B-4C5E-86A4-741BFAD8CEF3}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Timer.Tests", "System.Threading.Timer.Tests", "{ADE0FF1A-EF61-4D71-9E61-DC5656DC7943}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.Threading.Timer.Tests", "tests\System.Threading.Timer.Tests", "{ADE0FF1A-EF61-4D71-9E61-DC5656DC7943}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.ValueTuple.Tests", "System.ValueTuple.Tests", "{377FD142-D005-4CC6-9CE4-66AE72E9DF84}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System.ValueTuple.Tests", "tests\System.ValueTuple.Tests", "{377FD142-D005-4CC6-9CE4-66AE72E9DF84}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{FD72C125-C10D-457B-8AFC-6B4E5237AF6A}" EndProject @@ -301,21 +297,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{F65030D7-DDB EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{13818769-DC01-4715-9590-E000D03E42A9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{28FBA7EA-0592-4446-82F2-2E9819684236}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "tools\gen", "{28FBA7EA-0592-4446-82F2-2E9819684236}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{866503B5-5CD2-438C-A125-B947A2F38D34}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "tools\src", "{866503B5-5CD2-438C-A125-B947A2F38D34}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{978D3888-2C89-41B7-BC09-33A4E49A6A00}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "tools\ref", "{978D3888-2C89-41B7-BC09-33A4E49A6A00}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{67DCB1C2-0B95-40B6-ACE8-9812BF57EB19}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Checked|Any CPU = Checked|Any CPU - Checked|arm = Checked|arm - Checked|arm64 = Checked|arm64 - Checked|x64 = Checked|x64 - Checked|x86 = Checked|x86 Debug|Any CPU = Debug|Any CPU Debug|arm = Debug|arm Debug|arm64 = Debug|arm64 @@ -326,18 +317,13 @@ Global Release|arm64 = Release|arm64 Release|x64 = Release|x64 Release|x86 = Release|x86 + Checked|Any CPU = Checked|Any CPU + Checked|arm = Checked|arm + Checked|arm64 = Checked|arm64 + Checked|x64 = Checked|x64 + Checked|x86 = Checked|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|Any CPU.ActiveCfg = Checked|x64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|Any CPU.Build.0 = Checked|x64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm.ActiveCfg = Checked|arm - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm.Build.0 = Checked|arm - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm64.ActiveCfg = Checked|arm64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm64.Build.0 = Checked|arm64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x64.ActiveCfg = Checked|x64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x64.Build.0 = Checked|x64 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x86.ActiveCfg = Checked|x86 - {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x86.Build.0 = Checked|x86 {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Debug|Any CPU.ActiveCfg = Debug|x64 {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Debug|Any CPU.Build.0 = Debug|x64 {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Debug|arm.ActiveCfg = Debug|arm @@ -358,11 +344,16 @@ Global {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Release|x64.Build.0 = Release|x64 {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Release|x86.ActiveCfg = Release|x86 {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Release|x86.Build.0 = Release|x86 - {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|arm.ActiveCfg = Debug|Any CPU - {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|x64.ActiveCfg = Debug|Any CPU - {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|x86.ActiveCfg = Debug|Any CPU + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|Any CPU.ActiveCfg = Checked|x64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|Any CPU.Build.0 = Checked|x64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm.ActiveCfg = Checked|arm + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm.Build.0 = Checked|arm + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm64.ActiveCfg = Checked|arm64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|arm64.Build.0 = Checked|arm64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x64.ActiveCfg = Checked|x64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x64.Build.0 = Checked|x64 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x86.ActiveCfg = Checked|x86 + {71AB8240-F179-4B21-A8BE-8BE6CD774ED9}.Checked|x86.Build.0 = Checked|x86 {F86D6534-1A96-489E-A807-C14E616686D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F86D6534-1A96-489E-A807-C14E616686D6}.Debug|Any CPU.Build.0 = Debug|Any CPU {F86D6534-1A96-489E-A807-C14E616686D6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -379,11 +370,11 @@ Global {F86D6534-1A96-489E-A807-C14E616686D6}.Release|x64.Build.0 = Release|Any CPU {F86D6534-1A96-489E-A807-C14E616686D6}.Release|x86.ActiveCfg = Release|Any CPU {F86D6534-1A96-489E-A807-C14E616686D6}.Release|x86.Build.0 = Release|Any CPU - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|arm.ActiveCfg = Debug|Any CPU - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|arm64.ActiveCfg = Debug|Any CPU - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|x64.ActiveCfg = Debug|Any CPU - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|x86.ActiveCfg = Debug|Any CPU + {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|arm.ActiveCfg = Debug|Any CPU + {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|x64.ActiveCfg = Debug|Any CPU + {F86D6534-1A96-489E-A807-C14E616686D6}.Checked|x86.ActiveCfg = Debug|Any CPU {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Debug|Any CPU.Build.0 = Debug|Any CPU {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -400,11 +391,11 @@ Global {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Release|x64.Build.0 = Release|Any CPU {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Release|x86.ActiveCfg = Release|Any CPU {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Release|x86.Build.0 = Release|Any CPU - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|arm.ActiveCfg = Debug|Any CPU - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|x64.ActiveCfg = Debug|Any CPU - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|x86.ActiveCfg = Debug|Any CPU + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|arm.ActiveCfg = Debug|Any CPU + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|arm64.ActiveCfg = Debug|Any CPU + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|x64.ActiveCfg = Debug|Any CPU + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83}.Checked|x86.ActiveCfg = Debug|Any CPU {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Debug|Any CPU.Build.0 = Debug|Any CPU {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -421,11 +412,11 @@ Global {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Release|x64.Build.0 = Release|Any CPU {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Release|x86.ActiveCfg = Release|Any CPU {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Release|x86.Build.0 = Release|Any CPU - {FB17AC52-1633-4845-932B-9218DF895957}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {FB17AC52-1633-4845-932B-9218DF895957}.Checked|arm.ActiveCfg = Debug|Any CPU - {FB17AC52-1633-4845-932B-9218DF895957}.Checked|arm64.ActiveCfg = Debug|Any CPU - {FB17AC52-1633-4845-932B-9218DF895957}.Checked|x64.ActiveCfg = Debug|Any CPU - {FB17AC52-1633-4845-932B-9218DF895957}.Checked|x86.ActiveCfg = Debug|Any CPU + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|arm.ActiveCfg = Debug|Any CPU + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|x64.ActiveCfg = Debug|Any CPU + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742}.Checked|x86.ActiveCfg = Debug|Any CPU {FB17AC52-1633-4845-932B-9218DF895957}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB17AC52-1633-4845-932B-9218DF895957}.Debug|Any CPU.Build.0 = Debug|Any CPU {FB17AC52-1633-4845-932B-9218DF895957}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -442,11 +433,11 @@ Global {FB17AC52-1633-4845-932B-9218DF895957}.Release|x64.Build.0 = Release|Any CPU {FB17AC52-1633-4845-932B-9218DF895957}.Release|x86.ActiveCfg = Release|Any CPU {FB17AC52-1633-4845-932B-9218DF895957}.Release|x86.Build.0 = Release|Any CPU - {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|arm.ActiveCfg = Debug|Any CPU - {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|arm64.ActiveCfg = Debug|Any CPU - {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|x64.ActiveCfg = Debug|Any CPU - {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|x86.ActiveCfg = Debug|Any CPU + {FB17AC52-1633-4845-932B-9218DF895957}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {FB17AC52-1633-4845-932B-9218DF895957}.Checked|arm.ActiveCfg = Debug|Any CPU + {FB17AC52-1633-4845-932B-9218DF895957}.Checked|arm64.ActiveCfg = Debug|Any CPU + {FB17AC52-1633-4845-932B-9218DF895957}.Checked|x64.ActiveCfg = Debug|Any CPU + {FB17AC52-1633-4845-932B-9218DF895957}.Checked|x86.ActiveCfg = Debug|Any CPU {21791340-49C4-4C07-97FD-CAA1B72D3256}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {21791340-49C4-4C07-97FD-CAA1B72D3256}.Debug|Any CPU.Build.0 = Debug|Any CPU {21791340-49C4-4C07-97FD-CAA1B72D3256}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -463,11 +454,11 @@ Global {21791340-49C4-4C07-97FD-CAA1B72D3256}.Release|x64.Build.0 = Release|Any CPU {21791340-49C4-4C07-97FD-CAA1B72D3256}.Release|x86.ActiveCfg = Release|Any CPU {21791340-49C4-4C07-97FD-CAA1B72D3256}.Release|x86.Build.0 = Release|Any CPU - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|arm.ActiveCfg = Debug|Any CPU - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|x64.ActiveCfg = Debug|Any CPU - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|x86.ActiveCfg = Debug|Any CPU + {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|arm.ActiveCfg = Debug|Any CPU + {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|arm64.ActiveCfg = Debug|Any CPU + {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|x64.ActiveCfg = Debug|Any CPU + {21791340-49C4-4C07-97FD-CAA1B72D3256}.Checked|x86.ActiveCfg = Debug|Any CPU {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Debug|Any CPU.Build.0 = Debug|Any CPU {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -484,11 +475,11 @@ Global {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Release|x64.Build.0 = Release|Any CPU {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Release|x86.ActiveCfg = Release|Any CPU {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Release|x86.Build.0 = Release|Any CPU - {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|arm.ActiveCfg = Debug|Any CPU - {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|arm64.ActiveCfg = Debug|Any CPU - {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|x64.ActiveCfg = Debug|Any CPU - {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|x86.ActiveCfg = Debug|Any CPU + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|arm.ActiveCfg = Debug|Any CPU + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|x64.ActiveCfg = Debug|Any CPU + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A}.Checked|x86.ActiveCfg = Debug|Any CPU {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Debug|Any CPU.Build.0 = Debug|Any CPU {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -505,11 +496,11 @@ Global {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Release|x64.Build.0 = Release|Any CPU {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Release|x86.ActiveCfg = Release|Any CPU {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Release|x86.Build.0 = Release|Any CPU - {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|arm.ActiveCfg = Debug|Any CPU - {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|arm64.ActiveCfg = Debug|Any CPU - {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|x64.ActiveCfg = Debug|Any CPU - {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|x86.ActiveCfg = Debug|Any CPU + {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|arm.ActiveCfg = Debug|Any CPU + {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|arm64.ActiveCfg = Debug|Any CPU + {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|x64.ActiveCfg = Debug|Any CPU + {5719BF19-2F1E-4ECC-9285-8DE445D23F5F}.Checked|x86.ActiveCfg = Debug|Any CPU {86CF47B3-D607-4F59-896F-982FEA116086}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86CF47B3-D607-4F59-896F-982FEA116086}.Debug|Any CPU.Build.0 = Debug|Any CPU {86CF47B3-D607-4F59-896F-982FEA116086}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -526,11 +517,11 @@ Global {86CF47B3-D607-4F59-896F-982FEA116086}.Release|x64.Build.0 = Release|Any CPU {86CF47B3-D607-4F59-896F-982FEA116086}.Release|x86.ActiveCfg = Release|Any CPU {86CF47B3-D607-4F59-896F-982FEA116086}.Release|x86.Build.0 = Release|Any CPU - {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|arm.ActiveCfg = Debug|Any CPU - {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|arm64.ActiveCfg = Debug|Any CPU - {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|x64.ActiveCfg = Debug|Any CPU - {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|x86.ActiveCfg = Debug|Any CPU + {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|arm.ActiveCfg = Debug|Any CPU + {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|arm64.ActiveCfg = Debug|Any CPU + {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|x64.ActiveCfg = Debug|Any CPU + {86CF47B3-D607-4F59-896F-982FEA116086}.Checked|x86.ActiveCfg = Debug|Any CPU {484B12B8-F027-4960-BAA9-14D646C80A28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {484B12B8-F027-4960-BAA9-14D646C80A28}.Debug|Any CPU.Build.0 = Debug|Any CPU {484B12B8-F027-4960-BAA9-14D646C80A28}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -547,11 +538,11 @@ Global {484B12B8-F027-4960-BAA9-14D646C80A28}.Release|x64.Build.0 = Release|Any CPU {484B12B8-F027-4960-BAA9-14D646C80A28}.Release|x86.ActiveCfg = Release|Any CPU {484B12B8-F027-4960-BAA9-14D646C80A28}.Release|x86.Build.0 = Release|Any CPU - {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|arm.ActiveCfg = Debug|Any CPU - {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|arm64.ActiveCfg = Debug|Any CPU - {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|x64.ActiveCfg = Debug|Any CPU - {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|x86.ActiveCfg = Debug|Any CPU + {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|arm.ActiveCfg = Debug|Any CPU + {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|arm64.ActiveCfg = Debug|Any CPU + {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|x64.ActiveCfg = Debug|Any CPU + {484B12B8-F027-4960-BAA9-14D646C80A28}.Checked|x86.ActiveCfg = Debug|Any CPU {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Debug|Any CPU.Build.0 = Debug|Any CPU {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -568,11 +559,11 @@ Global {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Release|x64.Build.0 = Release|Any CPU {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Release|x86.ActiveCfg = Release|Any CPU {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Release|x86.Build.0 = Release|Any CPU - {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|arm.ActiveCfg = Debug|Any CPU - {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|x64.ActiveCfg = Debug|Any CPU - {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|x86.ActiveCfg = Debug|Any CPU + {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|arm.ActiveCfg = Debug|Any CPU + {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|arm64.ActiveCfg = Debug|Any CPU + {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|x64.ActiveCfg = Debug|Any CPU + {D16B3A49-5709-44CB-B6F8-8E3D585D236F}.Checked|x86.ActiveCfg = Debug|Any CPU {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Debug|Any CPU.Build.0 = Debug|Any CPU {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -589,11 +580,11 @@ Global {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Release|x64.Build.0 = Release|Any CPU {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Release|x86.ActiveCfg = Release|Any CPU {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Release|x86.Build.0 = Release|Any CPU - {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|arm.ActiveCfg = Debug|Any CPU - {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|x64.ActiveCfg = Debug|Any CPU - {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|x86.ActiveCfg = Debug|Any CPU + {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|arm.ActiveCfg = Debug|Any CPU + {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|x64.ActiveCfg = Debug|Any CPU + {F0BB4F76-7697-49A8-8204-FD4516EB325C}.Checked|x86.ActiveCfg = Debug|Any CPU {B876CC90-CB87-4B1B-B6F5-247990192578}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B876CC90-CB87-4B1B-B6F5-247990192578}.Debug|Any CPU.Build.0 = Debug|Any CPU {B876CC90-CB87-4B1B-B6F5-247990192578}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -610,11 +601,11 @@ Global {B876CC90-CB87-4B1B-B6F5-247990192578}.Release|x64.Build.0 = Release|Any CPU {B876CC90-CB87-4B1B-B6F5-247990192578}.Release|x86.ActiveCfg = Release|Any CPU {B876CC90-CB87-4B1B-B6F5-247990192578}.Release|x86.Build.0 = Release|Any CPU - {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|arm.ActiveCfg = Debug|Any CPU - {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|arm64.ActiveCfg = Debug|Any CPU - {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|x64.ActiveCfg = Debug|Any CPU - {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|x86.ActiveCfg = Debug|Any CPU + {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|arm.ActiveCfg = Debug|Any CPU + {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|x64.ActiveCfg = Debug|Any CPU + {B876CC90-CB87-4B1B-B6F5-247990192578}.Checked|x86.ActiveCfg = Debug|Any CPU {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Debug|Any CPU.Build.0 = Debug|Any CPU {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -631,11 +622,11 @@ Global {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Release|x64.Build.0 = Release|Any CPU {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Release|x86.ActiveCfg = Release|Any CPU {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Release|x86.Build.0 = Release|Any CPU - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|arm.ActiveCfg = Debug|Any CPU - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|x64.ActiveCfg = Debug|Any CPU - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|x86.ActiveCfg = Debug|Any CPU + {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|arm.ActiveCfg = Debug|Any CPU + {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|arm64.ActiveCfg = Debug|Any CPU + {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|x64.ActiveCfg = Debug|Any CPU + {999B1A08-2C7F-43AD-BC50-5F950320BBFF}.Checked|x86.ActiveCfg = Debug|Any CPU {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Debug|Any CPU.Build.0 = Debug|Any CPU {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -652,11 +643,11 @@ Global {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Release|x64.Build.0 = Release|Any CPU {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Release|x86.ActiveCfg = Release|Any CPU {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Release|x86.Build.0 = Release|Any CPU - {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|arm.ActiveCfg = Debug|Any CPU - {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|x64.ActiveCfg = Debug|Any CPU - {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|x86.ActiveCfg = Debug|Any CPU + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|arm.ActiveCfg = Debug|Any CPU + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|x64.ActiveCfg = Debug|Any CPU + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33}.Checked|x86.ActiveCfg = Debug|Any CPU {53EFB849-6776-4316-B631-5B5F0D9624E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {53EFB849-6776-4316-B631-5B5F0D9624E6}.Debug|Any CPU.Build.0 = Debug|Any CPU {53EFB849-6776-4316-B631-5B5F0D9624E6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -673,11 +664,11 @@ Global {53EFB849-6776-4316-B631-5B5F0D9624E6}.Release|x64.Build.0 = Release|Any CPU {53EFB849-6776-4316-B631-5B5F0D9624E6}.Release|x86.ActiveCfg = Release|Any CPU {53EFB849-6776-4316-B631-5B5F0D9624E6}.Release|x86.Build.0 = Release|Any CPU - {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|arm.ActiveCfg = Debug|Any CPU - {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|arm64.ActiveCfg = Debug|Any CPU - {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|x64.ActiveCfg = Debug|Any CPU - {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|x86.ActiveCfg = Debug|Any CPU + {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|arm.ActiveCfg = Debug|Any CPU + {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|x64.ActiveCfg = Debug|Any CPU + {53EFB849-6776-4316-B631-5B5F0D9624E6}.Checked|x86.ActiveCfg = Debug|Any CPU {019A13D1-3493-4024-8223-FCB6763F80B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {019A13D1-3493-4024-8223-FCB6763F80B4}.Debug|Any CPU.Build.0 = Debug|Any CPU {019A13D1-3493-4024-8223-FCB6763F80B4}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -694,11 +685,11 @@ Global {019A13D1-3493-4024-8223-FCB6763F80B4}.Release|x64.Build.0 = Release|Any CPU {019A13D1-3493-4024-8223-FCB6763F80B4}.Release|x86.ActiveCfg = Release|Any CPU {019A13D1-3493-4024-8223-FCB6763F80B4}.Release|x86.Build.0 = Release|Any CPU - {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|arm.ActiveCfg = Debug|Any CPU - {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|x64.ActiveCfg = Debug|Any CPU - {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|x86.ActiveCfg = Debug|Any CPU + {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|arm.ActiveCfg = Debug|Any CPU + {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|arm64.ActiveCfg = Debug|Any CPU + {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|x64.ActiveCfg = Debug|Any CPU + {019A13D1-3493-4024-8223-FCB6763F80B4}.Checked|x86.ActiveCfg = Debug|Any CPU {9ECF9E5C-860F-49C3-95D0-501147F19548}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9ECF9E5C-860F-49C3-95D0-501147F19548}.Debug|Any CPU.Build.0 = Debug|Any CPU {9ECF9E5C-860F-49C3-95D0-501147F19548}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -715,11 +706,11 @@ Global {9ECF9E5C-860F-49C3-95D0-501147F19548}.Release|x64.Build.0 = Release|Any CPU {9ECF9E5C-860F-49C3-95D0-501147F19548}.Release|x86.ActiveCfg = Release|Any CPU {9ECF9E5C-860F-49C3-95D0-501147F19548}.Release|x86.Build.0 = Release|Any CPU - {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|arm.ActiveCfg = Debug|Any CPU - {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|arm64.ActiveCfg = Debug|Any CPU - {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|x64.ActiveCfg = Debug|Any CPU - {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|x86.ActiveCfg = Debug|Any CPU + {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|arm.ActiveCfg = Debug|Any CPU + {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|x64.ActiveCfg = Debug|Any CPU + {9ECF9E5C-860F-49C3-95D0-501147F19548}.Checked|x86.ActiveCfg = Debug|Any CPU {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Debug|Any CPU.Build.0 = Debug|Any CPU {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -736,11 +727,11 @@ Global {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Release|x64.Build.0 = Release|Any CPU {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Release|x86.ActiveCfg = Release|Any CPU {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Release|x86.Build.0 = Release|Any CPU - {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|arm.ActiveCfg = Debug|Any CPU - {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|x64.ActiveCfg = Debug|Any CPU - {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|x86.ActiveCfg = Debug|Any CPU + {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|arm.ActiveCfg = Debug|Any CPU + {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|arm64.ActiveCfg = Debug|Any CPU + {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|x64.ActiveCfg = Debug|Any CPU + {8F97C1DE-07F7-449F-AA22-84A6D6836D82}.Checked|x86.ActiveCfg = Debug|Any CPU {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Debug|Any CPU.Build.0 = Debug|Any CPU {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -757,11 +748,11 @@ Global {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Release|x64.Build.0 = Release|Any CPU {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Release|x86.ActiveCfg = Release|Any CPU {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Release|x86.Build.0 = Release|Any CPU - {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|arm.ActiveCfg = Debug|Any CPU - {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|arm64.ActiveCfg = Debug|Any CPU - {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|x64.ActiveCfg = Debug|Any CPU - {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|x86.ActiveCfg = Debug|Any CPU + {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|arm.ActiveCfg = Debug|Any CPU + {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|x64.ActiveCfg = Debug|Any CPU + {B11DD674-FFF7-4343-BA1B-F4C788B16DDA}.Checked|x86.ActiveCfg = Debug|Any CPU {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Debug|Any CPU.Build.0 = Debug|Any CPU {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -778,11 +769,11 @@ Global {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Release|x64.Build.0 = Release|Any CPU {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Release|x86.ActiveCfg = Release|Any CPU {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Release|x86.Build.0 = Release|Any CPU - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|arm.ActiveCfg = Debug|Any CPU - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|x64.ActiveCfg = Debug|Any CPU - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|x86.ActiveCfg = Debug|Any CPU + {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|arm.ActiveCfg = Debug|Any CPU + {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|arm64.ActiveCfg = Debug|Any CPU + {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|x64.ActiveCfg = Debug|Any CPU + {3C01DB47-20B0-40E0-AB7C-A5611345AC44}.Checked|x86.ActiveCfg = Debug|Any CPU {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Debug|Any CPU.Build.0 = Debug|Any CPU {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -799,11 +790,11 @@ Global {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Release|x64.Build.0 = Release|Any CPU {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Release|x86.ActiveCfg = Release|Any CPU {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Release|x86.Build.0 = Release|Any CPU - {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|arm.ActiveCfg = Debug|Any CPU - {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|x64.ActiveCfg = Debug|Any CPU - {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|x86.ActiveCfg = Debug|Any CPU + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|arm.ActiveCfg = Debug|Any CPU + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|x64.ActiveCfg = Debug|Any CPU + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3}.Checked|x86.ActiveCfg = Debug|Any CPU {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Debug|Any CPU.Build.0 = Debug|Any CPU {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -820,11 +811,11 @@ Global {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Release|x64.Build.0 = Release|Any CPU {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Release|x86.ActiveCfg = Release|Any CPU {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Release|x86.Build.0 = Release|Any CPU - {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|arm.ActiveCfg = Debug|Any CPU - {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|x64.ActiveCfg = Debug|Any CPU - {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|x86.ActiveCfg = Debug|Any CPU + {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|arm.ActiveCfg = Debug|Any CPU + {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|x64.ActiveCfg = Debug|Any CPU + {E64D31D0-8F38-4FDF-B60D-F955D2475566}.Checked|x86.ActiveCfg = Debug|Any CPU {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Debug|Any CPU.Build.0 = Debug|Any CPU {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -841,11 +832,11 @@ Global {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Release|x64.Build.0 = Release|Any CPU {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Release|x86.ActiveCfg = Release|Any CPU {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Release|x86.Build.0 = Release|Any CPU - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|arm.ActiveCfg = Debug|Any CPU - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|arm64.ActiveCfg = Debug|Any CPU - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|x64.ActiveCfg = Debug|Any CPU - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|x86.ActiveCfg = Debug|Any CPU + {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|arm.ActiveCfg = Debug|Any CPU + {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|x64.ActiveCfg = Debug|Any CPU + {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC}.Checked|x86.ActiveCfg = Debug|Any CPU {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Debug|Any CPU.Build.0 = Debug|Any CPU {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -862,11 +853,11 @@ Global {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Release|x64.Build.0 = Release|Any CPU {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Release|x86.ActiveCfg = Release|Any CPU {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Release|x86.Build.0 = Release|Any CPU - {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|arm.ActiveCfg = Debug|Any CPU - {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|arm64.ActiveCfg = Debug|Any CPU - {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|x64.ActiveCfg = Debug|Any CPU - {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|x86.ActiveCfg = Debug|Any CPU + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|arm.ActiveCfg = Debug|Any CPU + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|arm64.ActiveCfg = Debug|Any CPU + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|x64.ActiveCfg = Debug|Any CPU + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3}.Checked|x86.ActiveCfg = Debug|Any CPU {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Debug|Any CPU.Build.0 = Debug|Any CPU {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -883,11 +874,11 @@ Global {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Release|x64.Build.0 = Release|Any CPU {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Release|x86.ActiveCfg = Release|Any CPU {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Release|x86.Build.0 = Release|Any CPU - {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|arm.ActiveCfg = Debug|Any CPU - {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|x64.ActiveCfg = Debug|Any CPU - {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|x86.ActiveCfg = Debug|Any CPU + {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|arm.ActiveCfg = Debug|Any CPU + {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|arm64.ActiveCfg = Debug|Any CPU + {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|x64.ActiveCfg = Debug|Any CPU + {91D01772-0D5A-451F-A56C-56FBB0961ED8}.Checked|x86.ActiveCfg = Debug|Any CPU {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Debug|Any CPU.Build.0 = Debug|Any CPU {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -904,11 +895,11 @@ Global {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Release|x64.Build.0 = Release|Any CPU {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Release|x86.ActiveCfg = Release|Any CPU {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Release|x86.Build.0 = Release|Any CPU - {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|arm.ActiveCfg = Debug|Any CPU - {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|x64.ActiveCfg = Debug|Any CPU - {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|x86.ActiveCfg = Debug|Any CPU + {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|arm.ActiveCfg = Debug|Any CPU + {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|x64.ActiveCfg = Debug|Any CPU + {4367BB9C-7EC2-4238-82E2-643DE24CC23E}.Checked|x86.ActiveCfg = Debug|Any CPU {F977B04F-675C-4B78-8FCE-19D70504166D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F977B04F-675C-4B78-8FCE-19D70504166D}.Debug|Any CPU.Build.0 = Debug|Any CPU {F977B04F-675C-4B78-8FCE-19D70504166D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -925,11 +916,11 @@ Global {F977B04F-675C-4B78-8FCE-19D70504166D}.Release|x64.Build.0 = Release|Any CPU {F977B04F-675C-4B78-8FCE-19D70504166D}.Release|x86.ActiveCfg = Release|Any CPU {F977B04F-675C-4B78-8FCE-19D70504166D}.Release|x86.Build.0 = Release|Any CPU - {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|arm.ActiveCfg = Debug|Any CPU - {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|arm64.ActiveCfg = Debug|Any CPU - {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|x64.ActiveCfg = Debug|Any CPU - {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|x86.ActiveCfg = Debug|Any CPU + {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|arm.ActiveCfg = Debug|Any CPU + {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|x64.ActiveCfg = Debug|Any CPU + {F977B04F-675C-4B78-8FCE-19D70504166D}.Checked|x86.ActiveCfg = Debug|Any CPU {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Debug|Any CPU.Build.0 = Debug|Any CPU {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -946,11 +937,11 @@ Global {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Release|x64.Build.0 = Release|Any CPU {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Release|x86.ActiveCfg = Release|Any CPU {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Release|x86.Build.0 = Release|Any CPU - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|arm.ActiveCfg = Debug|Any CPU - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|x64.ActiveCfg = Debug|Any CPU - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|x86.ActiveCfg = Debug|Any CPU + {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|arm.ActiveCfg = Debug|Any CPU + {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|arm64.ActiveCfg = Debug|Any CPU + {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|x64.ActiveCfg = Debug|Any CPU + {379BC6E6-1900-44F8-8D8C-AA2968A70008}.Checked|x86.ActiveCfg = Debug|Any CPU {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Debug|Any CPU.Build.0 = Debug|Any CPU {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -967,11 +958,11 @@ Global {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Release|x64.Build.0 = Release|Any CPU {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Release|x86.ActiveCfg = Release|Any CPU {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Release|x86.Build.0 = Release|Any CPU - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|arm.ActiveCfg = Debug|Any CPU - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|x64.ActiveCfg = Debug|Any CPU - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|x86.ActiveCfg = Debug|Any CPU + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|arm.ActiveCfg = Debug|Any CPU + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|x64.ActiveCfg = Debug|Any CPU + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590}.Checked|x86.ActiveCfg = Debug|Any CPU {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Debug|Any CPU.Build.0 = Debug|Any CPU {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -988,11 +979,11 @@ Global {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Release|x64.Build.0 = Release|Any CPU {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Release|x86.ActiveCfg = Release|Any CPU {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Release|x86.Build.0 = Release|Any CPU - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|arm.ActiveCfg = Debug|Any CPU - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|x64.ActiveCfg = Debug|Any CPU - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|x86.ActiveCfg = Debug|Any CPU + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|arm.ActiveCfg = Debug|Any CPU + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|x64.ActiveCfg = Debug|Any CPU + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9}.Checked|x86.ActiveCfg = Debug|Any CPU {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Debug|Any CPU.Build.0 = Debug|Any CPU {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1009,11 +1000,11 @@ Global {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Release|x64.Build.0 = Release|Any CPU {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Release|x86.ActiveCfg = Release|Any CPU {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Release|x86.Build.0 = Release|Any CPU - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|arm.ActiveCfg = Debug|Any CPU - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|x64.ActiveCfg = Debug|Any CPU - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|x86.ActiveCfg = Debug|Any CPU + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|arm.ActiveCfg = Debug|Any CPU + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|x64.ActiveCfg = Debug|Any CPU + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37}.Checked|x86.ActiveCfg = Debug|Any CPU {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Debug|Any CPU.Build.0 = Debug|Any CPU {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1030,11 +1021,11 @@ Global {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Release|x64.Build.0 = Release|Any CPU {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Release|x86.ActiveCfg = Release|Any CPU {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Release|x86.Build.0 = Release|Any CPU - {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|arm.ActiveCfg = Debug|Any CPU - {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|x64.ActiveCfg = Debug|Any CPU - {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|x86.ActiveCfg = Debug|Any CPU + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|arm.ActiveCfg = Debug|Any CPU + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|x64.ActiveCfg = Debug|Any CPU + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C}.Checked|x86.ActiveCfg = Debug|Any CPU {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Debug|Any CPU.Build.0 = Debug|Any CPU {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1051,11 +1042,11 @@ Global {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Release|x64.Build.0 = Release|Any CPU {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Release|x86.ActiveCfg = Release|Any CPU {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Release|x86.Build.0 = Release|Any CPU - {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|arm.ActiveCfg = Debug|Any CPU - {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|x64.ActiveCfg = Debug|Any CPU - {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|x86.ActiveCfg = Debug|Any CPU + {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|arm.ActiveCfg = Debug|Any CPU + {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|x64.ActiveCfg = Debug|Any CPU + {A83A8520-F5E2-49B4-83BC-0F82A412951D}.Checked|x86.ActiveCfg = Debug|Any CPU {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Debug|Any CPU.Build.0 = Debug|Any CPU {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1072,11 +1063,11 @@ Global {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Release|x64.Build.0 = Release|Any CPU {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Release|x86.ActiveCfg = Release|Any CPU {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Release|x86.Build.0 = Release|Any CPU - {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|arm.ActiveCfg = Debug|Any CPU - {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|arm64.ActiveCfg = Debug|Any CPU - {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|x64.ActiveCfg = Debug|Any CPU - {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|x86.ActiveCfg = Debug|Any CPU + {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|arm.ActiveCfg = Debug|Any CPU + {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|x64.ActiveCfg = Debug|Any CPU + {A3873DDB-47E7-4DB6-872C-4B46A779913A}.Checked|x86.ActiveCfg = Debug|Any CPU {23D41678-453F-4F2A-85F1-167E63DA6D67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23D41678-453F-4F2A-85F1-167E63DA6D67}.Debug|Any CPU.Build.0 = Debug|Any CPU {23D41678-453F-4F2A-85F1-167E63DA6D67}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1093,11 +1084,11 @@ Global {23D41678-453F-4F2A-85F1-167E63DA6D67}.Release|x64.Build.0 = Release|Any CPU {23D41678-453F-4F2A-85F1-167E63DA6D67}.Release|x86.ActiveCfg = Release|Any CPU {23D41678-453F-4F2A-85F1-167E63DA6D67}.Release|x86.Build.0 = Release|Any CPU - {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|arm.ActiveCfg = Debug|Any CPU - {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|arm64.ActiveCfg = Debug|Any CPU - {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|x64.ActiveCfg = Debug|Any CPU - {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|x86.ActiveCfg = Debug|Any CPU + {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|arm.ActiveCfg = Debug|Any CPU + {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|arm64.ActiveCfg = Debug|Any CPU + {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|x64.ActiveCfg = Debug|Any CPU + {23D41678-453F-4F2A-85F1-167E63DA6D67}.Checked|x86.ActiveCfg = Debug|Any CPU {6790611D-ACE0-47C6-83E0-E404364B5210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6790611D-ACE0-47C6-83E0-E404364B5210}.Debug|Any CPU.Build.0 = Debug|Any CPU {6790611D-ACE0-47C6-83E0-E404364B5210}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1114,11 +1105,11 @@ Global {6790611D-ACE0-47C6-83E0-E404364B5210}.Release|x64.Build.0 = Release|Any CPU {6790611D-ACE0-47C6-83E0-E404364B5210}.Release|x86.ActiveCfg = Release|Any CPU {6790611D-ACE0-47C6-83E0-E404364B5210}.Release|x86.Build.0 = Release|Any CPU - {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|arm.ActiveCfg = Debug|Any CPU - {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|arm64.ActiveCfg = Debug|Any CPU - {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|x64.ActiveCfg = Debug|Any CPU - {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|x86.ActiveCfg = Debug|Any CPU + {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|arm.ActiveCfg = Debug|Any CPU + {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|arm64.ActiveCfg = Debug|Any CPU + {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|x64.ActiveCfg = Debug|Any CPU + {6790611D-ACE0-47C6-83E0-E404364B5210}.Checked|x86.ActiveCfg = Debug|Any CPU {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Debug|Any CPU.Build.0 = Debug|Any CPU {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1135,11 +1126,11 @@ Global {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Release|x64.Build.0 = Release|Any CPU {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Release|x86.ActiveCfg = Release|Any CPU {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Release|x86.Build.0 = Release|Any CPU - {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|arm.ActiveCfg = Debug|Any CPU - {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|x64.ActiveCfg = Debug|Any CPU - {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|x86.ActiveCfg = Debug|Any CPU + {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|arm.ActiveCfg = Debug|Any CPU + {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|arm64.ActiveCfg = Debug|Any CPU + {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|x64.ActiveCfg = Debug|Any CPU + {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9}.Checked|x86.ActiveCfg = Debug|Any CPU {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Debug|Any CPU.Build.0 = Debug|Any CPU {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1156,11 +1147,32 @@ Global {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Release|x64.Build.0 = Release|Any CPU {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Release|x86.ActiveCfg = Release|Any CPU {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Release|x86.Build.0 = Release|Any CPU - {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|arm.ActiveCfg = Debug|Any CPU - {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|x64.ActiveCfg = Debug|Any CPU - {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|x86.ActiveCfg = Debug|Any CPU + {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|arm.ActiveCfg = Debug|Any CPU + {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|x64.ActiveCfg = Debug|Any CPU + {B73090B8-20CB-4586-A586-B7F37C1A06FF}.Checked|x86.ActiveCfg = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|arm.ActiveCfg = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|arm64.ActiveCfg = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|x64.ActiveCfg = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|x64.Build.0 = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|x86.ActiveCfg = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Debug|x86.Build.0 = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|Any CPU.Build.0 = Release|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|arm.ActiveCfg = Release|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|arm64.ActiveCfg = Release|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|x64.ActiveCfg = Release|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|x64.Build.0 = Release|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|x86.ActiveCfg = Release|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Release|x86.Build.0 = Release|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Checked|arm.ActiveCfg = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Checked|x64.ActiveCfg = Debug|Any CPU + {4C1F2761-857C-40A4-8CDD-7139380DA4D7}.Checked|x86.ActiveCfg = Debug|Any CPU {70441C80-1F14-42F9-8225-A891E3C9A82A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {70441C80-1F14-42F9-8225-A891E3C9A82A}.Debug|Any CPU.Build.0 = Debug|Any CPU {70441C80-1F14-42F9-8225-A891E3C9A82A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1177,11 +1189,11 @@ Global {70441C80-1F14-42F9-8225-A891E3C9A82A}.Release|x64.Build.0 = Release|Any CPU {70441C80-1F14-42F9-8225-A891E3C9A82A}.Release|x86.ActiveCfg = Release|Any CPU {70441C80-1F14-42F9-8225-A891E3C9A82A}.Release|x86.Build.0 = Release|Any CPU - {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|arm.ActiveCfg = Debug|Any CPU - {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|x64.ActiveCfg = Debug|Any CPU - {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|x86.ActiveCfg = Debug|Any CPU + {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|arm.ActiveCfg = Debug|Any CPU + {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|x64.ActiveCfg = Debug|Any CPU + {70441C80-1F14-42F9-8225-A891E3C9A82A}.Checked|x86.ActiveCfg = Debug|Any CPU {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1198,11 +1210,11 @@ Global {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Release|x64.Build.0 = Release|Any CPU {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Release|x86.ActiveCfg = Release|Any CPU {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Release|x86.Build.0 = Release|Any CPU - {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|arm.ActiveCfg = Debug|Any CPU - {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|x64.ActiveCfg = Debug|Any CPU - {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|x86.ActiveCfg = Debug|Any CPU + {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|arm.ActiveCfg = Debug|Any CPU + {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|x64.ActiveCfg = Debug|Any CPU + {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6}.Checked|x86.ActiveCfg = Debug|Any CPU {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Debug|Any CPU.Build.0 = Debug|Any CPU {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1219,11 +1231,11 @@ Global {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Release|x64.Build.0 = Release|Any CPU {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Release|x86.ActiveCfg = Release|Any CPU {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Release|x86.Build.0 = Release|Any CPU - {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|arm.ActiveCfg = Debug|Any CPU - {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|arm64.ActiveCfg = Debug|Any CPU - {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|x64.ActiveCfg = Debug|Any CPU - {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|x86.ActiveCfg = Debug|Any CPU + {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|arm.ActiveCfg = Debug|Any CPU + {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|x64.ActiveCfg = Debug|Any CPU + {1C44735B-C77E-479A-ABBB-8B6EB83299CF}.Checked|x86.ActiveCfg = Debug|Any CPU {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Debug|Any CPU.Build.0 = Debug|Any CPU {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1240,11 +1252,11 @@ Global {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Release|x64.Build.0 = Release|Any CPU {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Release|x86.ActiveCfg = Release|Any CPU {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Release|x86.Build.0 = Release|Any CPU - {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|arm.ActiveCfg = Debug|Any CPU - {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|x64.ActiveCfg = Debug|Any CPU - {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|x86.ActiveCfg = Debug|Any CPU + {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|arm.ActiveCfg = Debug|Any CPU + {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|arm64.ActiveCfg = Debug|Any CPU + {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|x64.ActiveCfg = Debug|Any CPU + {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531}.Checked|x86.ActiveCfg = Debug|Any CPU {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Debug|Any CPU.Build.0 = Debug|Any CPU {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1261,11 +1273,11 @@ Global {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Release|x64.Build.0 = Release|Any CPU {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Release|x86.ActiveCfg = Release|Any CPU {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Release|x86.Build.0 = Release|Any CPU - {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|arm.ActiveCfg = Debug|Any CPU - {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|arm64.ActiveCfg = Debug|Any CPU - {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|x64.ActiveCfg = Debug|Any CPU - {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|x86.ActiveCfg = Debug|Any CPU + {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|arm.ActiveCfg = Debug|Any CPU + {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|x64.ActiveCfg = Debug|Any CPU + {CA97D5F2-4D71-4448-8DEB-E18C237C76B3}.Checked|x86.ActiveCfg = Debug|Any CPU {988AECC5-6EB4-48AB-9467-3FB63619631B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {988AECC5-6EB4-48AB-9467-3FB63619631B}.Debug|Any CPU.Build.0 = Debug|Any CPU {988AECC5-6EB4-48AB-9467-3FB63619631B}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1282,11 +1294,32 @@ Global {988AECC5-6EB4-48AB-9467-3FB63619631B}.Release|x64.Build.0 = Release|Any CPU {988AECC5-6EB4-48AB-9467-3FB63619631B}.Release|x86.ActiveCfg = Release|Any CPU {988AECC5-6EB4-48AB-9467-3FB63619631B}.Release|x86.Build.0 = Release|Any CPU - {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|arm.ActiveCfg = Debug|Any CPU - {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|x64.ActiveCfg = Debug|Any CPU - {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|x86.ActiveCfg = Debug|Any CPU + {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|arm.ActiveCfg = Debug|Any CPU + {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|arm64.ActiveCfg = Debug|Any CPU + {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|x64.ActiveCfg = Debug|Any CPU + {988AECC5-6EB4-48AB-9467-3FB63619631B}.Checked|x86.ActiveCfg = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|arm.ActiveCfg = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|arm64.ActiveCfg = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|x64.ActiveCfg = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|x64.Build.0 = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|x86.ActiveCfg = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Debug|x86.Build.0 = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Release|Any CPU.Build.0 = Release|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Release|arm.ActiveCfg = Release|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Release|arm64.ActiveCfg = Release|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Release|x64.ActiveCfg = Release|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Release|x64.Build.0 = Release|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Release|x86.ActiveCfg = Release|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Release|x86.Build.0 = Release|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Checked|arm.ActiveCfg = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Checked|x64.ActiveCfg = Debug|Any CPU + {C5F86889-E147-4424-9165-D2DF453741F2}.Checked|x86.ActiveCfg = Debug|Any CPU {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Debug|Any CPU.Build.0 = Debug|Any CPU {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1303,11 +1336,11 @@ Global {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Release|x64.Build.0 = Release|Any CPU {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Release|x86.ActiveCfg = Release|Any CPU {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Release|x86.Build.0 = Release|Any CPU - {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|arm.ActiveCfg = Debug|Any CPU - {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|arm64.ActiveCfg = Debug|Any CPU - {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|x64.ActiveCfg = Debug|Any CPU - {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|x86.ActiveCfg = Debug|Any CPU + {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|arm.ActiveCfg = Debug|Any CPU + {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|x64.ActiveCfg = Debug|Any CPU + {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E}.Checked|x86.ActiveCfg = Debug|Any CPU {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Debug|Any CPU.Build.0 = Debug|Any CPU {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1324,11 +1357,11 @@ Global {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Release|x64.Build.0 = Release|Any CPU {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Release|x86.ActiveCfg = Release|Any CPU {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Release|x86.Build.0 = Release|Any CPU - {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|arm.ActiveCfg = Debug|Any CPU - {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|arm64.ActiveCfg = Debug|Any CPU - {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|x64.ActiveCfg = Debug|Any CPU - {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|x86.ActiveCfg = Debug|Any CPU + {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|arm.ActiveCfg = Debug|Any CPU + {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|arm64.ActiveCfg = Debug|Any CPU + {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|x64.ActiveCfg = Debug|Any CPU + {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12}.Checked|x86.ActiveCfg = Debug|Any CPU {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1345,11 +1378,11 @@ Global {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Release|x64.Build.0 = Release|Any CPU {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Release|x86.ActiveCfg = Release|Any CPU {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Release|x86.Build.0 = Release|Any CPU - {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|arm.ActiveCfg = Debug|Any CPU - {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|arm64.ActiveCfg = Debug|Any CPU - {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|x64.ActiveCfg = Debug|Any CPU - {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|x86.ActiveCfg = Debug|Any CPU + {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|arm.ActiveCfg = Debug|Any CPU + {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|arm64.ActiveCfg = Debug|Any CPU + {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|x64.ActiveCfg = Debug|Any CPU + {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9}.Checked|x86.ActiveCfg = Debug|Any CPU {32247916-74DE-4A62-AE68-04976D2B0149}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {32247916-74DE-4A62-AE68-04976D2B0149}.Debug|Any CPU.Build.0 = Debug|Any CPU {32247916-74DE-4A62-AE68-04976D2B0149}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1366,13 +1399,13 @@ Global {32247916-74DE-4A62-AE68-04976D2B0149}.Release|x64.Build.0 = Release|Any CPU {32247916-74DE-4A62-AE68-04976D2B0149}.Release|x86.ActiveCfg = Release|Any CPU {32247916-74DE-4A62-AE68-04976D2B0149}.Release|x86.Build.0 = Release|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|arm.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|arm64.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|x64.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|x86.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|arm.ActiveCfg = Debug|Any CPU + {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|arm64.ActiveCfg = Debug|Any CPU + {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|x64.ActiveCfg = Debug|Any CPU + {32247916-74DE-4A62-AE68-04976D2B0149}.Checked|x86.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|Any CPU.Build.0 = Debug|Any CPU {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|arm.ActiveCfg = Debug|Any CPU {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|arm64.ActiveCfg = Debug|Any CPU {5090E2BE-4BC9-4027-BF67-452049996F43}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1387,11 +1420,11 @@ Global {5090E2BE-4BC9-4027-BF67-452049996F43}.Release|x64.Build.0 = Release|Any CPU {5090E2BE-4BC9-4027-BF67-452049996F43}.Release|x86.ActiveCfg = Release|Any CPU {5090E2BE-4BC9-4027-BF67-452049996F43}.Release|x86.Build.0 = Release|Any CPU - {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|arm.ActiveCfg = Debug|Any CPU - {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|arm64.ActiveCfg = Debug|Any CPU - {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|x64.ActiveCfg = Debug|Any CPU - {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|x86.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|arm.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|arm64.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|x64.ActiveCfg = Debug|Any CPU + {5090E2BE-4BC9-4027-BF67-452049996F43}.Checked|x86.ActiveCfg = Debug|Any CPU {61164A2A-D90F-4122-AF5D-9704564E80E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {61164A2A-D90F-4122-AF5D-9704564E80E0}.Debug|Any CPU.Build.0 = Debug|Any CPU {61164A2A-D90F-4122-AF5D-9704564E80E0}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1408,11 +1441,11 @@ Global {61164A2A-D90F-4122-AF5D-9704564E80E0}.Release|x64.Build.0 = Release|Any CPU {61164A2A-D90F-4122-AF5D-9704564E80E0}.Release|x86.ActiveCfg = Release|Any CPU {61164A2A-D90F-4122-AF5D-9704564E80E0}.Release|x86.Build.0 = Release|Any CPU - {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|arm.ActiveCfg = Debug|Any CPU - {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|x64.ActiveCfg = Debug|Any CPU - {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|x86.ActiveCfg = Debug|Any CPU + {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|arm.ActiveCfg = Debug|Any CPU + {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|arm64.ActiveCfg = Debug|Any CPU + {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|x64.ActiveCfg = Debug|Any CPU + {61164A2A-D90F-4122-AF5D-9704564E80E0}.Checked|x86.ActiveCfg = Debug|Any CPU {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Debug|Any CPU.Build.0 = Debug|Any CPU {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1429,11 +1462,11 @@ Global {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Release|x64.Build.0 = Release|Any CPU {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Release|x86.ActiveCfg = Release|Any CPU {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Release|x86.Build.0 = Release|Any CPU - {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|arm.ActiveCfg = Debug|Any CPU - {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|arm64.ActiveCfg = Debug|Any CPU - {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|x64.ActiveCfg = Debug|Any CPU - {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|x86.ActiveCfg = Debug|Any CPU + {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|arm.ActiveCfg = Debug|Any CPU + {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|x64.ActiveCfg = Debug|Any CPU + {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6}.Checked|x86.ActiveCfg = Debug|Any CPU {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Debug|Any CPU.Build.0 = Debug|Any CPU {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1450,11 +1483,11 @@ Global {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Release|x64.Build.0 = Release|Any CPU {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Release|x86.ActiveCfg = Release|Any CPU {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Release|x86.Build.0 = Release|Any CPU - {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|arm.ActiveCfg = Debug|Any CPU - {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|x64.ActiveCfg = Debug|Any CPU - {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|x86.ActiveCfg = Debug|Any CPU + {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|arm.ActiveCfg = Debug|Any CPU + {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|arm64.ActiveCfg = Debug|Any CPU + {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|x64.ActiveCfg = Debug|Any CPU + {652F0921-C134-4882-A9D0-0CBB2F8D75B2}.Checked|x86.ActiveCfg = Debug|Any CPU {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Debug|Any CPU.Build.0 = Debug|Any CPU {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1471,11 +1504,11 @@ Global {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Release|x64.Build.0 = Release|Any CPU {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Release|x86.ActiveCfg = Release|Any CPU {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Release|x86.Build.0 = Release|Any CPU - {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|arm.ActiveCfg = Debug|Any CPU - {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|x64.ActiveCfg = Debug|Any CPU - {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|x86.ActiveCfg = Debug|Any CPU + {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|arm.ActiveCfg = Debug|Any CPU + {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|x64.ActiveCfg = Debug|Any CPU + {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016}.Checked|x86.ActiveCfg = Debug|Any CPU {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Debug|Any CPU.Build.0 = Debug|Any CPU {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1492,11 +1525,11 @@ Global {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Release|x64.Build.0 = Release|Any CPU {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Release|x86.ActiveCfg = Release|Any CPU {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Release|x86.Build.0 = Release|Any CPU - {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|arm.ActiveCfg = Debug|Any CPU - {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|x64.ActiveCfg = Debug|Any CPU - {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|x86.ActiveCfg = Debug|Any CPU + {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|arm.ActiveCfg = Debug|Any CPU + {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|x64.ActiveCfg = Debug|Any CPU + {CFC724F4-18A2-401F-AED4-7D7A779CE3EA}.Checked|x86.ActiveCfg = Debug|Any CPU {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Debug|Any CPU.Build.0 = Debug|Any CPU {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1513,11 +1546,11 @@ Global {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Release|x64.Build.0 = Release|Any CPU {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Release|x86.ActiveCfg = Release|Any CPU {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Release|x86.Build.0 = Release|Any CPU - {E73952E5-C929-4566-962A-B9AF65289871}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E73952E5-C929-4566-962A-B9AF65289871}.Checked|arm.ActiveCfg = Debug|Any CPU - {E73952E5-C929-4566-962A-B9AF65289871}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E73952E5-C929-4566-962A-B9AF65289871}.Checked|x64.ActiveCfg = Debug|Any CPU - {E73952E5-C929-4566-962A-B9AF65289871}.Checked|x86.ActiveCfg = Debug|Any CPU + {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|arm.ActiveCfg = Debug|Any CPU + {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|x64.ActiveCfg = Debug|Any CPU + {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B}.Checked|x86.ActiveCfg = Debug|Any CPU {E73952E5-C929-4566-962A-B9AF65289871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E73952E5-C929-4566-962A-B9AF65289871}.Debug|Any CPU.Build.0 = Debug|Any CPU {E73952E5-C929-4566-962A-B9AF65289871}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1534,11 +1567,11 @@ Global {E73952E5-C929-4566-962A-B9AF65289871}.Release|x64.Build.0 = Release|Any CPU {E73952E5-C929-4566-962A-B9AF65289871}.Release|x86.ActiveCfg = Release|Any CPU {E73952E5-C929-4566-962A-B9AF65289871}.Release|x86.Build.0 = Release|Any CPU - {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|arm.ActiveCfg = Debug|Any CPU - {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|x64.ActiveCfg = Debug|Any CPU - {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|x86.ActiveCfg = Debug|Any CPU + {E73952E5-C929-4566-962A-B9AF65289871}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E73952E5-C929-4566-962A-B9AF65289871}.Checked|arm.ActiveCfg = Debug|Any CPU + {E73952E5-C929-4566-962A-B9AF65289871}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E73952E5-C929-4566-962A-B9AF65289871}.Checked|x64.ActiveCfg = Debug|Any CPU + {E73952E5-C929-4566-962A-B9AF65289871}.Checked|x86.ActiveCfg = Debug|Any CPU {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Debug|Any CPU.Build.0 = Debug|Any CPU {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1555,11 +1588,11 @@ Global {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Release|x64.Build.0 = Release|Any CPU {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Release|x86.ActiveCfg = Release|Any CPU {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Release|x86.Build.0 = Release|Any CPU - {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|arm.ActiveCfg = Debug|Any CPU - {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|x64.ActiveCfg = Debug|Any CPU - {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|x86.ActiveCfg = Debug|Any CPU + {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|arm.ActiveCfg = Debug|Any CPU + {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|x64.ActiveCfg = Debug|Any CPU + {9299BE78-5A00-425A-A38F-7F1DC9C3F63E}.Checked|x86.ActiveCfg = Debug|Any CPU {A6D86695-D570-43F9-99A3-6C7445362D53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A6D86695-D570-43F9-99A3-6C7445362D53}.Debug|Any CPU.Build.0 = Debug|Any CPU {A6D86695-D570-43F9-99A3-6C7445362D53}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1576,11 +1609,11 @@ Global {A6D86695-D570-43F9-99A3-6C7445362D53}.Release|x64.Build.0 = Release|Any CPU {A6D86695-D570-43F9-99A3-6C7445362D53}.Release|x86.ActiveCfg = Release|Any CPU {A6D86695-D570-43F9-99A3-6C7445362D53}.Release|x86.Build.0 = Release|Any CPU - {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|arm.ActiveCfg = Debug|Any CPU - {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|x64.ActiveCfg = Debug|Any CPU - {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|x86.ActiveCfg = Debug|Any CPU + {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|arm.ActiveCfg = Debug|Any CPU + {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|x64.ActiveCfg = Debug|Any CPU + {A6D86695-D570-43F9-99A3-6C7445362D53}.Checked|x86.ActiveCfg = Debug|Any CPU {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Debug|Any CPU.Build.0 = Debug|Any CPU {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1597,11 +1630,11 @@ Global {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Release|x64.Build.0 = Release|Any CPU {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Release|x86.ActiveCfg = Release|Any CPU {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Release|x86.Build.0 = Release|Any CPU - {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|arm.ActiveCfg = Debug|Any CPU - {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|arm64.ActiveCfg = Debug|Any CPU - {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|x64.ActiveCfg = Debug|Any CPU - {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|x86.ActiveCfg = Debug|Any CPU + {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|arm.ActiveCfg = Debug|Any CPU + {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|x64.ActiveCfg = Debug|Any CPU + {852EA6A6-CED9-467C-9B58-9983ADBEA89A}.Checked|x86.ActiveCfg = Debug|Any CPU {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Debug|Any CPU.Build.0 = Debug|Any CPU {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1618,11 +1651,11 @@ Global {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Release|x64.Build.0 = Release|Any CPU {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Release|x86.ActiveCfg = Release|Any CPU {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Release|x86.Build.0 = Release|Any CPU - {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|arm.ActiveCfg = Debug|Any CPU - {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|x64.ActiveCfg = Debug|Any CPU - {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|x86.ActiveCfg = Debug|Any CPU + {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|arm.ActiveCfg = Debug|Any CPU + {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|arm64.ActiveCfg = Debug|Any CPU + {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|x64.ActiveCfg = Debug|Any CPU + {259CC89C-F5E0-4CF0-92FA-3075E0142589}.Checked|x86.ActiveCfg = Debug|Any CPU {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Debug|Any CPU.Build.0 = Debug|Any CPU {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1639,11 +1672,11 @@ Global {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Release|x64.Build.0 = Release|Any CPU {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Release|x86.ActiveCfg = Release|Any CPU {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Release|x86.Build.0 = Release|Any CPU - {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|arm.ActiveCfg = Debug|Any CPU - {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|arm64.ActiveCfg = Debug|Any CPU - {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|x64.ActiveCfg = Debug|Any CPU - {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|x86.ActiveCfg = Debug|Any CPU + {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|arm.ActiveCfg = Debug|Any CPU + {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|x64.ActiveCfg = Debug|Any CPU + {E884B43D-FD9D-41C6-9C1D-5F49C472032D}.Checked|x86.ActiveCfg = Debug|Any CPU {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1660,11 +1693,11 @@ Global {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Release|x64.Build.0 = Release|Any CPU {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Release|x86.ActiveCfg = Release|Any CPU {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Release|x86.Build.0 = Release|Any CPU - {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|arm.ActiveCfg = Debug|Any CPU - {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|x64.ActiveCfg = Debug|Any CPU - {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|x86.ActiveCfg = Debug|Any CPU + {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|arm.ActiveCfg = Debug|Any CPU + {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|arm64.ActiveCfg = Debug|Any CPU + {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|x64.ActiveCfg = Debug|Any CPU + {8C5E25F3-C1ED-44DC-9019-D60E5CD24BDB}.Checked|x86.ActiveCfg = Debug|Any CPU {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Debug|Any CPU.Build.0 = Debug|Any CPU {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1681,11 +1714,11 @@ Global {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Release|x64.Build.0 = Release|Any CPU {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Release|x86.ActiveCfg = Release|Any CPU {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Release|x86.Build.0 = Release|Any CPU - {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|arm.ActiveCfg = Debug|Any CPU - {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|x64.ActiveCfg = Debug|Any CPU - {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|x86.ActiveCfg = Debug|Any CPU + {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|arm.ActiveCfg = Debug|Any CPU + {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|x64.ActiveCfg = Debug|Any CPU + {0B62ADE9-B3E6-4727-8F35-6C7A46B0DB1C}.Checked|x86.ActiveCfg = Debug|Any CPU {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Debug|Any CPU.Build.0 = Debug|Any CPU {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1702,11 +1735,11 @@ Global {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Release|x64.Build.0 = Release|Any CPU {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Release|x86.ActiveCfg = Release|Any CPU {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Release|x86.Build.0 = Release|Any CPU - {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|arm.ActiveCfg = Debug|Any CPU - {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|arm64.ActiveCfg = Debug|Any CPU - {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|x64.ActiveCfg = Debug|Any CPU - {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|x86.ActiveCfg = Debug|Any CPU + {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|arm.ActiveCfg = Debug|Any CPU + {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|x64.ActiveCfg = Debug|Any CPU + {9DE2AE90-EB4B-45D6-84AD-A4C4FAEF5658}.Checked|x86.ActiveCfg = Debug|Any CPU {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Debug|Any CPU.Build.0 = Debug|Any CPU {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1723,11 +1756,11 @@ Global {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Release|x64.Build.0 = Release|Any CPU {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Release|x86.ActiveCfg = Release|Any CPU {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Release|x86.Build.0 = Release|Any CPU - {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|arm.ActiveCfg = Debug|Any CPU - {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|x64.ActiveCfg = Debug|Any CPU - {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|x86.ActiveCfg = Debug|Any CPU + {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|arm.ActiveCfg = Debug|Any CPU + {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|arm64.ActiveCfg = Debug|Any CPU + {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|x64.ActiveCfg = Debug|Any CPU + {A5260207-E621-4792-A09D-9DF5DA16FFE6}.Checked|x86.ActiveCfg = Debug|Any CPU {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Debug|Any CPU.Build.0 = Debug|Any CPU {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1744,11 +1777,11 @@ Global {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Release|x64.Build.0 = Release|Any CPU {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Release|x86.ActiveCfg = Release|Any CPU {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Release|x86.Build.0 = Release|Any CPU - {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|arm.ActiveCfg = Debug|Any CPU - {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|x64.ActiveCfg = Debug|Any CPU - {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|x86.ActiveCfg = Debug|Any CPU + {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|arm.ActiveCfg = Debug|Any CPU + {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|x64.ActiveCfg = Debug|Any CPU + {55C65AC8-0FC0-4A3B-B342-61D4686ABB9A}.Checked|x86.ActiveCfg = Debug|Any CPU {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Debug|Any CPU.Build.0 = Debug|Any CPU {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1765,11 +1798,11 @@ Global {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Release|x64.Build.0 = Release|Any CPU {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Release|x86.ActiveCfg = Release|Any CPU {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Release|x86.Build.0 = Release|Any CPU - {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|arm.ActiveCfg = Debug|Any CPU - {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|arm64.ActiveCfg = Debug|Any CPU - {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|x64.ActiveCfg = Debug|Any CPU - {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|x86.ActiveCfg = Debug|Any CPU + {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|arm.ActiveCfg = Debug|Any CPU + {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|x64.ActiveCfg = Debug|Any CPU + {D592CC73-099B-499C-80E6-FFBE5E4FA14A}.Checked|x86.ActiveCfg = Debug|Any CPU {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Debug|Any CPU.Build.0 = Debug|Any CPU {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1786,11 +1819,11 @@ Global {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Release|x64.Build.0 = Release|Any CPU {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Release|x86.ActiveCfg = Release|Any CPU {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Release|x86.Build.0 = Release|Any CPU - {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|arm.ActiveCfg = Debug|Any CPU - {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|x64.ActiveCfg = Debug|Any CPU - {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|x86.ActiveCfg = Debug|Any CPU + {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|arm.ActiveCfg = Debug|Any CPU + {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|arm64.ActiveCfg = Debug|Any CPU + {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|x64.ActiveCfg = Debug|Any CPU + {3E97D9E1-4C2B-4FA2-98F7-977B593F8DB5}.Checked|x86.ActiveCfg = Debug|Any CPU {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Debug|Any CPU.Build.0 = Debug|Any CPU {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1807,11 +1840,11 @@ Global {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Release|x64.Build.0 = Release|Any CPU {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Release|x86.ActiveCfg = Release|Any CPU {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Release|x86.Build.0 = Release|Any CPU - {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|arm.ActiveCfg = Debug|Any CPU - {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|arm64.ActiveCfg = Debug|Any CPU - {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|x64.ActiveCfg = Debug|Any CPU - {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|x86.ActiveCfg = Debug|Any CPU + {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|arm.ActiveCfg = Debug|Any CPU + {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|x64.ActiveCfg = Debug|Any CPU + {E4C5F6D3-6D72-4FFF-8421-EBE879AD8501}.Checked|x86.ActiveCfg = Debug|Any CPU {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Debug|Any CPU.Build.0 = Debug|Any CPU {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1828,11 +1861,11 @@ Global {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Release|x64.Build.0 = Release|Any CPU {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Release|x86.ActiveCfg = Release|Any CPU {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Release|x86.Build.0 = Release|Any CPU - {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|arm.ActiveCfg = Debug|Any CPU - {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|x64.ActiveCfg = Debug|Any CPU - {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|x86.ActiveCfg = Debug|Any CPU + {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|arm.ActiveCfg = Debug|Any CPU + {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|arm64.ActiveCfg = Debug|Any CPU + {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|x64.ActiveCfg = Debug|Any CPU + {673597FC-FDC9-46A8-B503-D670FC9BD22E}.Checked|x86.ActiveCfg = Debug|Any CPU {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Debug|Any CPU.Build.0 = Debug|Any CPU {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1849,11 +1882,11 @@ Global {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Release|x64.Build.0 = Release|Any CPU {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Release|x86.ActiveCfg = Release|Any CPU {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Release|x86.Build.0 = Release|Any CPU - {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|arm.ActiveCfg = Debug|Any CPU - {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|x64.ActiveCfg = Debug|Any CPU - {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|x86.ActiveCfg = Debug|Any CPU + {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|arm.ActiveCfg = Debug|Any CPU + {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|x64.ActiveCfg = Debug|Any CPU + {F17096B7-5C4E-4FE0-BD5A-0180C0D34B6A}.Checked|x86.ActiveCfg = Debug|Any CPU {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Debug|Any CPU.Build.0 = Debug|Any CPU {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1870,11 +1903,11 @@ Global {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Release|x64.Build.0 = Release|Any CPU {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Release|x86.ActiveCfg = Release|Any CPU {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Release|x86.Build.0 = Release|Any CPU - {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|arm.ActiveCfg = Debug|Any CPU - {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|arm64.ActiveCfg = Debug|Any CPU - {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|x64.ActiveCfg = Debug|Any CPU - {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|x86.ActiveCfg = Debug|Any CPU + {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|arm.ActiveCfg = Debug|Any CPU + {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|x64.ActiveCfg = Debug|Any CPU + {CC8D4A15-9101-4041-B992-B6AA4D5F3C64}.Checked|x86.ActiveCfg = Debug|Any CPU {049319F0-D438-404C-A6D4-4D1E99DAE647}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {049319F0-D438-404C-A6D4-4D1E99DAE647}.Debug|Any CPU.Build.0 = Debug|Any CPU {049319F0-D438-404C-A6D4-4D1E99DAE647}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1891,15 +1924,15 @@ Global {049319F0-D438-404C-A6D4-4D1E99DAE647}.Release|x64.Build.0 = Release|Any CPU {049319F0-D438-404C-A6D4-4D1E99DAE647}.Release|x86.ActiveCfg = Release|Any CPU {049319F0-D438-404C-A6D4-4D1E99DAE647}.Release|x86.Build.0 = Release|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|arm.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|arm64.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|x64.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|x86.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|Any CPU.Build.0 = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|arm.ActiveCfg = Debug|Any CPU - {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|arm64.ActiveCfg = Debug|Any CPU + {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|arm.ActiveCfg = Debug|Any CPU + {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|arm64.ActiveCfg = Debug|Any CPU + {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|x64.ActiveCfg = Debug|Any CPU + {049319F0-D438-404C-A6D4-4D1E99DAE647}.Checked|x86.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|Any CPU.Build.0 = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|arm.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|arm64.ActiveCfg = Debug|Any CPU {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|x64.ActiveCfg = Debug|Any CPU {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|x64.Build.0 = Debug|Any CPU {691D460F-764F-48E7-9A3F-7D1A32388542}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -1912,11 +1945,11 @@ Global {691D460F-764F-48E7-9A3F-7D1A32388542}.Release|x64.Build.0 = Release|Any CPU {691D460F-764F-48E7-9A3F-7D1A32388542}.Release|x86.ActiveCfg = Release|Any CPU {691D460F-764F-48E7-9A3F-7D1A32388542}.Release|x86.Build.0 = Release|Any CPU - {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|arm.ActiveCfg = Debug|Any CPU - {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|x64.ActiveCfg = Debug|Any CPU - {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|x86.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|arm.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|arm64.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|x64.ActiveCfg = Debug|Any CPU + {691D460F-764F-48E7-9A3F-7D1A32388542}.Checked|x86.ActiveCfg = Debug|Any CPU {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1933,11 +1966,11 @@ Global {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Release|x64.Build.0 = Release|Any CPU {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Release|x86.ActiveCfg = Release|Any CPU {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Release|x86.Build.0 = Release|Any CPU - {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|arm.ActiveCfg = Debug|Any CPU - {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|arm64.ActiveCfg = Debug|Any CPU - {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|x64.ActiveCfg = Debug|Any CPU - {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|x86.ActiveCfg = Debug|Any CPU + {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|arm.ActiveCfg = Debug|Any CPU + {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|x64.ActiveCfg = Debug|Any CPU + {9F1AC402-BFAD-4EA2-AD31-BBCA73375953}.Checked|x86.ActiveCfg = Debug|Any CPU {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Debug|Any CPU.Build.0 = Debug|Any CPU {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1954,11 +1987,11 @@ Global {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Release|x64.Build.0 = Release|Any CPU {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Release|x86.ActiveCfg = Release|Any CPU {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Release|x86.Build.0 = Release|Any CPU - {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|arm.ActiveCfg = Debug|Any CPU - {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|x64.ActiveCfg = Debug|Any CPU - {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|x86.ActiveCfg = Debug|Any CPU + {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|arm.ActiveCfg = Debug|Any CPU + {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|arm64.ActiveCfg = Debug|Any CPU + {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|x64.ActiveCfg = Debug|Any CPU + {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1}.Checked|x86.ActiveCfg = Debug|Any CPU {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Debug|Any CPU.Build.0 = Debug|Any CPU {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1975,11 +2008,11 @@ Global {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Release|x64.Build.0 = Release|Any CPU {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Release|x86.ActiveCfg = Release|Any CPU {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Release|x86.Build.0 = Release|Any CPU - {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|arm.ActiveCfg = Debug|Any CPU - {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|x64.ActiveCfg = Debug|Any CPU - {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|x86.ActiveCfg = Debug|Any CPU + {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|arm.ActiveCfg = Debug|Any CPU + {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|x64.ActiveCfg = Debug|Any CPU + {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C}.Checked|x86.ActiveCfg = Debug|Any CPU {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Debug|Any CPU.Build.0 = Debug|Any CPU {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -1996,11 +2029,11 @@ Global {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Release|x64.Build.0 = Release|Any CPU {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Release|x86.ActiveCfg = Release|Any CPU {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Release|x86.Build.0 = Release|Any CPU - {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|arm.ActiveCfg = Debug|Any CPU - {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|arm64.ActiveCfg = Debug|Any CPU - {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|x64.ActiveCfg = Debug|Any CPU - {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|x86.ActiveCfg = Debug|Any CPU + {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|arm.ActiveCfg = Debug|Any CPU + {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|x64.ActiveCfg = Debug|Any CPU + {E88FDBA9-3D1D-480D-8AB3-341C9E442D03}.Checked|x86.ActiveCfg = Debug|Any CPU {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Debug|Any CPU.Build.0 = Debug|Any CPU {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2017,11 +2050,11 @@ Global {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Release|x64.Build.0 = Release|Any CPU {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Release|x86.ActiveCfg = Release|Any CPU {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Release|x86.Build.0 = Release|Any CPU - {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|arm.ActiveCfg = Debug|Any CPU - {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|x64.ActiveCfg = Debug|Any CPU - {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|x86.ActiveCfg = Debug|Any CPU + {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|arm.ActiveCfg = Debug|Any CPU + {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|arm64.ActiveCfg = Debug|Any CPU + {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|x64.ActiveCfg = Debug|Any CPU + {AD4767E9-57F6-47DD-ABD3-D3AFDF384703}.Checked|x86.ActiveCfg = Debug|Any CPU {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Debug|Any CPU.Build.0 = Debug|Any CPU {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2038,11 +2071,11 @@ Global {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Release|x64.Build.0 = Release|Any CPU {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Release|x86.ActiveCfg = Release|Any CPU {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Release|x86.Build.0 = Release|Any CPU - {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|arm.ActiveCfg = Debug|Any CPU - {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|arm64.ActiveCfg = Debug|Any CPU - {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|x64.ActiveCfg = Debug|Any CPU - {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|x86.ActiveCfg = Debug|Any CPU + {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|arm.ActiveCfg = Debug|Any CPU + {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|x64.ActiveCfg = Debug|Any CPU + {E1847313-0072-49CA-A1E6-6C05CECAB77A}.Checked|x86.ActiveCfg = Debug|Any CPU {D86CC877-79A0-4AFA-9A76-7263B414614D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D86CC877-79A0-4AFA-9A76-7263B414614D}.Debug|Any CPU.Build.0 = Debug|Any CPU {D86CC877-79A0-4AFA-9A76-7263B414614D}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2059,11 +2092,11 @@ Global {D86CC877-79A0-4AFA-9A76-7263B414614D}.Release|x64.Build.0 = Release|Any CPU {D86CC877-79A0-4AFA-9A76-7263B414614D}.Release|x86.ActiveCfg = Release|Any CPU {D86CC877-79A0-4AFA-9A76-7263B414614D}.Release|x86.Build.0 = Release|Any CPU - {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|arm.ActiveCfg = Debug|Any CPU - {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|x64.ActiveCfg = Debug|Any CPU - {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|x86.ActiveCfg = Debug|Any CPU + {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|arm.ActiveCfg = Debug|Any CPU + {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|arm64.ActiveCfg = Debug|Any CPU + {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|x64.ActiveCfg = Debug|Any CPU + {D86CC877-79A0-4AFA-9A76-7263B414614D}.Checked|x86.ActiveCfg = Debug|Any CPU {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Debug|Any CPU.Build.0 = Debug|Any CPU {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2080,11 +2113,11 @@ Global {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Release|x64.Build.0 = Release|Any CPU {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Release|x86.ActiveCfg = Release|Any CPU {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Release|x86.Build.0 = Release|Any CPU - {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|arm.ActiveCfg = Debug|Any CPU - {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|arm64.ActiveCfg = Debug|Any CPU - {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|x64.ActiveCfg = Debug|Any CPU - {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|x86.ActiveCfg = Debug|Any CPU + {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|arm.ActiveCfg = Debug|Any CPU + {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|x64.ActiveCfg = Debug|Any CPU + {E5E5C278-EBB9-4704-B7BA-56D39A5A343C}.Checked|x86.ActiveCfg = Debug|Any CPU {59CD73F2-1310-46EE-B99A-594859FD8A37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {59CD73F2-1310-46EE-B99A-594859FD8A37}.Debug|Any CPU.Build.0 = Debug|Any CPU {59CD73F2-1310-46EE-B99A-594859FD8A37}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2101,11 +2134,11 @@ Global {59CD73F2-1310-46EE-B99A-594859FD8A37}.Release|x64.Build.0 = Release|Any CPU {59CD73F2-1310-46EE-B99A-594859FD8A37}.Release|x86.ActiveCfg = Release|Any CPU {59CD73F2-1310-46EE-B99A-594859FD8A37}.Release|x86.Build.0 = Release|Any CPU - {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|arm.ActiveCfg = Debug|Any CPU - {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|arm64.ActiveCfg = Debug|Any CPU - {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|x64.ActiveCfg = Debug|Any CPU - {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|x86.ActiveCfg = Debug|Any CPU + {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|arm.ActiveCfg = Debug|Any CPU + {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|arm64.ActiveCfg = Debug|Any CPU + {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|x64.ActiveCfg = Debug|Any CPU + {59CD73F2-1310-46EE-B99A-594859FD8A37}.Checked|x86.ActiveCfg = Debug|Any CPU {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Debug|Any CPU.Build.0 = Debug|Any CPU {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2122,11 +2155,11 @@ Global {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Release|x64.Build.0 = Release|Any CPU {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Release|x86.ActiveCfg = Release|Any CPU {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Release|x86.Build.0 = Release|Any CPU - {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|arm.ActiveCfg = Debug|Any CPU - {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|arm64.ActiveCfg = Debug|Any CPU - {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|x64.ActiveCfg = Debug|Any CPU - {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|x86.ActiveCfg = Debug|Any CPU + {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|arm.ActiveCfg = Debug|Any CPU + {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|arm64.ActiveCfg = Debug|Any CPU + {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|x64.ActiveCfg = Debug|Any CPU + {3D58505D-F17F-49E0-9131-42F273E3F5B9}.Checked|x86.ActiveCfg = Debug|Any CPU {0BF9F165-888D-486A-B6FD-6F3029913D70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0BF9F165-888D-486A-B6FD-6F3029913D70}.Debug|Any CPU.Build.0 = Debug|Any CPU {0BF9F165-888D-486A-B6FD-6F3029913D70}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2143,11 +2176,11 @@ Global {0BF9F165-888D-486A-B6FD-6F3029913D70}.Release|x64.Build.0 = Release|Any CPU {0BF9F165-888D-486A-B6FD-6F3029913D70}.Release|x86.ActiveCfg = Release|Any CPU {0BF9F165-888D-486A-B6FD-6F3029913D70}.Release|x86.Build.0 = Release|Any CPU - {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|arm.ActiveCfg = Debug|Any CPU - {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|x64.ActiveCfg = Debug|Any CPU - {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|x86.ActiveCfg = Debug|Any CPU + {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|arm.ActiveCfg = Debug|Any CPU + {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|arm64.ActiveCfg = Debug|Any CPU + {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|x64.ActiveCfg = Debug|Any CPU + {0BF9F165-888D-486A-B6FD-6F3029913D70}.Checked|x86.ActiveCfg = Debug|Any CPU {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Debug|Any CPU.Build.0 = Debug|Any CPU {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2164,11 +2197,11 @@ Global {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Release|x64.Build.0 = Release|Any CPU {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Release|x86.ActiveCfg = Release|Any CPU {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Release|x86.Build.0 = Release|Any CPU - {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|arm.ActiveCfg = Debug|Any CPU - {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|arm64.ActiveCfg = Debug|Any CPU - {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|x64.ActiveCfg = Debug|Any CPU - {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|x86.ActiveCfg = Debug|Any CPU + {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|arm.ActiveCfg = Debug|Any CPU + {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|x64.ActiveCfg = Debug|Any CPU + {C485C170-2B88-4EA9-8826-7BC4C9BA2324}.Checked|x86.ActiveCfg = Debug|Any CPU {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Debug|Any CPU.Build.0 = Debug|Any CPU {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2185,11 +2218,11 @@ Global {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Release|x64.Build.0 = Release|Any CPU {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Release|x86.ActiveCfg = Release|Any CPU {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Release|x86.Build.0 = Release|Any CPU - {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|arm.ActiveCfg = Debug|Any CPU - {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|arm64.ActiveCfg = Debug|Any CPU - {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|x64.ActiveCfg = Debug|Any CPU - {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|x86.ActiveCfg = Debug|Any CPU + {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|arm.ActiveCfg = Debug|Any CPU + {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|arm64.ActiveCfg = Debug|Any CPU + {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|x64.ActiveCfg = Debug|Any CPU + {43C40A0B-0B0E-4D27-8534-11CD5A540F7C}.Checked|x86.ActiveCfg = Debug|Any CPU {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Debug|Any CPU.Build.0 = Debug|Any CPU {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2206,11 +2239,11 @@ Global {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Release|x64.Build.0 = Release|Any CPU {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Release|x86.ActiveCfg = Release|Any CPU {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Release|x86.Build.0 = Release|Any CPU - {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|arm.ActiveCfg = Debug|Any CPU - {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|x64.ActiveCfg = Debug|Any CPU - {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|x86.ActiveCfg = Debug|Any CPU + {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|arm.ActiveCfg = Debug|Any CPU + {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|arm64.ActiveCfg = Debug|Any CPU + {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|x64.ActiveCfg = Debug|Any CPU + {3B79DD71-8C2F-41BC-A1A7-86A490D6C726}.Checked|x86.ActiveCfg = Debug|Any CPU {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Debug|Any CPU.Build.0 = Debug|Any CPU {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2227,11 +2260,11 @@ Global {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Release|x64.Build.0 = Release|Any CPU {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Release|x86.ActiveCfg = Release|Any CPU {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Release|x86.Build.0 = Release|Any CPU - {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|arm.ActiveCfg = Debug|Any CPU - {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|x64.ActiveCfg = Debug|Any CPU - {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|x86.ActiveCfg = Debug|Any CPU + {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|arm.ActiveCfg = Debug|Any CPU + {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|x64.ActiveCfg = Debug|Any CPU + {4EE36055-AD7C-4779-B3F6-08687960DCC3}.Checked|x86.ActiveCfg = Debug|Any CPU {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Debug|Any CPU.Build.0 = Debug|Any CPU {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2248,11 +2281,11 @@ Global {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Release|x64.Build.0 = Release|Any CPU {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Release|x86.ActiveCfg = Release|Any CPU {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Release|x86.Build.0 = Release|Any CPU - {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|arm.ActiveCfg = Debug|Any CPU - {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|arm64.ActiveCfg = Debug|Any CPU - {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|x64.ActiveCfg = Debug|Any CPU - {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|x86.ActiveCfg = Debug|Any CPU + {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|arm.ActiveCfg = Debug|Any CPU + {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|x64.ActiveCfg = Debug|Any CPU + {C3F25EEF-04B4-407A-960B-0C1CE9C04430}.Checked|x86.ActiveCfg = Debug|Any CPU {47E26787-7C27-4572-AD8B-868DE44E2C48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {47E26787-7C27-4572-AD8B-868DE44E2C48}.Debug|Any CPU.Build.0 = Debug|Any CPU {47E26787-7C27-4572-AD8B-868DE44E2C48}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2269,11 +2302,11 @@ Global {47E26787-7C27-4572-AD8B-868DE44E2C48}.Release|x64.Build.0 = Release|Any CPU {47E26787-7C27-4572-AD8B-868DE44E2C48}.Release|x86.ActiveCfg = Release|Any CPU {47E26787-7C27-4572-AD8B-868DE44E2C48}.Release|x86.Build.0 = Release|Any CPU - {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|arm.ActiveCfg = Debug|Any CPU - {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|arm64.ActiveCfg = Debug|Any CPU - {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|x64.ActiveCfg = Debug|Any CPU - {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|x86.ActiveCfg = Debug|Any CPU + {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|arm.ActiveCfg = Debug|Any CPU + {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|arm64.ActiveCfg = Debug|Any CPU + {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|x64.ActiveCfg = Debug|Any CPU + {47E26787-7C27-4572-AD8B-868DE44E2C48}.Checked|x86.ActiveCfg = Debug|Any CPU {C230AC88-A377-4BEB-824F-AB174C14DC86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C230AC88-A377-4BEB-824F-AB174C14DC86}.Debug|Any CPU.Build.0 = Debug|Any CPU {C230AC88-A377-4BEB-824F-AB174C14DC86}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2290,11 +2323,11 @@ Global {C230AC88-A377-4BEB-824F-AB174C14DC86}.Release|x64.Build.0 = Release|Any CPU {C230AC88-A377-4BEB-824F-AB174C14DC86}.Release|x86.ActiveCfg = Release|Any CPU {C230AC88-A377-4BEB-824F-AB174C14DC86}.Release|x86.Build.0 = Release|Any CPU - {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|arm.ActiveCfg = Debug|Any CPU - {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|x64.ActiveCfg = Debug|Any CPU - {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|x86.ActiveCfg = Debug|Any CPU + {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|arm.ActiveCfg = Debug|Any CPU + {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|arm64.ActiveCfg = Debug|Any CPU + {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|x64.ActiveCfg = Debug|Any CPU + {C230AC88-A377-4BEB-824F-AB174C14DC86}.Checked|x86.ActiveCfg = Debug|Any CPU {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Debug|Any CPU.Build.0 = Debug|Any CPU {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2311,11 +2344,11 @@ Global {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Release|x64.Build.0 = Release|Any CPU {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Release|x86.ActiveCfg = Release|Any CPU {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Release|x86.Build.0 = Release|Any CPU - {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|arm.ActiveCfg = Debug|Any CPU - {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|arm64.ActiveCfg = Debug|Any CPU - {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|x64.ActiveCfg = Debug|Any CPU - {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|x86.ActiveCfg = Debug|Any CPU + {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|arm.ActiveCfg = Debug|Any CPU + {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|x64.ActiveCfg = Debug|Any CPU + {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC}.Checked|x86.ActiveCfg = Debug|Any CPU {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Debug|Any CPU.Build.0 = Debug|Any CPU {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2332,11 +2365,11 @@ Global {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Release|x64.Build.0 = Release|Any CPU {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Release|x86.ActiveCfg = Release|Any CPU {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Release|x86.Build.0 = Release|Any CPU - {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|arm.ActiveCfg = Debug|Any CPU - {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|arm64.ActiveCfg = Debug|Any CPU - {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|x64.ActiveCfg = Debug|Any CPU - {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|x86.ActiveCfg = Debug|Any CPU + {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|arm.ActiveCfg = Debug|Any CPU + {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|arm64.ActiveCfg = Debug|Any CPU + {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|x64.ActiveCfg = Debug|Any CPU + {0F83B07B-2E3F-4708-BE6D-7A8DA8168803}.Checked|x86.ActiveCfg = Debug|Any CPU {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Debug|Any CPU.Build.0 = Debug|Any CPU {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2353,11 +2386,11 @@ Global {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Release|x64.Build.0 = Release|Any CPU {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Release|x86.ActiveCfg = Release|Any CPU {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Release|x86.Build.0 = Release|Any CPU - {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|arm.ActiveCfg = Debug|Any CPU - {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|arm64.ActiveCfg = Debug|Any CPU - {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|x64.ActiveCfg = Debug|Any CPU - {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|x86.ActiveCfg = Debug|Any CPU + {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|arm.ActiveCfg = Debug|Any CPU + {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|arm64.ActiveCfg = Debug|Any CPU + {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|x64.ActiveCfg = Debug|Any CPU + {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD}.Checked|x86.ActiveCfg = Debug|Any CPU {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Debug|Any CPU.Build.0 = Debug|Any CPU {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2374,11 +2407,11 @@ Global {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Release|x64.Build.0 = Release|Any CPU {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Release|x86.ActiveCfg = Release|Any CPU {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Release|x86.Build.0 = Release|Any CPU - {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|arm.ActiveCfg = Debug|Any CPU - {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|arm64.ActiveCfg = Debug|Any CPU - {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|x64.ActiveCfg = Debug|Any CPU - {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|x86.ActiveCfg = Debug|Any CPU + {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|arm.ActiveCfg = Debug|Any CPU + {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|arm64.ActiveCfg = Debug|Any CPU + {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|x64.ActiveCfg = Debug|Any CPU + {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B}.Checked|x86.ActiveCfg = Debug|Any CPU {697C63A2-2517-4F85-8B88-C94E538BE407}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {697C63A2-2517-4F85-8B88-C94E538BE407}.Debug|Any CPU.Build.0 = Debug|Any CPU {697C63A2-2517-4F85-8B88-C94E538BE407}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2395,11 +2428,11 @@ Global {697C63A2-2517-4F85-8B88-C94E538BE407}.Release|x64.Build.0 = Release|Any CPU {697C63A2-2517-4F85-8B88-C94E538BE407}.Release|x86.ActiveCfg = Release|Any CPU {697C63A2-2517-4F85-8B88-C94E538BE407}.Release|x86.Build.0 = Release|Any CPU - {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|arm.ActiveCfg = Debug|Any CPU - {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|arm64.ActiveCfg = Debug|Any CPU - {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|x64.ActiveCfg = Debug|Any CPU - {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|x86.ActiveCfg = Debug|Any CPU + {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|arm.ActiveCfg = Debug|Any CPU + {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|arm64.ActiveCfg = Debug|Any CPU + {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|x64.ActiveCfg = Debug|Any CPU + {697C63A2-2517-4F85-8B88-C94E538BE407}.Checked|x86.ActiveCfg = Debug|Any CPU {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Debug|Any CPU.Build.0 = Debug|Any CPU {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2416,13 +2449,13 @@ Global {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Release|x64.Build.0 = Release|Any CPU {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Release|x86.ActiveCfg = Release|Any CPU {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Release|x86.Build.0 = Release|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|arm.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|arm64.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|x64.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|x86.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|arm.ActiveCfg = Debug|Any CPU + {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|arm64.ActiveCfg = Debug|Any CPU + {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|x64.ActiveCfg = Debug|Any CPU + {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19}.Checked|x86.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|Any CPU.Build.0 = Debug|Any CPU {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|arm.ActiveCfg = Debug|Any CPU {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|arm64.ActiveCfg = Debug|Any CPU {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -2437,11 +2470,11 @@ Global {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Release|x64.Build.0 = Release|Any CPU {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Release|x86.ActiveCfg = Release|Any CPU {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Release|x86.Build.0 = Release|Any CPU - {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|arm.ActiveCfg = Debug|Any CPU - {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|arm64.ActiveCfg = Debug|Any CPU - {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|x64.ActiveCfg = Debug|Any CPU - {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|x86.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|arm.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|arm64.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|x64.ActiveCfg = Debug|Any CPU + {172F6EB9-6001-4657-8AE2-83DB23B371CA}.Checked|x86.ActiveCfg = Debug|Any CPU {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Debug|Any CPU.Build.0 = Debug|Any CPU {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2458,11 +2491,11 @@ Global {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Release|x64.Build.0 = Release|Any CPU {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Release|x86.ActiveCfg = Release|Any CPU {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Release|x86.Build.0 = Release|Any CPU - {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|arm.ActiveCfg = Debug|Any CPU - {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|arm64.ActiveCfg = Debug|Any CPU - {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|x64.ActiveCfg = Debug|Any CPU - {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|x86.ActiveCfg = Debug|Any CPU + {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|arm.ActiveCfg = Debug|Any CPU + {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|arm64.ActiveCfg = Debug|Any CPU + {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|x64.ActiveCfg = Debug|Any CPU + {7E3B4C81-9010-4473-BD3C-5B90F9533CD7}.Checked|x86.ActiveCfg = Debug|Any CPU {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Debug|Any CPU.Build.0 = Debug|Any CPU {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2479,11 +2512,11 @@ Global {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Release|x64.Build.0 = Release|Any CPU {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Release|x86.ActiveCfg = Release|Any CPU {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Release|x86.Build.0 = Release|Any CPU - {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|arm.ActiveCfg = Debug|Any CPU - {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|arm64.ActiveCfg = Debug|Any CPU - {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|x64.ActiveCfg = Debug|Any CPU - {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|x86.ActiveCfg = Debug|Any CPU + {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|arm.ActiveCfg = Debug|Any CPU + {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|arm64.ActiveCfg = Debug|Any CPU + {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|x64.ActiveCfg = Debug|Any CPU + {BBC59E42-DC0B-4847-B336-13ACF4279F17}.Checked|x86.ActiveCfg = Debug|Any CPU {78C45C87-93B6-4FCE-B174-520756DE4E74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {78C45C87-93B6-4FCE-B174-520756DE4E74}.Debug|Any CPU.Build.0 = Debug|Any CPU {78C45C87-93B6-4FCE-B174-520756DE4E74}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2500,11 +2533,11 @@ Global {78C45C87-93B6-4FCE-B174-520756DE4E74}.Release|x64.Build.0 = Release|Any CPU {78C45C87-93B6-4FCE-B174-520756DE4E74}.Release|x86.ActiveCfg = Release|Any CPU {78C45C87-93B6-4FCE-B174-520756DE4E74}.Release|x86.Build.0 = Release|Any CPU - {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|arm.ActiveCfg = Debug|Any CPU - {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|arm64.ActiveCfg = Debug|Any CPU - {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|x64.ActiveCfg = Debug|Any CPU - {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|x86.ActiveCfg = Debug|Any CPU + {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|arm.ActiveCfg = Debug|Any CPU + {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|arm64.ActiveCfg = Debug|Any CPU + {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|x64.ActiveCfg = Debug|Any CPU + {78C45C87-93B6-4FCE-B174-520756DE4E74}.Checked|x86.ActiveCfg = Debug|Any CPU {07197CBF-7C41-47B6-9E52-88A6D4485219}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {07197CBF-7C41-47B6-9E52-88A6D4485219}.Debug|Any CPU.Build.0 = Debug|Any CPU {07197CBF-7C41-47B6-9E52-88A6D4485219}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2521,11 +2554,11 @@ Global {07197CBF-7C41-47B6-9E52-88A6D4485219}.Release|x64.Build.0 = Release|Any CPU {07197CBF-7C41-47B6-9E52-88A6D4485219}.Release|x86.ActiveCfg = Release|Any CPU {07197CBF-7C41-47B6-9E52-88A6D4485219}.Release|x86.Build.0 = Release|Any CPU - {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|arm.ActiveCfg = Debug|Any CPU - {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|x64.ActiveCfg = Debug|Any CPU - {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|x86.ActiveCfg = Debug|Any CPU + {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|arm.ActiveCfg = Debug|Any CPU + {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|arm64.ActiveCfg = Debug|Any CPU + {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|x64.ActiveCfg = Debug|Any CPU + {07197CBF-7C41-47B6-9E52-88A6D4485219}.Checked|x86.ActiveCfg = Debug|Any CPU {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2542,11 +2575,11 @@ Global {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Release|x64.Build.0 = Release|Any CPU {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Release|x86.ActiveCfg = Release|Any CPU {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Release|x86.Build.0 = Release|Any CPU - {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|arm.ActiveCfg = Debug|Any CPU - {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|arm64.ActiveCfg = Debug|Any CPU - {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|x64.ActiveCfg = Debug|Any CPU - {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|x86.ActiveCfg = Debug|Any CPU + {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|arm.ActiveCfg = Debug|Any CPU + {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|x64.ActiveCfg = Debug|Any CPU + {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F}.Checked|x86.ActiveCfg = Debug|Any CPU {F6A8185B-07C6-401D-9B40-3C560239E05F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F6A8185B-07C6-401D-9B40-3C560239E05F}.Debug|Any CPU.Build.0 = Debug|Any CPU {F6A8185B-07C6-401D-9B40-3C560239E05F}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2563,11 +2596,11 @@ Global {F6A8185B-07C6-401D-9B40-3C560239E05F}.Release|x64.Build.0 = Release|Any CPU {F6A8185B-07C6-401D-9B40-3C560239E05F}.Release|x86.ActiveCfg = Release|Any CPU {F6A8185B-07C6-401D-9B40-3C560239E05F}.Release|x86.Build.0 = Release|Any CPU - {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|arm.ActiveCfg = Debug|Any CPU - {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|x64.ActiveCfg = Debug|Any CPU - {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|x86.ActiveCfg = Debug|Any CPU + {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|arm.ActiveCfg = Debug|Any CPU + {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|arm64.ActiveCfg = Debug|Any CPU + {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|x64.ActiveCfg = Debug|Any CPU + {F6A8185B-07C6-401D-9B40-3C560239E05F}.Checked|x86.ActiveCfg = Debug|Any CPU {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Debug|Any CPU.Build.0 = Debug|Any CPU {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2584,11 +2617,11 @@ Global {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Release|x64.Build.0 = Release|Any CPU {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Release|x86.ActiveCfg = Release|Any CPU {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Release|x86.Build.0 = Release|Any CPU - {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|arm.ActiveCfg = Debug|Any CPU - {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|arm64.ActiveCfg = Debug|Any CPU - {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|x64.ActiveCfg = Debug|Any CPU - {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|x86.ActiveCfg = Debug|Any CPU + {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|arm.ActiveCfg = Debug|Any CPU + {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|x64.ActiveCfg = Debug|Any CPU + {1E6C7D88-7584-444C-97CD-2FAAB5BEF465}.Checked|x86.ActiveCfg = Debug|Any CPU {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Debug|Any CPU.Build.0 = Debug|Any CPU {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2605,11 +2638,11 @@ Global {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Release|x64.Build.0 = Release|Any CPU {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Release|x86.ActiveCfg = Release|Any CPU {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Release|x86.Build.0 = Release|Any CPU - {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|arm.ActiveCfg = Debug|Any CPU - {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|arm64.ActiveCfg = Debug|Any CPU - {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|x64.ActiveCfg = Debug|Any CPU - {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|x86.ActiveCfg = Debug|Any CPU + {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|arm.ActiveCfg = Debug|Any CPU + {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|arm64.ActiveCfg = Debug|Any CPU + {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|x64.ActiveCfg = Debug|Any CPU + {12E1EFEA-60DE-41D7-B148-AB0182594C1B}.Checked|x86.ActiveCfg = Debug|Any CPU {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2626,11 +2659,11 @@ Global {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Release|x64.Build.0 = Release|Any CPU {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Release|x86.ActiveCfg = Release|Any CPU {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Release|x86.Build.0 = Release|Any CPU - {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|arm.ActiveCfg = Debug|Any CPU - {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|arm64.ActiveCfg = Debug|Any CPU - {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|x64.ActiveCfg = Debug|Any CPU - {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|x86.ActiveCfg = Debug|Any CPU + {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|arm.ActiveCfg = Debug|Any CPU + {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|arm64.ActiveCfg = Debug|Any CPU + {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|x64.ActiveCfg = Debug|Any CPU + {8C0E3201-1F0E-45A0-9897-A679C0C4F684}.Checked|x86.ActiveCfg = Debug|Any CPU {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Debug|Any CPU.Build.0 = Debug|Any CPU {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2647,11 +2680,11 @@ Global {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Release|x64.Build.0 = Release|Any CPU {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Release|x86.ActiveCfg = Release|Any CPU {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Release|x86.Build.0 = Release|Any CPU - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|arm.ActiveCfg = Debug|Any CPU - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|arm64.ActiveCfg = Debug|Any CPU - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|x64.ActiveCfg = Debug|Any CPU - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|x86.ActiveCfg = Debug|Any CPU + {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|arm.ActiveCfg = Debug|Any CPU + {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|arm64.ActiveCfg = Debug|Any CPU + {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|x64.ActiveCfg = Debug|Any CPU + {25E8AB9D-2D10-44F5-9F83-5A5134526771}.Checked|x86.ActiveCfg = Debug|Any CPU {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Debug|Any CPU.Build.0 = Debug|Any CPU {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2668,11 +2701,11 @@ Global {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Release|x64.Build.0 = Release|Any CPU {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Release|x86.ActiveCfg = Release|Any CPU {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Release|x86.Build.0 = Release|Any CPU - {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|arm.ActiveCfg = Debug|Any CPU - {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|arm64.ActiveCfg = Debug|Any CPU - {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|x64.ActiveCfg = Debug|Any CPU - {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|x86.ActiveCfg = Debug|Any CPU + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|arm.ActiveCfg = Debug|Any CPU + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|arm64.ActiveCfg = Debug|Any CPU + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|x64.ActiveCfg = Debug|Any CPU + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13}.Checked|x86.ActiveCfg = Debug|Any CPU {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Debug|Any CPU.Build.0 = Debug|Any CPU {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2689,11 +2722,11 @@ Global {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Release|x64.Build.0 = Release|Any CPU {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Release|x86.ActiveCfg = Release|Any CPU {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Release|x86.Build.0 = Release|Any CPU - {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|arm.ActiveCfg = Debug|Any CPU - {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|arm64.ActiveCfg = Debug|Any CPU - {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|x64.ActiveCfg = Debug|Any CPU - {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|x86.ActiveCfg = Debug|Any CPU + {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|arm.ActiveCfg = Debug|Any CPU + {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|arm64.ActiveCfg = Debug|Any CPU + {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|x64.ActiveCfg = Debug|Any CPU + {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8}.Checked|x86.ActiveCfg = Debug|Any CPU {50F1165C-5F71-472C-B317-35FFC14665EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {50F1165C-5F71-472C-B317-35FFC14665EA}.Debug|Any CPU.Build.0 = Debug|Any CPU {50F1165C-5F71-472C-B317-35FFC14665EA}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2710,11 +2743,11 @@ Global {50F1165C-5F71-472C-B317-35FFC14665EA}.Release|x64.Build.0 = Release|Any CPU {50F1165C-5F71-472C-B317-35FFC14665EA}.Release|x86.ActiveCfg = Release|Any CPU {50F1165C-5F71-472C-B317-35FFC14665EA}.Release|x86.Build.0 = Release|Any CPU - {82728202-1098-4E16-B598-5762EAF67D08}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {82728202-1098-4E16-B598-5762EAF67D08}.Checked|arm.ActiveCfg = Debug|Any CPU - {82728202-1098-4E16-B598-5762EAF67D08}.Checked|arm64.ActiveCfg = Debug|Any CPU - {82728202-1098-4E16-B598-5762EAF67D08}.Checked|x64.ActiveCfg = Debug|Any CPU - {82728202-1098-4E16-B598-5762EAF67D08}.Checked|x86.ActiveCfg = Debug|Any CPU + {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|arm.ActiveCfg = Debug|Any CPU + {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|arm64.ActiveCfg = Debug|Any CPU + {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|x64.ActiveCfg = Debug|Any CPU + {50F1165C-5F71-472C-B317-35FFC14665EA}.Checked|x86.ActiveCfg = Debug|Any CPU {82728202-1098-4E16-B598-5762EAF67D08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {82728202-1098-4E16-B598-5762EAF67D08}.Debug|Any CPU.Build.0 = Debug|Any CPU {82728202-1098-4E16-B598-5762EAF67D08}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2731,11 +2764,11 @@ Global {82728202-1098-4E16-B598-5762EAF67D08}.Release|x64.Build.0 = Release|Any CPU {82728202-1098-4E16-B598-5762EAF67D08}.Release|x86.ActiveCfg = Release|Any CPU {82728202-1098-4E16-B598-5762EAF67D08}.Release|x86.Build.0 = Release|Any CPU - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|arm.ActiveCfg = Debug|Any CPU - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|arm64.ActiveCfg = Debug|Any CPU - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|x64.ActiveCfg = Debug|Any CPU - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|x86.ActiveCfg = Debug|Any CPU + {82728202-1098-4E16-B598-5762EAF67D08}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {82728202-1098-4E16-B598-5762EAF67D08}.Checked|arm.ActiveCfg = Debug|Any CPU + {82728202-1098-4E16-B598-5762EAF67D08}.Checked|arm64.ActiveCfg = Debug|Any CPU + {82728202-1098-4E16-B598-5762EAF67D08}.Checked|x64.ActiveCfg = Debug|Any CPU + {82728202-1098-4E16-B598-5762EAF67D08}.Checked|x86.ActiveCfg = Debug|Any CPU {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Debug|Any CPU.Build.0 = Debug|Any CPU {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2752,11 +2785,11 @@ Global {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Release|x64.Build.0 = Release|Any CPU {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Release|x86.ActiveCfg = Release|Any CPU {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Release|x86.Build.0 = Release|Any CPU - {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|arm.ActiveCfg = Debug|Any CPU - {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|arm64.ActiveCfg = Debug|Any CPU - {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|x64.ActiveCfg = Debug|Any CPU - {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|x86.ActiveCfg = Debug|Any CPU + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|arm.ActiveCfg = Debug|Any CPU + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|arm64.ActiveCfg = Debug|Any CPU + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|x64.ActiveCfg = Debug|Any CPU + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA}.Checked|x86.ActiveCfg = Debug|Any CPU {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Debug|Any CPU.Build.0 = Debug|Any CPU {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2773,11 +2806,11 @@ Global {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Release|x64.Build.0 = Release|Any CPU {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Release|x86.ActiveCfg = Release|Any CPU {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Release|x86.Build.0 = Release|Any CPU - {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|arm.ActiveCfg = Debug|Any CPU - {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|arm64.ActiveCfg = Debug|Any CPU - {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|x64.ActiveCfg = Debug|Any CPU - {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|x86.ActiveCfg = Debug|Any CPU + {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|arm.ActiveCfg = Debug|Any CPU + {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|arm64.ActiveCfg = Debug|Any CPU + {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|x64.ActiveCfg = Debug|Any CPU + {CFAB1236-51C3-4A13-A57F-16022FD0A7EE}.Checked|x86.ActiveCfg = Debug|Any CPU {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Debug|Any CPU.Build.0 = Debug|Any CPU {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2794,11 +2827,11 @@ Global {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Release|x64.Build.0 = Release|Any CPU {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Release|x86.ActiveCfg = Release|Any CPU {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Release|x86.Build.0 = Release|Any CPU - {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|arm.ActiveCfg = Debug|Any CPU - {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|arm64.ActiveCfg = Debug|Any CPU - {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|x64.ActiveCfg = Debug|Any CPU - {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|x86.ActiveCfg = Debug|Any CPU + {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|arm.ActiveCfg = Debug|Any CPU + {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|arm64.ActiveCfg = Debug|Any CPU + {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|x64.ActiveCfg = Debug|Any CPU + {4CBDF585-FD15-44E9-9795-1BED79BC4960}.Checked|x86.ActiveCfg = Debug|Any CPU {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Debug|Any CPU.Build.0 = Debug|Any CPU {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2815,11 +2848,11 @@ Global {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Release|x64.Build.0 = Release|Any CPU {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Release|x86.ActiveCfg = Release|Any CPU {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Release|x86.Build.0 = Release|Any CPU - {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|arm.ActiveCfg = Debug|Any CPU - {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|arm64.ActiveCfg = Debug|Any CPU - {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|x64.ActiveCfg = Debug|Any CPU - {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|x86.ActiveCfg = Debug|Any CPU + {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|arm.ActiveCfg = Debug|Any CPU + {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|arm64.ActiveCfg = Debug|Any CPU + {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|x64.ActiveCfg = Debug|Any CPU + {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8}.Checked|x86.ActiveCfg = Debug|Any CPU {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Debug|Any CPU.Build.0 = Debug|Any CPU {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2836,11 +2869,11 @@ Global {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Release|x64.Build.0 = Release|Any CPU {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Release|x86.ActiveCfg = Release|Any CPU {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Release|x86.Build.0 = Release|Any CPU - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|arm.ActiveCfg = Debug|Any CPU - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|arm64.ActiveCfg = Debug|Any CPU - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|x64.ActiveCfg = Debug|Any CPU - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|x86.ActiveCfg = Debug|Any CPU + {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|arm.ActiveCfg = Debug|Any CPU + {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|arm64.ActiveCfg = Debug|Any CPU + {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|x64.ActiveCfg = Debug|Any CPU + {AF7CC240-B4D5-4C37-9B04-473CBCC52330}.Checked|x86.ActiveCfg = Debug|Any CPU {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Debug|Any CPU.Build.0 = Debug|Any CPU {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Debug|arm.ActiveCfg = Debug|Any CPU @@ -2857,67 +2890,69 @@ Global {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Release|x64.Build.0 = Release|Any CPU {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Release|x86.ActiveCfg = Release|Any CPU {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Release|x86.Build.0 = Release|Any CPU + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|arm.ActiveCfg = Debug|Any CPU + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|arm64.ActiveCfg = Debug|Any CPU + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|x64.ActiveCfg = Debug|Any CPU + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744}.Checked|x86.ActiveCfg = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {71AB8240-F179-4B21-A8BE-8BE6CD774ED9} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {F86D6534-1A96-489E-A807-C14E616686D6} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {9DF0247E-5B81-4EF3-82CA-3E70B3A56742} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {FB17AC52-1633-4845-932B-9218DF895957} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {21791340-49C4-4C07-97FD-CAA1B72D3256} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {5719BF19-2F1E-4ECC-9285-8DE445D23F5F} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {86CF47B3-D607-4F59-896F-982FEA116086} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {484B12B8-F027-4960-BAA9-14D646C80A28} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {D16B3A49-5709-44CB-B6F8-8E3D585D236F} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {F0BB4F76-7697-49A8-8204-FD4516EB325C} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {B876CC90-CB87-4B1B-B6F5-247990192578} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {999B1A08-2C7F-43AD-BC50-5F950320BBFF} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {53EFB849-6776-4316-B631-5B5F0D9624E6} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {019A13D1-3493-4024-8223-FCB6763F80B4} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {9ECF9E5C-860F-49C3-95D0-501147F19548} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {8F97C1DE-07F7-449F-AA22-84A6D6836D82} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {B11DD674-FFF7-4343-BA1B-F4C788B16DDA} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {3C01DB47-20B0-40E0-AB7C-A5611345AC44} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3} = {13818769-DC01-4715-9590-E000D03E42A9} - {E64D31D0-8F38-4FDF-B60D-F955D2475566} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {E7A05515-DABE-4C09-83CB-CE84EFDCD4CC} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {91D01772-0D5A-451F-A56C-56FBB0961ED8} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {4367BB9C-7EC2-4238-82E2-643DE24CC23E} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {F977B04F-675C-4B78-8FCE-19D70504166D} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} - {379BC6E6-1900-44F8-8D8C-AA2968A70008} = {13818769-DC01-4715-9590-E000D03E42A9} - {CB93C0B2-D73B-4BDA-A03A-8A7D76012590} = {13818769-DC01-4715-9590-E000D03E42A9} - {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9} = {13818769-DC01-4715-9590-E000D03E42A9} - {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37} = {13818769-DC01-4715-9590-E000D03E42A9} - {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {A83A8520-F5E2-49B4-83BC-0F82A412951D} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {F6A8185B-07C6-401D-9B40-3C560239E05F} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {8C0E3201-1F0E-45A0-9897-A679C0C4F684} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {50F1165C-5F71-472C-B317-35FFC14665EA} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {069C2B51-069A-4FBB-BFE9-42D573F1CEEA} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {A3873DDB-47E7-4DB6-872C-4B46A779913A} = {49849A80-4C86-4DBD-A138-B98A07BFA4F8} + {49849A80-4C86-4DBD-A138-B98A07BFA4F8} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {23D41678-453F-4F2A-85F1-167E63DA6D67} = {FA882920-3BC3-4FB7-BA9A-263CE3E4F8D9} + {FA882920-3BC3-4FB7-BA9A-263CE3E4F8D9} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {6790611D-ACE0-47C6-83E0-E404364B5210} = {F283372A-5CA9-40D8-BA0D-5C65060F7D7F} + {F283372A-5CA9-40D8-BA0D-5C65060F7D7F} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {68DE62F3-AB3A-4AC9-BCEB-CAD95B48D5F9} = {329E1643-B54D-4A88-9E96-716709AB931B} + {329E1643-B54D-4A88-9E96-716709AB931B} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {B73090B8-20CB-4586-A586-B7F37C1A06FF} = {7750E8BA-A054-4176-971B-FA3B4A9ECF23} + {4C1F2761-857C-40A4-8CDD-7139380DA4D7} = {7750E8BA-A054-4176-971B-FA3B4A9ECF23} {70441C80-1F14-42F9-8225-A891E3C9A82A} = {7750E8BA-A054-4176-971B-FA3B4A9ECF23} {EA3FA657-060E-43A3-9CF0-45FCC8E7E5B6} = {7750E8BA-A054-4176-971B-FA3B4A9ECF23} + {7750E8BA-A054-4176-971B-FA3B4A9ECF23} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {1C44735B-C77E-479A-ABBB-8B6EB83299CF} = {A1C3A699-4772-45AC-BED4-F0D6E8282EDB} {0AB5F4E7-A0D5-44C5-A1CF-37CDBDC2F531} = {A1C3A699-4772-45AC-BED4-F0D6E8282EDB} {CA97D5F2-4D71-4448-8DEB-E18C237C76B3} = {A1C3A699-4772-45AC-BED4-F0D6E8282EDB} + {A1C3A699-4772-45AC-BED4-F0D6E8282EDB} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {988AECC5-6EB4-48AB-9467-3FB63619631B} = {FC0E8825-6D78-47C9-9758-59D61AD38895} + {C5F86889-E147-4424-9165-D2DF453741F2} = {FC0E8825-6D78-47C9-9758-59D61AD38895} {67D9B289-AA6D-4FD8-A99D-F8651A51BE7E} = {FC0E8825-6D78-47C9-9758-59D61AD38895} {B6F2F0D5-9275-4F00-A2C3-2048AF0CAF12} = {FC0E8825-6D78-47C9-9758-59D61AD38895} {EF24E79E-0E96-4228-9D8E-44E1C2D8BDA9} = {FC0E8825-6D78-47C9-9758-59D61AD38895} {32247916-74DE-4A62-AE68-04976D2B0149} = {FC0E8825-6D78-47C9-9758-59D61AD38895} {5090E2BE-4BC9-4027-BF67-452049996F43} = {FC0E8825-6D78-47C9-9758-59D61AD38895} + {FC0E8825-6D78-47C9-9758-59D61AD38895} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {61164A2A-D90F-4122-AF5D-9704564E80E0} = {1131BBB2-AEBC-4020-9643-59C8EA73E848} + {1131BBB2-AEBC-4020-9643-59C8EA73E848} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {FDAB957F-5C83-4946-ACF5-825B2B6DAFE6} = {5B928A02-3C49-4E29-8C05-E9AEF0E4F39A} {652F0921-C134-4882-A9D0-0CBB2F8D75B2} = {5B928A02-3C49-4E29-8C05-E9AEF0E4F39A} {C51DBBBF-3BBA-4345-AEAA-E6A21F9F7016} = {5B928A02-3C49-4E29-8C05-E9AEF0E4F39A} + {5B928A02-3C49-4E29-8C05-E9AEF0E4F39A} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {CFC724F4-18A2-401F-AED4-7D7A779CE3EA} = {B5010729-BAD4-418F-B801-CEECF4890CB2} + {B5010729-BAD4-418F-B801-CEECF4890CB2} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {9AA6AAD7-E09B-4F9E-B398-1734A5815B6B} = {159EA645-58B0-447C-90BC-FF6AC3BBEEF1} + {159EA645-58B0-447C-90BC-FF6AC3BBEEF1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {E73952E5-C929-4566-962A-B9AF65289871} = {6FC63FB9-025D-4821-A346-CF3B34788331} {9299BE78-5A00-425A-A38F-7F1DC9C3F63E} = {6FC63FB9-025D-4821-A346-CF3B34788331} {A6D86695-D570-43F9-99A3-6C7445362D53} = {6FC63FB9-025D-4821-A346-CF3B34788331} @@ -2938,17 +2973,24 @@ Global {049319F0-D438-404C-A6D4-4D1E99DAE647} = {6FC63FB9-025D-4821-A346-CF3B34788331} {691D460F-764F-48E7-9A3F-7D1A32388542} = {6FC63FB9-025D-4821-A346-CF3B34788331} {9F1AC402-BFAD-4EA2-AD31-BBCA73375953} = {6FC63FB9-025D-4821-A346-CF3B34788331} + {6FC63FB9-025D-4821-A346-CF3B34788331} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {DBDA55A9-4BB9-4FF8-9066-EE7157E627C1} = {C5CD099F-649E-4464-BBD9-1F0A9FE7C311} + {C5CD099F-649E-4464-BBD9-1F0A9FE7C311} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {00807FA3-A9B3-4AF4-86CD-CF10255E6E8C} = {685D170C-E2BF-413A-A506-B09AF1E71DC1} + {685D170C-E2BF-413A-A506-B09AF1E71DC1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {E88FDBA9-3D1D-480D-8AB3-341C9E442D03} = {EC6D590E-2278-4E86-B1B0-E6900D0F31BD} + {EC6D590E-2278-4E86-B1B0-E6900D0F31BD} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {AD4767E9-57F6-47DD-ABD3-D3AFDF384703} = {2655BE48-E889-4354-9499-4CCC6DA9F378} {E1847313-0072-49CA-A1E6-6C05CECAB77A} = {2655BE48-E889-4354-9499-4CCC6DA9F378} {D86CC877-79A0-4AFA-9A76-7263B414614D} = {2655BE48-E889-4354-9499-4CCC6DA9F378} {E5E5C278-EBB9-4704-B7BA-56D39A5A343C} = {2655BE48-E889-4354-9499-4CCC6DA9F378} {59CD73F2-1310-46EE-B99A-594859FD8A37} = {2655BE48-E889-4354-9499-4CCC6DA9F378} {3D58505D-F17F-49E0-9131-42F273E3F5B9} = {2655BE48-E889-4354-9499-4CCC6DA9F378} + {2655BE48-E889-4354-9499-4CCC6DA9F378} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {0BF9F165-888D-486A-B6FD-6F3029913D70} = {174A9FAB-F46D-49A9-AC69-0FF55ACDE4F7} + {174A9FAB-F46D-49A9-AC69-0FF55ACDE4F7} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {C485C170-2B88-4EA9-8826-7BC4C9BA2324} = {CE6BCA93-D862-4435-8FEB-07A98DD43655} + {CE6BCA93-D862-4435-8FEB-07A98DD43655} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {43C40A0B-0B0E-4D27-8534-11CD5A540F7C} = {71C519F0-621A-413B-B262-A5106C2CCA64} {3B79DD71-8C2F-41BC-A1A7-86A490D6C726} = {71C519F0-621A-413B-B262-A5106C2CCA64} {4EE36055-AD7C-4779-B3F6-08687960DCC3} = {71C519F0-621A-413B-B262-A5106C2CCA64} @@ -2958,65 +3000,58 @@ Global {1BCCD2F5-A561-4641-8A0B-51F3EDCA35DC} = {71C519F0-621A-413B-B262-A5106C2CCA64} {0F83B07B-2E3F-4708-BE6D-7A8DA8168803} = {71C519F0-621A-413B-B262-A5106C2CCA64} {833C1D45-9BBB-4A92-93B7-4EFFD9E945AD} = {71C519F0-621A-413B-B262-A5106C2CCA64} + {71C519F0-621A-413B-B262-A5106C2CCA64} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {26676FE3-DDF7-4A5E-9ABA-417E0C24CA7B} = {FC75126D-0CBD-4927-A91D-BAF04DF8EC13} + {FC75126D-0CBD-4927-A91D-BAF04DF8EC13} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {697C63A2-2517-4F85-8B88-C94E538BE407} = {32160B7C-7125-48FD-8ECE-9E542D321FB1} + {32160B7C-7125-48FD-8ECE-9E542D321FB1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {90F8C08F-A6D0-4AA0-8615-9279E5E4FC19} = {69F454E3-4E56-42BD-957A-E20E15CBB1A8} + {69F454E3-4E56-42BD-957A-E20E15CBB1A8} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {172F6EB9-6001-4657-8AE2-83DB23B371CA} = {6DE592D4-860B-4C5E-86A4-741BFAD8CEF3} + {6DE592D4-860B-4C5E-86A4-741BFAD8CEF3} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {7E3B4C81-9010-4473-BD3C-5B90F9533CD7} = {ADE0FF1A-EF61-4D71-9E61-DC5656DC7943} + {ADE0FF1A-EF61-4D71-9E61-DC5656DC7943} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} {BBC59E42-DC0B-4847-B336-13ACF4279F17} = {377FD142-D005-4CC6-9CE4-66AE72E9DF84} + {377FD142-D005-4CC6-9CE4-66AE72E9DF84} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {F86D6534-1A96-489E-A807-C14E616686D6} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {AF7BA66D-EA0E-4755-8DA8-4CFE9B935F83} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {9DF0247E-5B81-4EF3-82CA-3E70B3A56742} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {FB17AC52-1633-4845-932B-9218DF895957} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} + {E3E53C39-0FE5-4B55-8035-A2C61CEECF0A} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {86CF47B3-D607-4F59-896F-982FEA116086} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {484B12B8-F027-4960-BAA9-14D646C80A28} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {F0BB4F76-7697-49A8-8204-FD4516EB325C} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {F8ECAC60-ACC6-4A1E-B099-A3FB62E0DF33} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {019A13D1-3493-4024-8223-FCB6763F80B4} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {8F97C1DE-07F7-449F-AA22-84A6D6836D82} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {3C01DB47-20B0-40E0-AB7C-A5611345AC44} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {E64D31D0-8F38-4FDF-B60D-F955D2475566} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {EA67EB7A-1F8A-4DB0-8731-FF225E5F69A3} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {4367BB9C-7EC2-4238-82E2-643DE24CC23E} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} + {F39E2C7E-5FE1-460C-AC2C-7E2B50955F2C} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {78C45C87-93B6-4FCE-B174-520756DE4E74} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {07197CBF-7C41-47B6-9E52-88A6D4485219} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {1B4552A4-91FD-4C6F-9EB4-3454C4BE428F} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {F6A8185B-07C6-401D-9B40-3C560239E05F} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {1E6C7D88-7584-444C-97CD-2FAAB5BEF465} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} {12E1EFEA-60DE-41D7-B148-AB0182594C1B} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {8C0E3201-1F0E-45A0-9897-A679C0C4F684} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {25E8AB9D-2D10-44F5-9F83-5A5134526771} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {9CF6C6E6-0E9F-4A95-84B5-6083EAB6FA13} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {17D73C46-97FF-40EE-B0D9-FB0EBA14B8D8} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {50F1165C-5F71-472C-B317-35FFC14665EA} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} {82728202-1098-4E16-B598-5762EAF67D08} = {F65030D7-DDBD-4D4C-B6E3-D3C0DD7FD569} - {069C2B51-069A-4FBB-BFE9-42D573F1CEEA} = {04D0E381-5B43-42C0-8E08-FADBFCECB353} + {CF79B5AE-38CB-4B80-BF92-CF634C0B7EC3} = {13818769-DC01-4715-9590-E000D03E42A9} + {379BC6E6-1900-44F8-8D8C-AA2968A70008} = {13818769-DC01-4715-9590-E000D03E42A9} + {CB93C0B2-D73B-4BDA-A03A-8A7D76012590} = {13818769-DC01-4715-9590-E000D03E42A9} + {4FA4A9A6-1D38-414B-96F0-3CFB63C687C9} = {13818769-DC01-4715-9590-E000D03E42A9} + {A7B7DE04-7261-4D4C-AA78-9F2D9B5A1C37} = {13818769-DC01-4715-9590-E000D03E42A9} {CFAB1236-51C3-4A13-A57F-16022FD0A7EE} = {28FBA7EA-0592-4446-82F2-2E9819684236} {4CBDF585-FD15-44E9-9795-1BED79BC4960} = {28FBA7EA-0592-4446-82F2-2E9819684236} + {28FBA7EA-0592-4446-82F2-2E9819684236} = {67DCB1C2-0B95-40B6-ACE8-9812BF57EB19} {1CBBF9E2-4EBD-40F0-BB9E-66BCE3CA5AA8} = {866503B5-5CD2-438C-A125-B947A2F38D34} {AF7CC240-B4D5-4C37-9B04-473CBCC52330} = {866503B5-5CD2-438C-A125-B947A2F38D34} - {3F5ABC5D-42DE-44C4-BEFC-741F4974C744} = {978D3888-2C89-41B7-BC09-33A4E49A6A00} - {49849A80-4C86-4DBD-A138-B98A07BFA4F8} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {FA882920-3BC3-4FB7-BA9A-263CE3E4F8D9} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {F283372A-5CA9-40D8-BA0D-5C65060F7D7F} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {329E1643-B54D-4A88-9E96-716709AB931B} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {7750E8BA-A054-4176-971B-FA3B4A9ECF23} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {A1C3A699-4772-45AC-BED4-F0D6E8282EDB} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {FC0E8825-6D78-47C9-9758-59D61AD38895} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {1131BBB2-AEBC-4020-9643-59C8EA73E848} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {5B928A02-3C49-4E29-8C05-E9AEF0E4F39A} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {B5010729-BAD4-418F-B801-CEECF4890CB2} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {159EA645-58B0-447C-90BC-FF6AC3BBEEF1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {6FC63FB9-025D-4821-A346-CF3B34788331} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {C5CD099F-649E-4464-BBD9-1F0A9FE7C311} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {685D170C-E2BF-413A-A506-B09AF1E71DC1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {EC6D590E-2278-4E86-B1B0-E6900D0F31BD} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {2655BE48-E889-4354-9499-4CCC6DA9F378} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {174A9FAB-F46D-49A9-AC69-0FF55ACDE4F7} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {CE6BCA93-D862-4435-8FEB-07A98DD43655} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {71C519F0-621A-413B-B262-A5106C2CCA64} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {FC75126D-0CBD-4927-A91D-BAF04DF8EC13} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {32160B7C-7125-48FD-8ECE-9E542D321FB1} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {69F454E3-4E56-42BD-957A-E20E15CBB1A8} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {6DE592D4-860B-4C5E-86A4-741BFAD8CEF3} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {ADE0FF1A-EF61-4D71-9E61-DC5656DC7943} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {377FD142-D005-4CC6-9CE4-66AE72E9DF84} = {FD72C125-C10D-457B-8AFC-6B4E5237AF6A} - {28FBA7EA-0592-4446-82F2-2E9819684236} = {67DCB1C2-0B95-40B6-ACE8-9812BF57EB19} {866503B5-5CD2-438C-A125-B947A2F38D34} = {67DCB1C2-0B95-40B6-ACE8-9812BF57EB19} + {3F5ABC5D-42DE-44C4-BEFC-741F4974C744} = {978D3888-2C89-41B7-BC09-33A4E49A6A00} {978D3888-2C89-41B7-BC09-33A4E49A6A00} = {67DCB1C2-0B95-40B6-ACE8-9812BF57EB19} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {19706846-1F47-42ED-B649-B0982EE96E6B} EndGlobalSection - GlobalSection(SharedMSBuildProjectFiles) = preSolution - ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{4cbdf585-fd15-44e9-9795-1bed79bc4960}*SharedItemsImports = 5 - ..\System.Private.CoreLib\src\System.Private.CoreLib.Shared.projitems*{71ab8240-f179-4b21-a8be-8be6cd774ed9}*SharedItemsImports = 5 - ..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{af7cc240-b4d5-4c37-9b04-473cbcc52330}*SharedItemsImports = 5 - EndGlobalSection EndGlobal