• 为MMC编写服务器控制管理单元。插件方式 (MMC3.0 ,反射, installutil ,c#,KB907265,Enterprise Library)


       经常性做服务端开发的,如果在服务器端 有一个很好用户管理界面,那将是非常完美的事情,服务端的管理界面,不求华丽,但求实用,而MMC控制管理台将是很专业的选择。

    SMCCAddIn 工程 是一个主工程,是MMC的插件,也是AssemblyAddIn 的容器。在bin/debug 下有个AddIns 目录,是存放插件dll的。 AssemblyAddIn 是一个插件实例工程。

    本源代码 在我去掉一些敏感词语前是编译通过的(编译我也试过了,可以通过),可以运行(修改后没有运行)。 MMC 是windows系统带的管理单元控制台,比如我们常用的IIS6.0的管理界面就是基于MMC的一个管理单元。这个控制台在3.0 之后的版本支持用.net代码写的插件,以前只能用c++写。在win2003R2之后的版本已经是 MMC3.0 了,在这之前的版本需要打补丁KB907265(比如WindowsXP-KB907265-x86-CHS-mmc3.0),有关MMC的知识请google一下吧,把自己开发好的dll注册到MMC里面,要运行: installutil mydll.dll,卸载用: installutil /u mydll.dll。

    本源代码原来是用在一个项目中,这些源代码 还是在摸索阶段写的。所以有些粗糙。学习了Enterprise Library 的一些设计思想,但又没有完全用好。作为插件方式的那个主体工程还有很多不够完美的地方。请大家见谅,现在天气热了,人懒了,不想再去改进了,就这样发上来共享一下吧。
    主要的还是贴源代码,这个符合大家的心意。

    代码会陆续贴出来:

     1using System;
     2using System.Collections.Generic;
     3using System.Text;
     4using SMCC.Attributes;
     5using SMCC;
     6using Microsoft.ManagementConsole;
     7using System.Windows.Forms;
     8
     9namespace AssemblyAddIn
    10{
    11    [ActionDefinition(typeof(MyNode))]
    12    public class MyActions :AbstractAction
    13    {
    14        [ActionMethod("Show Refesh""Show Refesh desp"-1"aab"false)]
    15        public void ShowRefesh(ActionBase action, Status status)
    16        {
    17           Helper.MessageBox("hello,Fire Action On ShowRefesh""Hello", MessageBoxButtons.OK);
    18        }

    19
    20        [ActionMethod("Show Common Diag""Show Diag desp"-1"daaab"false)]
    21        public void ShowMyDiag(ActionBase action, Status status)
    22        {
    23            MyModeDiag f = new MyModeDiag();
    24            
    25            f.ShowDialog();
    26        }

    27
    28        [ActionMethod("Show Helper Diag""Show Diag desp"-1"daaab"false)]
    29        public void ShowHelperModeDiag(ActionBase action, Status status)
    30        {
    31            MyModeDiag f = new MyModeDiag();
    32
    33            Helper.ShowDialog(f);
    34        }

    35
    36        //
    37        [ActionMethod("My属性""My属性描述"-1"sdfee"false)]
    38        public override void ShowPropertySheet(ActionBase action, Status status)
    39        {
    40            //必须调用基类的方法。
    41            base.ShowPropertySheet(action, status);
    42        }

    43
    44        [ActionMethod("Delete""Delete desp"-1"addee56"false)]
    45        public void DeleteNode(ActionBase action, Status status)
    46        {
    47            if (DialogResult.OK == Helper.MessageBox("你确定要删除该节点?""再次确认", MessageBoxButtons.OKCancel))
    48            {
    49                
    50                
    51            }

    52        }

    53
    54       
    55
    56    }

    57}

    58




    using System;
    using System.Collections.Generic;
    using System.Reflection;
    using System.Text;
    using SMCC.Attributes;


    namespace SMCC
    {
        
    /// <summary>
        
    /// Binds together source events and listener handler methods through reflection.
        
    /// </summary>

        public class EventMethodBinder
        
    {
            
    /// <summary>
            
    /// Binds together source events and listener handler methods through reflection.
            
    /// </summary>
            
    /// <param name="eventSource">Object containing events attributed with <see cref="InstrumentationProviderAttribute"></see>.</param>
            
    /// <param name="eventListener">Object containing handler methods attribute with <see cref="InstrumentationConsumerAttribute"></see>.</param>

            public void Bind(object eventSource, object eventListener)
            
    {
                EventBinder binder 
    = new EventBinder(eventSource, eventListener);

                Dictionary
    <string, List<EventInfo>> eventMap = GetAddInEvents(eventSource);
                Dictionary
    <string, List<MethodInfo>> listenerMap = GetAddInListeners(eventListener);

                
    foreach (string topic in eventMap.Keys)
                
    {
                    
    if (listenerMap.ContainsKey(topic) == falsecontinue;

                    List
    <EventInfo> sourceEvents = eventMap[topic];
                    List
    <MethodInfo> targetMethods = listenerMap[topic];

                    
    foreach (EventInfo sourceEvent in sourceEvents)
                    
    {
                        
    foreach (MethodInfo targetMethod in targetMethods)
                        
    {
                            binder.Bind(sourceEvent, targetMethod);
                        }

                    }

                }

            }


            
    delegate T[] MemberFinder<T>(Type t);

            EventInfo[] GetEventInfo(Type t) 
    return t.GetEvents(); }
            Dictionary
    <string, List<EventInfo>> GetAddInEvents(object eventSource)
            
    {
                
    return GetAttributedMembers<EventInfo,
                    EventProviderAttribute
    >(eventSource, delegate(Type t) return GetEventInfo(t); });
            }


            MethodInfo[] GetMethodInfo(Type t) 
    return t.GetMethods(); }
            Dictionary
    <string, List<MethodInfo>> GetAddInListeners(object eventListener)
            
    {
                
    return GetAttributedMembers<MethodInfo,
                    EventConsumerAttribute
    >(eventListener, delegate(Type t) return GetMethodInfo(t); });
            }


            Dictionary
    <string, List<TMemberInfoType>>
        GetAttributedMembers
    <TMemberInfoType, TAttributeType>(object target, MemberFinder<TMemberInfoType> memberFinder)
                
    where TMemberInfoType : MemberInfo
                
    where TAttributeType : BaseEventAttribute
            
    {
                Dictionary
    <string, List<TMemberInfoType>> memberInfoList =
                    
    new Dictionary<string, List<TMemberInfoType>>();

                Type type 
    = target.GetType();
                MemberInfo[] memberInfos 
    = memberFinder(type);

                
    foreach (MemberInfo memberInfo in memberInfos)
                
    {
                    
    object[] attributes = memberInfo.GetCustomAttributes(typeof(TAttributeType), false);
                    
    foreach (BaseEventAttribute attribute in attributes)
                    
    {
                        
    if (memberInfoList.ContainsKey(attribute.SubjectName) == false)
                        
    {
                            memberInfoList.Add(attribute.SubjectName, 
    new List<TMemberInfoType>());
                        }


                        List
    <TMemberInfoType> list = memberInfoList[attribute.SubjectName];
                        list.Add((TMemberInfoType)memberInfo);
                    }

                }


                
    return memberInfoList;
            }

        }

    }

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace SMCC.Attributes
    {
        [AttributeUsage(AttributeTargets.Class, Inherited 
    = false, AllowMultiple = false)]
        
    public class ActionDefinitionAttribute : Attribute
        
    {
            
    protected Type nodeType;


            
    public Type NodeType get return nodeType; } set { nodeType = value; } }



            
    public ActionDefinitionAttribute( Type nodeType)
            
    {
                
    this.nodeType = nodeType;
            }





        }

    }



    using System;
    using System.Collections.Generic;
    using SMCC.Attributes;
    using System.Reflection;
    using Microsoft.ManagementConsole;

    namespace SMCC
    {


        
    public class ActionBuilderStrategy : BuilderStrategy 
        
    {


            
    public ActionBuilderStrategy(IBuilderStrategy next) : base(typeof(AbstractAction), next) { }

            
    public override object BuildUp(BuildContext context)
            
    {
                Type toBuildtype
    =context.Type;
                Type nodeType;

                AbstractAction toBuildEntity;
                List
    <ActionItem> actionItems=new List<ActionItem>();
                ScopeNodeEntity entity;

                
    if (baseType.IsAssignableFrom(toBuildtype))
                
    {
                    
    object[] attributes = toBuildtype.GetCustomAttributes(typeof(ActionDefinitionAttribute), false);
                    
    if (attributes.Length > 0)
                    
    {


                        
    foreach (Attribute attribute in attributes)
                        
    {


                            
    //CustomViewControl
                            toBuildEntity = (AbstractAction)Activator.CreateInstance(toBuildtype);


                            ActionDefinitionAttribute definitionAttribute 
    = (ActionDefinitionAttribute)attribute;
                            nodeType 
    = definitionAttribute.NodeType;

                            

                            
    //-------------------------------
                            
                            
                            MethodInfo[] methodInfos 
    = toBuildtype.GetMethods();
                            
    foreach (MethodInfo methodInfo in methodInfos)
                            
    {
                                
    object[] methodAttributes = methodInfo.GetCustomAttributes(typeof(ActionMethodAttribute), false);
                                
    if (methodAttributes.Length == 1)
                                
    {
                                    ActionMethodAttribute methodAttribute 
    = (ActionMethodAttribute)methodAttributes[0];
                                    

                                    actionItems.Add(
                                                    
    new ActionItem(methodAttribute.DisplayName,
                                                                    methodAttribute.Description,
                                                                    methodAttribute.ImageIndex,
                                                                    methodAttribute.Tag,
                                                                    methodAttribute.IsSync,
                                                                    methodInfo,
                                                                    toBuildEntity
                                                   )
                                        );

                                    
    //-----------
                                    

                                      
                                }



                            }


                            
    //-------------------------------


                            
                            
    //------ICustomInitialization--实现自定义的初始化内容
                            if (toBuildEntity is ICustomInitialization)
                            
    {
                                (toBuildEntity 
    as ICustomInitialization).CustomInitialize();
                            }

                            
                            
    //---------------

                            
    if (actionItems.Count > 0)//if count is less than 0,no need to set the entity.
                            {

                                entity 
    = context.GetEntity(nodeType);

                                
    //toBuildEntity.Node = entity.Node; //这里要传入node 信息,给 AbstractAction中的node.ShowPropertySheet("属性")使用。

                                
    //foreach (ActionItem item in actionItems)
                                
    //{

                                
    //    if (item.IsSync)
                                
    //    {
                                
    //        entity.Node.ActionsPaneItems.Add(new SyncAction(item.DisplayName,
                                
    //                                                item.Description,
                                
    //                                                item.ImageIndex,
                                
    //                                                item.Tag));
                                
    //    }
                                
    //    else
                                
    //    {
                                
    //        entity.Node.ActionsPaneItems.Add(new Action(item.DisplayName,
                                
    //                                                item.Description,
                                
    //                                                item.ImageIndex,
                                
    //                                                item.Tag));
                                
    //    }
                                
    //}

                                entity.ActionItemList.AddRange(actionItems);
                                entity.NodeType 
    = nodeType;


                                
    //ActionEventProvider actionEventProvider = (ActionEventProvider)entity.Node.GetEventProvider();

                                
    //actionEventProvider.Binder(new PairKey<AbstractAction, List<ActionItem>>(toBuildEntity, actionItems));


                                
    //SetEntity(ref entitys, entity, nodeType);
                                
    //---------------
                            }



                        }

                    }

                    
    else
                    
    {
                        Helper.PrintMessage(
    "RootNodeBuilderStrategy can't build without RootNodeDefinitionAttribute");
                    }

                   


                    
                }


                
                
    return base.BuildUp(context);
            }



        }

    }

    源代码地址http://download.csdn.net/source/529003 

     


  • 相关阅读:
    uvalive 3644 X-Plosives
    uva 11997 K Smallest Sums
    Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins
    Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) C. Classroom Watch
    Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) B. Divisiblity of Differences
    Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) A. Trip For Meal
    1004. 成绩排名 (20)
    1003. 我要通过!(20)
    1002. 写出这个数 (20)
    1001. 害死人不偿命的(3n+1)猜想 (15)
  • 原文地址:https://www.cnblogs.com/softfair/p/1237513.html
Copyright © 2020-2023  润新知