天天看点

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

 二、类型管理

1、程序集与类型的管理

在Context初始化时便将AppDomain中的类型全部加载并交给TypeManager管理:

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public Context()

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        {

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            ……

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            TypeManager = new TypeManager();

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            Assemblys = new Dictionary<String, Assembly>();

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            Assembly[] al = AppDomain.CurrentDomain.GetAssemblies();

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            foreach (Assembly a in al)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            {

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                AddAssembly(a);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            }

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(CurrentDomain_AssemblyLoad);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

……

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        }

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

private void AddAssembly(Assembly a)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            if (a != null)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Assemblys.Add(a.FullName, a);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Type[] tl = a.GetTypes();

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                foreach (Type t in tl)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                {

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                    if(!t.FullName.StartsWith("<PrivateImplementationDetails>"))

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                        TypeManager.AddType(t);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                }

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            Assembly a = args.LoadedAssembly;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            if (!Assemblys.ContainsKey(a.FullName))

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

开发时发现,程序集中有一批类型名字以"<PrivateImplementationDetails>"开头的类型,貌似时临时类型,这些东西数量较多,干脆把它屏蔽掉了。

2、进出命名空间

在CdClassCmdHandler 中实现,目前不支持级联操作,即:cdc ..;cdc .; cdc namespaceName这样是可以的,cdc ../ns1/ns2 这样是不支持的。输入的命名空间名称可以只是部分,程序自动进行匹配,如只有1个匹配项则自动进入该项,否则不进行操作,同时打印所有匹配项。

3、列出命名空间和类型

在 ListClassCmdHandler 中实现,支持正则表达式匹配。幕后工作由TypeDictionary在做:

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            Context.TypeManager.Now.ListDir(match);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            Context.TypeManager.Now.ListType(match);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public void ListType(String match)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            Regex re = null;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            if (match != null)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                re = new Regex(match);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            foreach (Type t in Types.Values)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                String name = t.Name;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                if (re != null)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                    if (!re.IsMatch(name)) continue;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Console.WriteLine("C:\t" + Context.EnsureAtLeastLength(name,20) + "\t" + t.FullName);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public void ListDir(String match)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            foreach (TypeDictionary dic in SubTypeDictionary.Values)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                String name = dic.Name;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Console.WriteLine("N:\t" + Context.EnsureAtLeastLength(name, 20) + "\t" + dic.FullName);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

4、查看类型

扩展方法确实是好东西,有了它这里实现起来很简单。在 ClassExtensionMethods里 实现:

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

    public static class ClassExtensionMethods

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

{

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

    ……

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void methods(this Type t)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            foreach (MethodInfo mi in t.GetMethods())

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Console.WriteLine("  " + mi);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void methods(this Object obj)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            if (obj == null) return;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            methods(obj.GetType());

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void props(this Type t)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            foreach (PropertyInfo pi in t.GetProperties())

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Console.WriteLine("  " + pi);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void props(this Object obj)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            props(obj.GetType());

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void members(this Type t)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            foreach (MemberInfo mi in t.GetMembers())

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void members(this Object obj)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            members(obj.GetType());

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void creaters(this Type t)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            foreach (ConstructorInfo ci in t.GetConstructors())

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Console.WriteLine("  " + ci);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void creaters(this Object obj)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            creaters(obj.GetType());

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

    }

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

三、执行代码片断

在 CscCmdHandler 中实现。核心方法为 CscCmdHandler.Run(),代码如下:

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

       public override void Run()

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            if (String.IsNullOrEmpty(InputCmdString)) return;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            String fullCmd = String.Empty;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            if (Context.TypeManager.Now != Context.TypeManager.Root)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                fullCmd += "                using " + Context.TypeManager.Now.FullName + ";";

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            fullCmd +=

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

@"                using System;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                using System.IO;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                using System.Text;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                using System.Collections.Generic;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                using Orc.Shell.Core;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                namespace Orc.Shell.Core.Dynamic 

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                { 

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                    public class DynamicClass

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                    {

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                        public Orc.Shell.Core.Context Context;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                        public void Save(String name, Object obj)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                        {

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                            Context.Save(name,obj);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                        }

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                        public Object My(String name)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                            return Context[name];

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                        public void MethodInstance(Context context)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                            Context = context;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                            " + InputCmdString + @";

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                    }

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                }";

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            CompilerResults cr = Context.CodeProvider.CompileAssemblyFromSource(Context.CompilerParameters, fullCmd);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            if (Context.Debug)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Console.WriteLine("Source:");

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Console.WriteLine("--------------------------------");

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Console.WriteLine(fullCmd);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Console.WriteLine("Results");

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            if (cr.Errors.HasErrors)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Console.WriteLine("编译错误:");

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                foreach (CompilerError err in cr.Errors)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                    if (Context.Debug)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                        Console.WriteLine(String.Format("line {0}: {1}", err.Line, err.ErrorText));

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                    else

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                        Console.WriteLine(err.ErrorText);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            else

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Assembly assem = cr.CompiledAssembly;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Object dynamicObject = assem.CreateInstance("Orc.Shell.Core.Dynamic.DynamicClass");

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                Type t = assem.GetType("Orc.Shell.Core.Dynamic.DynamicClass");

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                MethodInfo minfo = t.GetMethod("MethodInstance");

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

                minfo.Invoke(dynamicObject, new Object[] { Context });

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

其中 CodeProvider,CompilerParameters  在 Context 中初始化:

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            CodeProvider = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            CompilerParameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll", "Orc.Shell.Core.dll", "OrcShell.exe" });

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            CompilerParameters.GenerateExecutable = false;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            CompilerParameters.GenerateInMemory = true;

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

可以通过 Save(String name, Object obj) 和 My(String name) 来同环境进行交互。其中,Save(String name, Object obj) 是将代码片断中的对象 obj 保存为环境变量,变量名称为 name。My(String name)取出名称为name 的环境变量,加载到代码段上。my 指令可以查看所有环境变量。

采用$name的方式操作环境变量更简介、直观,但这样一来代码难度加大不少,没想到什么简洁的实现,就没采用。

四、其它

1、扩展方法

对于常用的方法通过扩展方法来方便使用。如,打印一个对象 obj 到控制台上,正常写法是System.Console.WriteLine(obj.ToString()),比较麻烦,通过扩展方法,可以使它简化为:obj.p();相关代码如下:

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

    {

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void Print(this Object obj)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            Console.WriteLine(obj);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void p(this Object obj)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            Print( obj );

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void P(this Object obj)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

            Print(obj);

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

        public static void print(this Object obj)

实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它
实现简单的CSharpShell -- OrcShell (2) 类型浏览、执行代码片断与其它

2、变量缩写(Alias)

指令缩写可明显降低操作量。可通过编辑程序集目录下的 Alias.xml 文件来添加、删除或更改指令缩写。

Alias 指令可以查看目前的指令缩写。

五、缺乏的功能。

到现在为止,OrcShell只实现了Shell的雏型。由于只开发了一个晚上,测试也不是很完善,另外许多重要功能还未涉及,主要包括:

1、手动加载程序集;

2、常用系统管理功能,如常用的Shell 指令;

3、远程控制;

4、指令的自动完成。

留待后续。

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2008/02/29/1085834.html如需转载请自行联系原作者

xiaotie 集异璧实验室(GEBLAB)