Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Activities / InvokeMethodActivity.cs / 1305376 / InvokeMethodActivity.cs
namespace System.Workflow.Activities { using System; using System.Reflection; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Drawing.Design; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.ComponentModel.Compiler; using System.Runtime.Serialization; using System.ComponentModel.Design.Serialization; using System.Collections.Specialized; using System.Collections.Generic; using System.Workflow.Runtime; using System.Runtime.Serialization.Formatters.Binary; using System.Workflow.Activities.Common; [SRDescription(SR.CallExternalMethodActivityDescription)] [Designer(typeof(CallExternalMethodActivityDesigner), typeof(IDesigner))] [DefaultEvent("MethodInvoking")] [ActivityValidator(typeof(CallExternalMethodActivityValidator))] [SRCategory(SR.Base)] public class CallExternalMethodActivity : Activity, IPropertyValueProvider, IDynamicPropertyTypeProvider { //instance properties public static readonly DependencyProperty CorrelationTokenProperty = DependencyProperty.Register("CorrelationToken", typeof(CorrelationToken), typeof(CallExternalMethodActivity), new PropertyMetadata(DependencyPropertyOptions.Metadata)); public static readonly DependencyProperty ParameterBindingsProperty = DependencyProperty.Register("ParameterBindings", typeof(WorkflowParameterBindingCollection), typeof(CallExternalMethodActivity), new PropertyMetadata(DependencyPropertyOptions.Metadata | DependencyPropertyOptions.ReadOnly,new Attribute[] { new BrowsableAttribute(false), new DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content) })); //metadata properties public static readonly DependencyProperty InterfaceTypeProperty = DependencyProperty.Register("InterfaceType", typeof(System.Type), typeof(CallExternalMethodActivity), new PropertyMetadata(null, DependencyPropertyOptions.Metadata, new Attribute[] { new ValidationOptionAttribute(ValidationOption.Required) })); public static readonly DependencyProperty MethodNameProperty = DependencyProperty.Register("MethodName", typeof(string), typeof(CallExternalMethodActivity), new PropertyMetadata("", DependencyPropertyOptions.Metadata, new Attribute[] { new ValidationOptionAttribute(ValidationOption.Required) })); //event public static readonly DependencyProperty MethodInvokingEvent = DependencyProperty.Register("MethodInvoking", typeof(EventHandler), typeof(CallExternalMethodActivity)); internal static readonly ArrayList ReservedParameterNames = new ArrayList(new string[] { "Name", "Enabled", "Description", "MethodName", "MethodInvoking", "InterfaceType" }); #region Constructors public CallExternalMethodActivity() { base.SetReadOnlyPropertyValue(ParameterBindingsProperty, new WorkflowParameterBindingCollection(this)); } public CallExternalMethodActivity(string name) : base(name) { base.SetReadOnlyPropertyValue(ParameterBindingsProperty, new WorkflowParameterBindingCollection(this)); } #endregion [SRCategory(SR.Activity)] [SRDescription(SR.HelperExternalDataExchangeDesc)] [RefreshProperties(RefreshProperties.All)] [Editor(typeof(TypeBrowserEditor), typeof(UITypeEditor))] [TypeFilterProviderAttribute(typeof(ExternalDataExchangeInterfaceTypeFilterProvider))] [DefaultValue(null)] public virtual Type InterfaceType { get { return base.GetValue(InterfaceTypeProperty) as Type; } set { base.SetValue(InterfaceTypeProperty, value); } } [RefreshProperties(RefreshProperties.All)] [TypeConverter(typeof(PropertyValueProviderTypeConverter))] [SRCategory(SR.Activity)] [SRDescription(SR.ExternalMethodNameDescr)] [MergablePropertyAttribute(false)] [DefaultValue("")] public virtual string MethodName { get { return base.GetValue(MethodNameProperty) as string; } set { base.SetValue(MethodNameProperty, value); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [Browsable(false)] public WorkflowParameterBindingCollection ParameterBindings { get { return base.GetValue(ParameterBindingsProperty) as WorkflowParameterBindingCollection; } } [SRCategory(SR.Activity)] [RefreshProperties(RefreshProperties.All)] [SRDescription(SR.CorrelationSetDescr)] [MergableProperty(false)] [TypeConverter(typeof(CorrelationTokenTypeConverter))] [DefaultValue(null)] public virtual CorrelationToken CorrelationToken { get { return base.GetValue(CorrelationTokenProperty) as CorrelationToken; } set { base.SetValue(CorrelationTokenProperty, value); } } [SRDescription(SR.OnBeforeMethodInvokeDescr)] [SRCategory(SR.Handlers)] [MergableProperty(false)] public event EventHandler MethodInvoking { add { base.AddHandler(MethodInvokingEvent, value); } remove { base.RemoveHandler(MethodInvokingEvent, value); } } ICollection IPropertyValueProvider.GetPropertyValues(ITypeDescriptorContext context) { StringCollection names = new StringCollection(); if (this.InterfaceType == null) return names; if (context.PropertyDescriptor.Name == "MethodName") { foreach (MethodInfo method in this.InterfaceType.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)) { if (method.IsSpecialName) continue; names.Add(method.Name); } } return names; } protected override void InitializeProperties() { ActivityHelpers.InitializeCorrelationTokenCollection(this, this.CorrelationToken); Type type = this.InterfaceType; if (type == null) throw new InvalidOperationException(SR.GetString(SR.InterfaceTypeMissing, this.Name)); string methodName = this.MethodName; if (methodName == null) throw new InvalidOperationException(SR.GetString(SR.MethodNameMissing, this.Name)); MethodInfo methodInfo = type.GetMethod(methodName); if (methodInfo != null) InvokeHelper.InitializeParameters(methodInfo, this.ParameterBindings); else throw new InvalidOperationException(SR.GetString(SR.MethodInfoMissing, this.MethodName, this.InterfaceType.Name)); base.InitializeProperties(); } protected virtual void OnMethodInvoking(EventArgs e) { } protected virtual void OnMethodInvoked(EventArgs e) { } protected sealed override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { if (executionContext == null) throw new ArgumentNullException("executionContext"); if (this.InterfaceType == null) throw new ArgumentException( SR.GetString(SR.Error_MissingInterfaceType), "executionContext"); Type type = this.InterfaceType; string methodName = this.MethodName; object serviceValue = executionContext.GetService(type); if (serviceValue == null) throw new InvalidOperationException(SR.GetString(SR.Error_ServiceNotFound, this.InterfaceType)); this.RaiseEvent(MethodInvokingEvent, this, EventArgs.Empty); OnMethodInvoking(EventArgs.Empty); MethodInfo methodInfo = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public); ParameterModifier[] parameterModifiers = null; object[] actualParameters = InvokeHelper.GetParameters(methodInfo, this.ParameterBindings, out parameterModifiers); WorkflowParameterBinding resultBinding = null; if (this.ParameterBindings.Contains("(ReturnValue)")) resultBinding = this.ParameterBindings["(ReturnValue)"]; CorrelationService.InvalidateCorrelationToken(this, type, methodName, actualParameters); object result = type.InvokeMember(this.MethodName, BindingFlags.InvokeMethod, new ExternalDataExchangeBinder(), serviceValue, actualParameters, parameterModifiers, null, null); if (resultBinding != null) resultBinding.Value = InvokeHelper.CloneOutboundValue(result, new BinaryFormatter(), "(ReturnValue)"); InvokeHelper.SaveOutRefParameters(actualParameters, methodInfo, this.ParameterBindings); OnMethodInvoked(EventArgs.Empty); return ActivityExecutionStatus.Closed; } #region IDynamicPropertyTypeProvider Type IDynamicPropertyTypeProvider.GetPropertyType(IServiceProvider serviceProvider, string propertyName) { if (propertyName == null) throw new ArgumentNullException("propertyName"); Dictionaryparameters = new Dictionary (); this.GetParameterPropertyDescriptors(parameters); if (parameters.ContainsKey(propertyName)) { ParameterInfoBasedPropertyDescriptor descriptor = parameters[propertyName] as ParameterInfoBasedPropertyDescriptor; if (descriptor != null) return descriptor.ParameterType; } return null; } AccessTypes IDynamicPropertyTypeProvider.GetAccessType(IServiceProvider serviceProvider, string propertyName) { if (propertyName == null) throw new ArgumentNullException("propertyName"); return AccessTypes.Read; } internal void GetParameterPropertyDescriptors(IDictionary properties) { if (((IComponent)this).Site == null) return; ITypeProvider typeProvider = (ITypeProvider)((IComponent)this).Site.GetService(typeof(ITypeProvider)); if (typeProvider == null) throw new InvalidOperationException(SR.GetString(SR.General_MissingService, typeof(ITypeProvider).FullName)); if (this.GetType() != typeof(CallExternalMethodActivity)) return; // if custom activity do not add parameter binding Type type = this.InterfaceType; if (type == null) return; MethodInfo method = type.GetMethod(this.MethodName); if (method != null) { ArrayList paramInfo = new ArrayList(method.GetParameters()); if (!(method.ReturnType == typeof(void))) paramInfo.Add(method.ReturnParameter); foreach (ParameterInfo param in paramInfo) { if (param.ParameterType != null) { PropertyDescriptor prop = new ParameterInfoBasedPropertyDescriptor(typeof(CallExternalMethodActivity), param, true, DesignOnlyAttribute.Yes); properties[prop.Name] = prop; } } } } #endregion } public class CallExternalMethodActivityValidator : ActivityValidator { public override ValidationErrorCollection Validate(ValidationManager manager, object obj) { CallExternalMethodActivity methodInvoke = obj as CallExternalMethodActivity; if (methodInvoke == null) throw new ArgumentException(SR.GetString(SR.Error_UnexpectedArgumentType, typeof(CallExternalMethodActivity).FullName), "obj"); ValidationErrorCollection validationErrors = base.Validate(manager, obj); validationErrors.AddRange(CorrelationSetsValidator.Validate(manager, obj)); validationErrors.AddRange(ParameterBindingValidator.Validate(manager, obj)); return validationErrors; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. namespace System.Workflow.Activities { using System; using System.Reflection; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Drawing.Design; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.ComponentModel.Compiler; using System.Runtime.Serialization; using System.ComponentModel.Design.Serialization; using System.Collections.Specialized; using System.Collections.Generic; using System.Workflow.Runtime; using System.Runtime.Serialization.Formatters.Binary; using System.Workflow.Activities.Common; [SRDescription(SR.CallExternalMethodActivityDescription)] [Designer(typeof(CallExternalMethodActivityDesigner), typeof(IDesigner))] [DefaultEvent("MethodInvoking")] [ActivityValidator(typeof(CallExternalMethodActivityValidator))] [SRCategory(SR.Base)] public class CallExternalMethodActivity : Activity, IPropertyValueProvider, IDynamicPropertyTypeProvider { //instance properties public static readonly DependencyProperty CorrelationTokenProperty = DependencyProperty.Register("CorrelationToken", typeof(CorrelationToken), typeof(CallExternalMethodActivity), new PropertyMetadata(DependencyPropertyOptions.Metadata)); public static readonly DependencyProperty ParameterBindingsProperty = DependencyProperty.Register("ParameterBindings", typeof(WorkflowParameterBindingCollection), typeof(CallExternalMethodActivity), new PropertyMetadata(DependencyPropertyOptions.Metadata | DependencyPropertyOptions.ReadOnly,new Attribute[] { new BrowsableAttribute(false), new DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content) })); //metadata properties public static readonly DependencyProperty InterfaceTypeProperty = DependencyProperty.Register("InterfaceType", typeof(System.Type), typeof(CallExternalMethodActivity), new PropertyMetadata(null, DependencyPropertyOptions.Metadata, new Attribute[] { new ValidationOptionAttribute(ValidationOption.Required) })); public static readonly DependencyProperty MethodNameProperty = DependencyProperty.Register("MethodName", typeof(string), typeof(CallExternalMethodActivity), new PropertyMetadata("", DependencyPropertyOptions.Metadata, new Attribute[] { new ValidationOptionAttribute(ValidationOption.Required) })); //event public static readonly DependencyProperty MethodInvokingEvent = DependencyProperty.Register("MethodInvoking", typeof(EventHandler), typeof(CallExternalMethodActivity)); internal static readonly ArrayList ReservedParameterNames = new ArrayList(new string[] { "Name", "Enabled", "Description", "MethodName", "MethodInvoking", "InterfaceType" }); #region Constructors public CallExternalMethodActivity() { base.SetReadOnlyPropertyValue(ParameterBindingsProperty, new WorkflowParameterBindingCollection(this)); } public CallExternalMethodActivity(string name) : base(name) { base.SetReadOnlyPropertyValue(ParameterBindingsProperty, new WorkflowParameterBindingCollection(this)); } #endregion [SRCategory(SR.Activity)] [SRDescription(SR.HelperExternalDataExchangeDesc)] [RefreshProperties(RefreshProperties.All)] [Editor(typeof(TypeBrowserEditor), typeof(UITypeEditor))] [TypeFilterProviderAttribute(typeof(ExternalDataExchangeInterfaceTypeFilterProvider))] [DefaultValue(null)] public virtual Type InterfaceType { get { return base.GetValue(InterfaceTypeProperty) as Type; } set { base.SetValue(InterfaceTypeProperty, value); } } [RefreshProperties(RefreshProperties.All)] [TypeConverter(typeof(PropertyValueProviderTypeConverter))] [SRCategory(SR.Activity)] [SRDescription(SR.ExternalMethodNameDescr)] [MergablePropertyAttribute(false)] [DefaultValue("")] public virtual string MethodName { get { return base.GetValue(MethodNameProperty) as string; } set { base.SetValue(MethodNameProperty, value); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [Browsable(false)] public WorkflowParameterBindingCollection ParameterBindings { get { return base.GetValue(ParameterBindingsProperty) as WorkflowParameterBindingCollection; } } [SRCategory(SR.Activity)] [RefreshProperties(RefreshProperties.All)] [SRDescription(SR.CorrelationSetDescr)] [MergableProperty(false)] [TypeConverter(typeof(CorrelationTokenTypeConverter))] [DefaultValue(null)] public virtual CorrelationToken CorrelationToken { get { return base.GetValue(CorrelationTokenProperty) as CorrelationToken; } set { base.SetValue(CorrelationTokenProperty, value); } } [SRDescription(SR.OnBeforeMethodInvokeDescr)] [SRCategory(SR.Handlers)] [MergableProperty(false)] public event EventHandler MethodInvoking { add { base.AddHandler(MethodInvokingEvent, value); } remove { base.RemoveHandler(MethodInvokingEvent, value); } } ICollection IPropertyValueProvider.GetPropertyValues(ITypeDescriptorContext context) { StringCollection names = new StringCollection(); if (this.InterfaceType == null) return names; if (context.PropertyDescriptor.Name == "MethodName") { foreach (MethodInfo method in this.InterfaceType.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)) { if (method.IsSpecialName) continue; names.Add(method.Name); } } return names; } protected override void InitializeProperties() { ActivityHelpers.InitializeCorrelationTokenCollection(this, this.CorrelationToken); Type type = this.InterfaceType; if (type == null) throw new InvalidOperationException(SR.GetString(SR.InterfaceTypeMissing, this.Name)); string methodName = this.MethodName; if (methodName == null) throw new InvalidOperationException(SR.GetString(SR.MethodNameMissing, this.Name)); MethodInfo methodInfo = type.GetMethod(methodName); if (methodInfo != null) InvokeHelper.InitializeParameters(methodInfo, this.ParameterBindings); else throw new InvalidOperationException(SR.GetString(SR.MethodInfoMissing, this.MethodName, this.InterfaceType.Name)); base.InitializeProperties(); } protected virtual void OnMethodInvoking(EventArgs e) { } protected virtual void OnMethodInvoked(EventArgs e) { } protected sealed override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { if (executionContext == null) throw new ArgumentNullException("executionContext"); if (this.InterfaceType == null) throw new ArgumentException( SR.GetString(SR.Error_MissingInterfaceType), "executionContext"); Type type = this.InterfaceType; string methodName = this.MethodName; object serviceValue = executionContext.GetService(type); if (serviceValue == null) throw new InvalidOperationException(SR.GetString(SR.Error_ServiceNotFound, this.InterfaceType)); this.RaiseEvent(MethodInvokingEvent, this, EventArgs.Empty); OnMethodInvoking(EventArgs.Empty); MethodInfo methodInfo = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public); ParameterModifier[] parameterModifiers = null; object[] actualParameters = InvokeHelper.GetParameters(methodInfo, this.ParameterBindings, out parameterModifiers); WorkflowParameterBinding resultBinding = null; if (this.ParameterBindings.Contains("(ReturnValue)")) resultBinding = this.ParameterBindings["(ReturnValue)"]; CorrelationService.InvalidateCorrelationToken(this, type, methodName, actualParameters); object result = type.InvokeMember(this.MethodName, BindingFlags.InvokeMethod, new ExternalDataExchangeBinder(), serviceValue, actualParameters, parameterModifiers, null, null); if (resultBinding != null) resultBinding.Value = InvokeHelper.CloneOutboundValue(result, new BinaryFormatter(), "(ReturnValue)"); InvokeHelper.SaveOutRefParameters(actualParameters, methodInfo, this.ParameterBindings); OnMethodInvoked(EventArgs.Empty); return ActivityExecutionStatus.Closed; } #region IDynamicPropertyTypeProvider Type IDynamicPropertyTypeProvider.GetPropertyType(IServiceProvider serviceProvider, string propertyName) { if (propertyName == null) throw new ArgumentNullException("propertyName"); Dictionary parameters = new Dictionary (); this.GetParameterPropertyDescriptors(parameters); if (parameters.ContainsKey(propertyName)) { ParameterInfoBasedPropertyDescriptor descriptor = parameters[propertyName] as ParameterInfoBasedPropertyDescriptor; if (descriptor != null) return descriptor.ParameterType; } return null; } AccessTypes IDynamicPropertyTypeProvider.GetAccessType(IServiceProvider serviceProvider, string propertyName) { if (propertyName == null) throw new ArgumentNullException("propertyName"); return AccessTypes.Read; } internal void GetParameterPropertyDescriptors(IDictionary properties) { if (((IComponent)this).Site == null) return; ITypeProvider typeProvider = (ITypeProvider)((IComponent)this).Site.GetService(typeof(ITypeProvider)); if (typeProvider == null) throw new InvalidOperationException(SR.GetString(SR.General_MissingService, typeof(ITypeProvider).FullName)); if (this.GetType() != typeof(CallExternalMethodActivity)) return; // if custom activity do not add parameter binding Type type = this.InterfaceType; if (type == null) return; MethodInfo method = type.GetMethod(this.MethodName); if (method != null) { ArrayList paramInfo = new ArrayList(method.GetParameters()); if (!(method.ReturnType == typeof(void))) paramInfo.Add(method.ReturnParameter); foreach (ParameterInfo param in paramInfo) { if (param.ParameterType != null) { PropertyDescriptor prop = new ParameterInfoBasedPropertyDescriptor(typeof(CallExternalMethodActivity), param, true, DesignOnlyAttribute.Yes); properties[prop.Name] = prop; } } } } #endregion } public class CallExternalMethodActivityValidator : ActivityValidator { public override ValidationErrorCollection Validate(ValidationManager manager, object obj) { CallExternalMethodActivity methodInvoke = obj as CallExternalMethodActivity; if (methodInvoke == null) throw new ArgumentException(SR.GetString(SR.Error_UnexpectedArgumentType, typeof(CallExternalMethodActivity).FullName), "obj"); ValidationErrorCollection validationErrors = base.Validate(manager, obj); validationErrors.AddRange(CorrelationSetsValidator.Validate(manager, obj)); validationErrors.AddRange(ParameterBindingValidator.Validate(manager, obj)); return validationErrors; } } } // 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
- AutoSizeComboBox.cs
- SlipBehavior.cs
- StateMachineSubscription.cs
- SafeNativeMethods.cs
- EFAssociationProvider.cs
- Container.cs
- KnowledgeBase.cs
- WhitespaceRule.cs
- LeaseManager.cs
- CaseKeyBox.xaml.cs
- OutputCache.cs
- DocumentViewer.cs
- XAMLParseException.cs
- IndexedGlyphRun.cs
- PolicyManager.cs
- ModifierKeysValueSerializer.cs
- TextServicesProperty.cs
- AuthenticationService.cs
- WebPartConnection.cs
- ToolStrip.cs
- ComponentManagerBroker.cs
- LineInfo.cs
- MethodBuilder.cs
- WeakEventTable.cs
- DocumentStream.cs
- SqlConnectionHelper.cs
- GridViewCancelEditEventArgs.cs
- LabelLiteral.cs
- ToolStripContentPanel.cs
- ReliabilityContractAttribute.cs
- altserialization.cs
- GraphicsContainer.cs
- SocketPermission.cs
- SoapReflectionImporter.cs
- DataComponentGenerator.cs
- _BufferOffsetSize.cs
- ReferenceEqualityComparer.cs
- TextBounds.cs
- UnionCodeGroup.cs
- DataObjectMethodAttribute.cs
- DataControlFieldCell.cs
- DockAndAnchorLayout.cs
- DecimalAnimationUsingKeyFrames.cs
- JavaScriptObjectDeserializer.cs
- WorkflowQueueInfo.cs
- Soap12ProtocolReflector.cs
- SQLDateTime.cs
- RelatedImageListAttribute.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- Timer.cs
- DataGridViewRowDividerDoubleClickEventArgs.cs
- FloatMinMaxAggregationOperator.cs
- SqlParameter.cs
- DataGridViewLinkColumn.cs
- ExpressionLexer.cs
- EpmSyndicationContentDeSerializer.cs
- Command.cs
- Utils.cs
- Odbc32.cs
- DataSourceSelectArguments.cs
- QilTargetType.cs
- SignalGate.cs
- TreeViewImageIndexConverter.cs
- SiteMapPath.cs
- UnmanagedMemoryStream.cs
- PriorityQueue.cs
- ReflectionPermission.cs
- GeneratedCodeAttribute.cs
- SymLanguageVendor.cs
- CodePageEncoding.cs
- SamlSecurityTokenAuthenticator.cs
- CircleHotSpot.cs
- DataBoundControlParameterTarget.cs
- TextElementCollection.cs
- CorrelationResolver.cs
- ReadWriteSpinLock.cs
- ObjectAnimationUsingKeyFrames.cs
- DataGridViewHeaderCell.cs
- ColorInterpolationModeValidation.cs
- WebGetAttribute.cs
- Win32Exception.cs
- ThreadExceptionDialog.cs
- CreateUserErrorEventArgs.cs
- AutoSizeToolBoxItem.cs
- FileChangesMonitor.cs
- lengthconverter.cs
- DefaultWorkflowSchedulerService.cs
- Table.cs
- NavigationProperty.cs
- XamlBrushSerializer.cs
- SessionParameter.cs
- WebPartZone.cs
- RoleBoolean.cs
- RotateTransform3D.cs
- KeyManager.cs
- DbDataAdapter.cs
- clipboard.cs
- LOSFormatter.cs
- SpAudioStreamWrapper.cs
- XmlUtf8RawTextWriter.cs