Add 'side by side' support in Framework .NET 4.0 [SPRNET-1320] (Fixed Spring.Web)

This commit is contained in:
bbaia
2010-06-08 00:40:46 +00:00
parent 65f1d2f4b8
commit 61bc468d66
2 changed files with 15 additions and 15 deletions

View File

@@ -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));
});
}

View File

@@ -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
}
}