Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Dispatcher / InvokerUtil.cs / 1 / InvokerUtil.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel.Dispatcher { using System; using System.ServiceModel.Description; using System.Reflection; using System.Reflection.Emit; using System.Security.Permissions; using System.Globalization; using System.Security; using System.Diagnostics; internal delegate object InvokeDelegate(object target, object[] inputs, object[] outputs); internal delegate IAsyncResult InvokeBeginDelegate(object target, object[] inputs, AsyncCallback asyncCallback, object state); internal delegate object InvokeEndDelegate(object target, object[] outputs, IAsyncResult result); internal delegate object CreateInstanceDelegate(); sealed class InvokerUtil { ////// Critical - holds instance of CriticalHelper which keeps state that was produced within an assert /// [SecurityCritical] CriticalHelper helper; ////// Critical - initializes SecurityCritical field 'helper' /// Safe - doesn't leak anything /// [SecurityCritical, SecurityTreatAsSafe] public InvokerUtil() { helper = new CriticalHelper(); } ////// Critical - accesses SecurityCritical helper class 'CriticalHelper' /// Safe - resultant delegate is self-contained and safe for general consumption, nothing else leaks /// [SecurityCritical, SecurityTreatAsSafe] internal CreateInstanceDelegate GenerateCreateInstanceDelegate(Type type, ConstructorInfo constructor) { return helper.GenerateCreateInstanceDelegate(type, constructor); } ////// Critical - accesses SecurityCritical helper class 'CriticalHelper' /// Safe - resultant delegate is self-contained and safe for general consumption, parameter counts are safe, nothing else leaks /// [SecurityCritical, SecurityTreatAsSafe] internal InvokeDelegate GenerateInvokeDelegate(MethodInfo method, out int inputParameterCount, out int outputParameterCount) { return helper.GenerateInvokeDelegate(method, out inputParameterCount, out outputParameterCount); } ////// Critical - accesses SecurityCritical helper class 'CriticalHelper' /// Safe - resultant delegate is self-contained and safe for general consumption, parameter count is safe, nothing else leaks /// [SecurityCritical, SecurityTreatAsSafe] internal InvokeBeginDelegate GenerateInvokeBeginDelegate(MethodInfo method, out int inputParameterCount) { return helper.GenerateInvokeBeginDelegate(method, out inputParameterCount); } ////// Critical - accesses SecurityCritical helper class 'CriticalHelper' /// Safe - resultant delegate is self-contained and safe for general consumption, parameter count is safe, nothing else leaks /// [SecurityCritical, SecurityTreatAsSafe] internal InvokeEndDelegate GenerateInvokeEndDelegate(MethodInfo method, out int outputParameterCount) { return helper.GenerateInvokeEndDelegate(method, out outputParameterCount); } ////// Critical - handles all aspects of IL generation including initializing the DynamicMethod, which requires an elevation /// since the ILGenerator is created under an elevation, we lock down access to every aspect of the generation /// [SecurityCritical(SecurityCriticalScope.Everything)] class CriticalHelper { static Type TypeOfObject = typeof(object); CodeGenerator ilg; internal CreateInstanceDelegate GenerateCreateInstanceDelegate(Type type, ConstructorInfo constructor) { bool requiresMemberAccess = !IsTypeVisible(type) || ConstructorRequiresMemberAccess(constructor); this.ilg = new CodeGenerator(); try { ilg.BeginMethod("Create" + type.FullName, typeof(CreateInstanceDelegate), requiresMemberAccess); } catch (SecurityException securityException) { if (requiresMemberAccess && securityException.PermissionType.Equals(typeof(ReflectionPermission))) { if (DiagnosticUtility.ShouldTraceWarning) { DiagnosticUtility.ExceptionUtility.TraceHandledException(securityException, TraceEventType.Warning); } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new SecurityException(SR.GetString( SR.PartialTrustServiceCtorNotVisible, type.FullName))); } else { throw; } } if (type.IsValueType) { LocalBuilder instanceLocal = ilg.DeclareLocal(type, type.Name + "Instance"); ilg.LoadZeroValueIntoLocal(type, instanceLocal); ilg.Load(instanceLocal); } else { ilg.New(constructor); } ilg.ConvertValue(type, ilg.CurrentMethod.ReturnType); return (CreateInstanceDelegate)ilg.EndMethod(); } internal InvokeDelegate GenerateInvokeDelegate(MethodInfo method, out int inputParameterCount, out int outputParameterCount) { bool requiresMemberAccess = MethodRequiresMemberAccess(method); this.ilg = new CodeGenerator(); try { this.ilg.BeginMethod("SyncInvoke" + method.Name, typeof(InvokeDelegate), requiresMemberAccess); } catch (SecurityException securityException) { if (requiresMemberAccess && securityException.PermissionType.Equals(typeof(ReflectionPermission))) { if (DiagnosticUtility.ShouldTraceWarning) { DiagnosticUtility.ExceptionUtility.TraceHandledException(securityException, TraceEventType.Warning); } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new SecurityException(SR.GetString( SR.PartialTrustServiceMethodNotVisible, method.DeclaringType.FullName, method.Name))); } else { throw; } } ArgBuilder targetArg = ilg.GetArg(0); ArgBuilder inputParametersArg = ilg.GetArg(1); ArgBuilder outputParametersArg = ilg.GetArg(2); ParameterInfo[] parameters = method.GetParameters(); LocalBuilder returnLocal = ilg.DeclareLocal(ilg.CurrentMethod.ReturnType, "returnParam"); LocalBuilder[] parameterLocals = new LocalBuilder[parameters.Length]; DeclareParameterLocals(parameters, parameterLocals); LoadInputParametersIntoLocals(parameters, parameterLocals, inputParametersArg, out inputParameterCount); LoadTarget(targetArg, method.ReflectedType); LoadParameters(parameters, parameterLocals); InvokeMethod(method, returnLocal); LoadOutputParametersIntoArray(parameters, parameterLocals, outputParametersArg, out outputParameterCount); ilg.Load(returnLocal); return (InvokeDelegate)this.ilg.EndMethod(); } internal InvokeBeginDelegate GenerateInvokeBeginDelegate(MethodInfo method, out int inputParameterCount) { bool requiresMemberAccess = MethodRequiresMemberAccess(method); this.ilg = new CodeGenerator(); try { this.ilg.BeginMethod("AsyncInvokeBegin" + method.Name, typeof(InvokeBeginDelegate), requiresMemberAccess); } catch (SecurityException securityException) { if (requiresMemberAccess && securityException.PermissionType.Equals(typeof(ReflectionPermission))) { if (DiagnosticUtility.ShouldTraceWarning) { DiagnosticUtility.ExceptionUtility.TraceHandledException(securityException, TraceEventType.Warning); } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new SecurityException(SR.GetString( SR.PartialTrustServiceMethodNotVisible, method.DeclaringType.FullName, method.Name))); } else { throw; } } ArgBuilder targetArg = ilg.GetArg(0); ArgBuilder inputParametersArg = ilg.GetArg(1); ArgBuilder callbackArg = ilg.GetArg(2); ArgBuilder stateArg = ilg.GetArg(3); ParameterInfo[] parameters = method.GetParameters(); LocalBuilder returnLocal = ilg.DeclareLocal(ilg.CurrentMethod.ReturnType, "returnParam"); LocalBuilder[] parameterLocals = new LocalBuilder[parameters.Length - 2]; DeclareParameterLocals(parameters, parameterLocals); LoadInputParametersIntoLocals(parameters, parameterLocals, inputParametersArg, out inputParameterCount); LoadTarget(targetArg, method.ReflectedType); LoadParameters(parameters, parameterLocals); ilg.Load(callbackArg); ilg.Load(stateArg); InvokeMethod(method, returnLocal); ilg.Load(returnLocal); return (InvokeBeginDelegate)this.ilg.EndMethod(); } internal InvokeEndDelegate GenerateInvokeEndDelegate(MethodInfo method, out int outputParameterCount) { bool requiresMemberAccess = MethodRequiresMemberAccess(method); this.ilg = new CodeGenerator(); try { this.ilg.BeginMethod("AsyncInvokeEnd" + method.Name, typeof(InvokeEndDelegate), requiresMemberAccess); } catch (SecurityException securityException) { if (requiresMemberAccess && securityException.PermissionType.Equals(typeof(ReflectionPermission))) { if (DiagnosticUtility.ShouldTraceWarning) { DiagnosticUtility.ExceptionUtility.TraceHandledException(securityException, TraceEventType.Warning); } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new SecurityException(SR.GetString( SR.PartialTrustServiceMethodNotVisible, method.DeclaringType.FullName, method.Name))); } else { throw; } } ArgBuilder targetArg = ilg.GetArg(0); ArgBuilder outputParametersArg = ilg.GetArg(1); ArgBuilder resultArg = ilg.GetArg(2); ParameterInfo[] parameters = method.GetParameters(); LocalBuilder returnLocal = ilg.DeclareLocal(ilg.CurrentMethod.ReturnType, "returnParam"); LocalBuilder[] parameterLocals = new LocalBuilder[parameters.Length - 1]; DeclareParameterLocals(parameters, parameterLocals); LoadZeroValueInputParametersIntoLocals(parameters, parameterLocals); LoadTarget(targetArg, method.ReflectedType); LoadParameters(parameters, parameterLocals); ilg.Load(resultArg); InvokeMethod(method, returnLocal); LoadOutputParametersIntoArray(parameters, parameterLocals, outputParametersArg, out outputParameterCount); ilg.Load(returnLocal); return (InvokeEndDelegate)this.ilg.EndMethod(); } void DeclareParameterLocals(ParameterInfo[] parameters, LocalBuilder[] parameterLocals) { for (int i = 0; i < parameterLocals.Length; i++) { parameterLocals[i] = ilg.DeclareLocal(TypeLoader.GetParameterType(parameters[i]), "param" + i.ToString(CultureInfo.InvariantCulture)); } } void LoadInputParametersIntoLocals(ParameterInfo[] parameters, LocalBuilder[] parameterLocals, ArgBuilder inputParametersArg, out int inputParameterCount) { inputParameterCount = 0; for (int i = 0; i < parameterLocals.Length; i++) { if (ServiceReflector.FlowsIn(parameters[i])) { Type parameterType = parameterLocals[i].LocalType; ilg.LoadArrayElement(inputParametersArg, inputParameterCount); if (!parameterType.IsValueType) { ilg.ConvertValue(TypeOfObject, parameterType); ilg.Store(parameterLocals[i]); } else { ilg.Dup(); ilg.If(); ilg.ConvertValue(TypeOfObject, parameterType); ilg.Store(parameterLocals[i]); ilg.Else(); ilg.Pop(); ilg.LoadZeroValueIntoLocal(parameterType, parameterLocals[i]); ilg.EndIf(); } inputParameterCount++; } } } void LoadZeroValueInputParametersIntoLocals(ParameterInfo[] parameters, LocalBuilder[] parameterLocals) { for (int i = 0; i < parameterLocals.Length; i++) { if (ServiceReflector.FlowsIn(parameters[i])) { ilg.LoadZeroValueIntoLocal(parameterLocals[i].LocalType, parameterLocals[i]); } } } void LoadTarget(ArgBuilder targetArg, Type targetType) { ilg.Load(targetArg); ilg.ConvertValue(targetArg.ArgType, targetType); if (targetType.IsValueType) { LocalBuilder targetLocal = ilg.DeclareLocal(targetType, "target"); ilg.Store(targetLocal); ilg.LoadAddress(targetLocal); } } void LoadParameters(ParameterInfo[] parameters, LocalBuilder[] parameterLocals) { for (int i = 0; i < parameterLocals.Length; i++) { if (parameters[i].ParameterType.IsByRef) ilg.Ldloca(parameterLocals[i]); else ilg.Ldloc(parameterLocals[i]); } } void InvokeMethod(MethodInfo method, LocalBuilder returnLocal) { ilg.Call(method); if (method.ReturnType == typeof(void)) ilg.Load(null); else ilg.ConvertValue(method.ReturnType, ilg.CurrentMethod.ReturnType); ilg.Store(returnLocal); } void LoadOutputParametersIntoArray(ParameterInfo[] parameters, LocalBuilder[] parameterLocals, ArgBuilder outputParametersArg, out int outputParameterCount) { outputParameterCount = 0; for (int i = 0; i < parameterLocals.Length; i++) { if (ServiceReflector.FlowsOut(parameters[i])) { ilg.Load(outputParametersArg); ilg.Load(outputParameterCount); ilg.Load(parameterLocals[i]); ilg.ConvertValue(parameterLocals[i].LocalType, TypeOfObject); ilg.Stelem(TypeOfObject); outputParameterCount++; } } } static bool IsTypeVisible(Type t) { if (t.Module == typeof(InvokerUtil).Module) return true; if (!t.IsVisible) return false; foreach (Type genericType in t.GetGenericArguments()) { if (!genericType.IsGenericParameter && !IsTypeVisible(genericType)) return false; } return true; } static bool ConstructorRequiresMemberAccess(ConstructorInfo ctor) { return ctor != null && (!ctor.IsPublic || !IsTypeVisible(ctor.DeclaringType)) && ctor.Module != typeof(InvokerUtil).Module; } static bool MethodRequiresMemberAccess(MethodInfo method) { return method != null && (!method.IsPublic || !IsTypeVisible(method.DeclaringType)) && method.Module != typeof(InvokerUtil).Module; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ListComponentEditorPage.cs
- AnnotationResourceCollection.cs
- PrefixQName.cs
- CompatibleIComparer.cs
- TransformedBitmap.cs
- DataGridCell.cs
- HttpTransportSecurity.cs
- PasswordBox.cs
- MailHeaderInfo.cs
- Convert.cs
- EventSchemaTraceListener.cs
- RealProxy.cs
- ExtensionFile.cs
- CharacterString.cs
- Color.cs
- Debug.cs
- OdbcError.cs
- ClientBuildManager.cs
- TraceContextRecord.cs
- CompilerScopeManager.cs
- ComEventsMethod.cs
- SkinBuilder.cs
- BinaryMessageEncoder.cs
- BamlStream.cs
- ComponentChangedEvent.cs
- PrefixQName.cs
- WebRequestModuleElementCollection.cs
- XmlBindingWorker.cs
- ChannelManagerService.cs
- SolidBrush.cs
- HMACSHA256.cs
- ExpressionStringBuilder.cs
- ToolStripPanelDesigner.cs
- RemotingAttributes.cs
- ProxyRpc.cs
- CmsInterop.cs
- SecurityAlgorithmSuite.cs
- ProjectionCamera.cs
- DataGridViewRowHeightInfoPushedEventArgs.cs
- ImageAutomationPeer.cs
- TrackingAnnotationCollection.cs
- DataColumnPropertyDescriptor.cs
- EntityCommandCompilationException.cs
- StyleCollection.cs
- CellParaClient.cs
- Themes.cs
- PeerCollaboration.cs
- ConcurrentStack.cs
- ProtocolInformationReader.cs
- CheckPair.cs
- DataRelation.cs
- TriState.cs
- WebEvents.cs
- XPathPatternBuilder.cs
- LayoutEngine.cs
- GridViewCellAutomationPeer.cs
- RawAppCommandInputReport.cs
- QilLiteral.cs
- IdentityNotMappedException.cs
- GridLengthConverter.cs
- SelfIssuedAuthProofToken.cs
- FrameworkObject.cs
- IsolationInterop.cs
- FileLogRecordEnumerator.cs
- Brush.cs
- WebOperationContext.cs
- DataGridSortCommandEventArgs.cs
- PerfCounterSection.cs
- Serializer.cs
- LambdaCompiler.Logical.cs
- TextEditorTables.cs
- DataBindingCollection.cs
- CodeGroup.cs
- GenericRootAutomationPeer.cs
- TextFindEngine.cs
- EntityDataSourceDesigner.cs
- DefaultHttpHandler.cs
- ScanQueryOperator.cs
- SettingsAttributes.cs
- CultureMapper.cs
- WebEventCodes.cs
- BuildResult.cs
- CssStyleCollection.cs
- XamlPointCollectionSerializer.cs
- TextEmbeddedObject.cs
- BitmapEditor.cs
- SequentialUshortCollection.cs
- IDictionary.cs
- ApplyImportsAction.cs
- ColorKeyFrameCollection.cs
- figurelengthconverter.cs
- OleDbDataAdapter.cs
- UIElement.cs
- propertytag.cs
- Vector3DValueSerializer.cs
- LeaseManager.cs
- XhtmlConformanceSection.cs
- NameNode.cs
- CaseInsensitiveHashCodeProvider.cs
- DefaultValueConverter.cs