From 61bc468d66b2d5a32144c4a971bfa6a8d08d4ec4 Mon Sep 17 00:00:00 2001 From: bbaia Date: Tue, 8 Jun 2010 00:40:46 +0000 Subject: [PATCH] Add 'side by side' support in Framework .NET 4.0 [SPRNET-1320] (Fixed Spring.Web) --- .../Spring.Web/Web/Support/ControlAccessor.cs | 12 ++++++++++++ ...SupportsWebDependencyInjectionOwnerProxy.cs | 18 +++--------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Spring/Spring.Web/Web/Support/ControlAccessor.cs b/src/Spring/Spring.Web/Web/Support/ControlAccessor.cs index e0cf36ce..c675cb43 100644 --- a/src/Spring/Spring.Web/Web/Support/ControlAccessor.cs +++ b/src/Spring/Spring.Web/Web/Support/ControlAccessor.cs @@ -311,15 +311,27 @@ namespace Spring.Web.Support if (SystemUtils.Clr4Runtime) { FieldInfo controls = GetField("_controls"); + FieldInfo occasionalFields = GetField("_occasionalFields"); + MethodInfo ensureOccasionalFields = GetMethod("EnsureOccasionalFields"); SecurityCritical.ExecutePrivileged(new PermissionSet(PermissionState.Unrestricted), delegate { System.Reflection.Emit.DynamicMethod dm = new System.Reflection.Emit.DynamicMethod("set_Controls ", null, new Type[] { typeof(Control), typeof(ControlCollection) }, typeof(Control).Module, true); ILGenerator il = dm.GetILGenerator(); + Label occFieldsNull = il.DefineLabel(); + Label setControls = il.DefineLabel(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldfld, occasionalFields); + il.Emit(OpCodes.Brfalse_S, occFieldsNull); + il.MarkLabel(setControls); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Stfld, controls); il.Emit(OpCodes.Ret); + il.MarkLabel(occFieldsNull); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Call, ensureOccasionalFields); + il.Emit(OpCodes.Br, setControls); handler = (SetControlsDelegate)dm.CreateDelegate(typeof(SetControlsDelegate)); }); } diff --git a/src/Spring/Spring.Web/Web/Support/SupportsWebDependencyInjectionOwnerProxy.cs b/src/Spring/Spring.Web/Web/Support/SupportsWebDependencyInjectionOwnerProxy.cs index b1d9b891..083b436a 100644 --- a/src/Spring/Spring.Web/Web/Support/SupportsWebDependencyInjectionOwnerProxy.cs +++ b/src/Spring/Spring.Web/Web/Support/SupportsWebDependencyInjectionOwnerProxy.cs @@ -94,22 +94,15 @@ namespace Spring.Web.Support { #if NET_2_0 private static readonly SafeField refOccasionalFields; - private static readonly SafeField refControls; static NamingContainerSupportsWebDependencyInjectionOwnerProxy() { - SafeField fld1 = null; - SafeField fld2 = null; + SafeField fld = null; SecurityCritical.ExecutePrivileged( new PermissionSet(PermissionState.Unrestricted), delegate { - fld1 = new SafeField(typeof(Control).GetField("_occasionalFields", BindingFlags.Instance | BindingFlags.NonPublic)); - if (SystemUtils.Clr4Runtime) - { - fld2 = new SafeField(typeof(Control).GetField("_controls", BindingFlags.Instance | BindingFlags.NonPublic)); - } + fld = new SafeField(typeof(Control).GetField("_occasionalFields", BindingFlags.Instance | BindingFlags.NonPublic)); }); - refOccasionalFields = fld1; - refControls = fld2; + refOccasionalFields = fld; } #endif @@ -118,11 +111,6 @@ namespace Spring.Web.Support #if NET_2_0 object targetOccasionalFields = refOccasionalFields.GetValue(targetControl); refOccasionalFields.SetValue(this, targetOccasionalFields); - if (SystemUtils.Clr4Runtime) - { - object targetControls = refControls.GetValue(targetControl); - refControls.SetValue(this, targetControls); - } #endif } }