// Called by the designer to register any design-time metadata.
        //
        // Be aware of the accidential performance impact when adding things into this method.
        // In particular, pay attention to calls that will lead to loading extra assemblies.
        //
        public void Register()
        {
            AttributeTableBuilder builder = new AttributeTableBuilder();

            //shared component
            builder.AddCustomAttributes(typeof(Collection <Constraint>), new BrowsableAttribute(false));
            builder.AddCustomAttributes(typeof(string), new EditorReuseAttribute(false));
            builder.AddCustomAttributes(typeof(ActivityAction), new EditorReuseAttribute(false));
            builder.AddCustomAttributes(typeof(XName), new EditorReuseAttribute(false));

            //Flowchart activities
            FlowchartDesigner.RegisterMetadata(builder);
            FlowSwitchDesigner.RegisterMetadata(builder);
            FlowDecisionDesigner.RegisterMetadata(builder);

            // Messaging activities
            ServiceDesigner.RegisterMetadata(builder);

            // Registering inline for designers for InitializeCorrelation, Send, Receive, SendReply, ReceiveReply activities to avoid calling
            // their static constructors. This will avoid instantiating the ResourceDictionary for their PropertyValueEditors during designer load.
            builder.AddCustomAttributes(typeof(Send), new DesignerAttribute(typeof(SendDesigner)));
            builder.AddCustomAttributes(typeof(Send), new ActivityDesignerOptionsAttribute {
                AllowDrillIn = false
            });

            builder.AddCustomAttributes(typeof(Receive), new DesignerAttribute(typeof(ReceiveDesigner)));
            builder.AddCustomAttributes(typeof(Receive), new ActivityDesignerOptionsAttribute {
                AllowDrillIn = false
            });

            builder.AddCustomAttributes(typeof(SendReply), new FeatureAttribute(typeof(SendReplyValidationFeature)));
            builder.AddCustomAttributes(typeof(SendReply), new DesignerAttribute(typeof(SendReplyDesigner)));
            builder.AddCustomAttributes(typeof(SendReply), new ActivityDesignerOptionsAttribute {
                AllowDrillIn = false
            });
            CutCopyPasteHelper.AddDisallowedTypeForCopy(typeof(SendReply));

            builder.AddCustomAttributes(typeof(ReceiveReply), new FeatureAttribute(typeof(ReceiveReplyValidationFeature)));
            builder.AddCustomAttributes(typeof(ReceiveReply), new DesignerAttribute(typeof(ReceiveReplyDesigner)));
            builder.AddCustomAttributes(typeof(ReceiveReply), new ActivityDesignerOptionsAttribute {
                AllowDrillIn = false
            });
            CutCopyPasteHelper.AddDisallowedTypeForCopy(typeof(ReceiveReply));

            builder.AddCustomAttributes(typeof(InitializeCorrelation), new DesignerAttribute(typeof(InitializeCorrelationDesigner)));
            builder.AddCustomAttributes(typeof(InitializeCorrelation), new ActivityDesignerOptionsAttribute {
                AllowDrillIn = false
            });

            TransactedReceiveScopeDesigner.RegisterMetadata(builder);
            CorrelationScopeDesigner.RegisterMetadata(builder);

            //Procedural activities
            AssignDesigner.RegisterMetadata(builder);
            IfElseDesigner.RegisterMetadata(builder);
            InvokeMethodDesigner.RegisterMetadata(builder);
            DoWhileDesigner.RegisterMetadata(builder);
            WhileDesigner.RegisterMetadata(builder);
            ForEachDesigner.RegisterMetadata(builder);
            TryCatchDesigner.RegisterMetadata(builder);
            CatchDesigner.RegisterMetadata(builder);
            ParallelDesigner.RegisterMetadata(builder);
            SequenceDesigner.RegisterMetadata(builder);
            SwitchDesigner.RegisterMetadata(builder);
            CaseDesigner.RegisterMetadata(builder);

            //Compensation/Transaction
            CancellationScopeDesigner.RegisterMetadata(builder);
            CompensableActivityDesigner.RegisterMetadata(builder);
            TransactionScopeDesigner.RegisterMetadata(builder);

            //Misc activities
            PickDesigner.RegisterMetadata(builder);
            PickBranchDesigner.RegisterMetadata(builder);
            WriteLineDesigner.RegisterMetadata(builder);
            NoPersistScopeDesigner.RegisterMetadata(builder);

            InvokeDelegateDesigner.RegisterMetadata(builder);

            // StateMachine
            StateMachineDesigner.RegisterMetadata(builder);
            StateDesigner.RegisterMetadata(builder);
            TransitionDesigner.RegisterMetadata(builder);

            builder.AddCustomAttributes(typeof(AddToCollection <>), new FeatureAttribute(typeof(UpdatableGenericArgumentsFeature)));
            builder.AddCustomAttributes(typeof(RemoveFromCollection <>), new FeatureAttribute(typeof(UpdatableGenericArgumentsFeature)));
            builder.AddCustomAttributes(typeof(ClearCollection <>), new FeatureAttribute(typeof(UpdatableGenericArgumentsFeature)));
            builder.AddCustomAttributes(typeof(ExistsInCollection <>), new FeatureAttribute(typeof(UpdatableGenericArgumentsFeature)));

            builder.AddCustomAttributes(typeof(AddToCollection <>), new DefaultTypeArgumentAttribute(typeof(int)));
            builder.AddCustomAttributes(typeof(RemoveFromCollection <>), new DefaultTypeArgumentAttribute(typeof(int)));
            builder.AddCustomAttributes(typeof(ClearCollection <>), new DefaultTypeArgumentAttribute(typeof(int)));
            builder.AddCustomAttributes(typeof(ExistsInCollection <>), new DefaultTypeArgumentAttribute(typeof(int)));

            MetadataStore.AddAttributeTable(builder.CreateTable());

            MorphHelper.AddPropertyValueMorphHelper(typeof(InArgument <>), MorphHelpers.ArgumentMorphHelper);
            MorphHelper.AddPropertyValueMorphHelper(typeof(OutArgument <>), MorphHelpers.ArgumentMorphHelper);
            MorphHelper.AddPropertyValueMorphHelper(typeof(InOutArgument <>), MorphHelpers.ArgumentMorphHelper);
            MorphHelper.AddPropertyValueMorphHelper(typeof(ActivityAction <>), MorphHelpers.ActivityActionMorphHelper);
            MorphHelper.AddPropertyValueMorphHelper(typeof(ActivityFunc <,>), MorphHelpers.ActivityFuncMorphHelper);

            // There is no need to keep an reference to this delayed worker since the AppDomain event handler will do it.
            RegisterMetadataDelayedWorker delayedWorker = new RegisterMetadataDelayedWorker();

            delayedWorker.RegisterMetadataDelayed("System.Workflow.Runtime", InteropDesigner.RegisterMetadata);
            delayedWorker.RegisterMetadataDelayed("System.ServiceModel", RegisterMetadataForMessagingActivitiesSearchMetadata);
            delayedWorker.RegisterMetadataDelayed("System.ServiceModel", RegisterMetadataForMessagingActivitiesPropertyEditors);
            delayedWorker.WorkNowIfApplicable();
        }
        // Called by the designer to register any design-time metadata.
        //
        // Be aware of the accidential performance impact when adding things into this method.
        // In particular, pay attention to calls that will lead to loading extra assemblies.
        //
        public void Register()
        {
            AttributeTableBuilder builder = new AttributeTableBuilder();

            //shared component
            builder.AddCustomAttributes(typeof(Collection<Constraint>), new BrowsableAttribute(false));
            builder.AddCustomAttributes(typeof(string), new EditorReuseAttribute(false));
            builder.AddCustomAttributes(typeof(ActivityAction), new EditorReuseAttribute(false));
            builder.AddCustomAttributes(typeof(XName), new EditorReuseAttribute(false));

            //Flowchart activities
            FlowchartDesigner.RegisterMetadata(builder);
            FlowSwitchDesigner.RegisterMetadata(builder);
            FlowDecisionDesigner.RegisterMetadata(builder);

            // Messaging activities
            ServiceDesigner.RegisterMetadata(builder);

            // Registering inline for designers for InitializeCorrelation, Send, Receive, SendReply, ReceiveReply activities to avoid calling
            // their static constructors. This will avoid instantiating the ResourceDictionary for their PropertyValueEditors during designer load.
            builder.AddCustomAttributes(typeof(Send), new DesignerAttribute(typeof(SendDesigner)));
            builder.AddCustomAttributes(typeof(Send), new ActivityDesignerOptionsAttribute { AllowDrillIn = false });

            builder.AddCustomAttributes(typeof(Receive), new DesignerAttribute(typeof(ReceiveDesigner)));
            builder.AddCustomAttributes(typeof(Receive), new ActivityDesignerOptionsAttribute { AllowDrillIn = false });

            builder.AddCustomAttributes(typeof(SendReply), new FeatureAttribute(typeof(SendReplyValidationFeature)));
            builder.AddCustomAttributes(typeof(SendReply), new DesignerAttribute(typeof(SendReplyDesigner)));
            builder.AddCustomAttributes(typeof(SendReply), new ActivityDesignerOptionsAttribute { AllowDrillIn = false });
            CutCopyPasteHelper.AddDisallowedTypeForCopy(typeof(SendReply));

            builder.AddCustomAttributes(typeof(ReceiveReply), new FeatureAttribute(typeof(ReceiveReplyValidationFeature)));
            builder.AddCustomAttributes(typeof(ReceiveReply), new DesignerAttribute(typeof(ReceiveReplyDesigner)));
            builder.AddCustomAttributes(typeof(ReceiveReply), new ActivityDesignerOptionsAttribute { AllowDrillIn = false });
            CutCopyPasteHelper.AddDisallowedTypeForCopy(typeof(ReceiveReply));

            builder.AddCustomAttributes(typeof(InitializeCorrelation), new DesignerAttribute(typeof(InitializeCorrelationDesigner)));
            builder.AddCustomAttributes(typeof(InitializeCorrelation), new ActivityDesignerOptionsAttribute { AllowDrillIn = false });

            TransactedReceiveScopeDesigner.RegisterMetadata(builder);
            CorrelationScopeDesigner.RegisterMetadata(builder);

            //Procedural activities
            AssignDesigner.RegisterMetadata(builder);
            IfElseDesigner.RegisterMetadata(builder);
            InvokeMethodDesigner.RegisterMetadata(builder);
            DoWhileDesigner.RegisterMetadata(builder);
            WhileDesigner.RegisterMetadata(builder);
            ForEachDesigner.RegisterMetadata(builder);
            TryCatchDesigner.RegisterMetadata(builder);
            CatchDesigner.RegisterMetadata(builder);
            ParallelDesigner.RegisterMetadata(builder);
            SequenceDesigner.RegisterMetadata(builder);
            SwitchDesigner.RegisterMetadata(builder);
            CaseDesigner.RegisterMetadata(builder);

            //Compensation/Transaction
            CancellationScopeDesigner.RegisterMetadata(builder);
            CompensableActivityDesigner.RegisterMetadata(builder);
            TransactionScopeDesigner.RegisterMetadata(builder);

            //Misc activities            
            PickDesigner.RegisterMetadata(builder);
            PickBranchDesigner.RegisterMetadata(builder);
            WriteLineDesigner.RegisterMetadata(builder);
            NoPersistScopeDesigner.RegisterMetadata(builder);

            InvokeDelegateDesigner.RegisterMetadata(builder);

            // StateMachine
            StateMachineDesigner.RegisterMetadata(builder);
            StateDesigner.RegisterMetadata(builder);
            TransitionDesigner.RegisterMetadata(builder);

            builder.AddCustomAttributes(typeof(AddToCollection<>), new FeatureAttribute(typeof(UpdatableGenericArgumentsFeature)));
            builder.AddCustomAttributes(typeof(RemoveFromCollection<>), new FeatureAttribute(typeof(UpdatableGenericArgumentsFeature)));
            builder.AddCustomAttributes(typeof(ClearCollection<>), new FeatureAttribute(typeof(UpdatableGenericArgumentsFeature)));
            builder.AddCustomAttributes(typeof(ExistsInCollection<>), new FeatureAttribute(typeof(UpdatableGenericArgumentsFeature)));

            builder.AddCustomAttributes(typeof(AddToCollection<>), new DefaultTypeArgumentAttribute(typeof(int)));
            builder.AddCustomAttributes(typeof(RemoveFromCollection<>), new DefaultTypeArgumentAttribute(typeof(int)));
            builder.AddCustomAttributes(typeof(ClearCollection<>), new DefaultTypeArgumentAttribute(typeof(int)));
            builder.AddCustomAttributes(typeof(ExistsInCollection<>), new DefaultTypeArgumentAttribute(typeof(int)));

            MetadataStore.AddAttributeTable(builder.CreateTable());

            MorphHelper.AddPropertyValueMorphHelper(typeof(InArgument<>), MorphHelpers.ArgumentMorphHelper);
            MorphHelper.AddPropertyValueMorphHelper(typeof(OutArgument<>), MorphHelpers.ArgumentMorphHelper);
            MorphHelper.AddPropertyValueMorphHelper(typeof(InOutArgument<>), MorphHelpers.ArgumentMorphHelper);
            MorphHelper.AddPropertyValueMorphHelper(typeof(ActivityAction<>), MorphHelpers.ActivityActionMorphHelper);
            MorphHelper.AddPropertyValueMorphHelper(typeof(ActivityFunc<,>), MorphHelpers.ActivityFuncMorphHelper);

            // There is no need to keep an reference to this delayed worker since the AppDomain event handler will do it.
            RegisterMetadataDelayedWorker delayedWorker = new RegisterMetadataDelayedWorker();
            delayedWorker.RegisterMetadataDelayed("System.Workflow.Runtime", InteropDesigner.RegisterMetadata);
            delayedWorker.RegisterMetadataDelayed("System.ServiceModel", RegisterMetadataForMessagingActivitiesSearchMetadata);
            delayedWorker.RegisterMetadataDelayed("System.ServiceModel", RegisterMetadataForMessagingActivitiesPropertyEditors);
            delayedWorker.WorkNowIfApplicable();
        }