我看到别人的一个工程,.Net的主程序,在程序中,可以load不同的.vb(或.cs)文本,然后主程序就表现出不同的特性(以背景颜色改变为例,假设主程序为一个窗口,带有一个'loadbutton'用以调用不同的.cs文本,调用red.cs文件时,主窗口的背景颜色会被显示为红色,调用green.cs文本时候,主窗口背景会被显示为绿色)
当然,.cs文件需要有一些规则,比如必须具备一些公共变量,必须具有某种签名的方法(如:public void ScriptMain()方法,所有的.cs文件都需要具有),主程序load文件之后,执行也是依照一定的顺序,比如前面提到的,所有的.cs文件在被加载之后都由ScriptMain()方法开始执行。请问这样的要求应该如何实现呢(这里并不是讨论可能性,因为我已经看到别人现成的程序已经可以实现,功能比较强大,想了解下原理)? 请大家指教,谢谢(另外改变背景颜色只是一个举例,当然可以实现需要的其它功能(其实也就是执行方法))。

解决方案 »

  1.   

    改变颜色只是一个例子,我是想实现所需的任何功能,比如,script里边可能是这样的:
    // codes of the red.cs file:
    public void Main()
    {
        // calculation
        Calculation();
        // display
        Display();
        // reports
        ShowReports();
    }
    private void Calculation()
    {
        // lots of operations, even the communication with hardware...
    }
    private void Display()
    {
        // specifical displays...
    }但是另一个文件可能具备截然不同的功能:
    // codes of the green.cs file:
    public void Main()
    {
        // calculation
        Calculation();
        // display
        Display();
        // reports
        ShowReports();
        // save the datas to DB
        SaveDatas();
        }
    private void Calculation()
    {
        // other lots of operations, even the communication with hardware...
    }
    private void Display()
    {
        // other specifical displays...
    }
    private bool SaveDatas()
    {
        // save datas and so on...
        // return result
    }
    类似上边这样,当然实际应用的时候,框架所实现的功能肯定是特定的,比如只是用来逐行显示信息,并带有和硬件不同的通信等,但是我想知道的是框架是如何实现对.cs文件的load,并可以直接执行.cs中的方法的(并不是对dll文件的使用,那直接反射就可以了)。
    这种功能在特定框架的强大之处在于,基本功能已经被框架实现了(比如说前面说的逐行显示功能),但是具体执行的方法是由.cs文件决定的,同样以逐行显示为例吧(加入我的框架就是用来逐行显示的),我可以在A.cs中,逐行显示某一个特定DB中的table的数据,而另一个B.cs中,可能是每一行的数据需要user先输入,然后我进行一个处理,再显示,最后再保存到DB中。
    A.cs与B.cs的最终目的都是为框架提供逐行显示,但是具体实现方式不同(如前所示)
    这样做有很多现实意义:
    1.我们可以随意的(当然是在特定目的内)编辑自己需要的.cs文件(当然是要遵循一定的格式要求,比如前面说过的,要包含 void ScriptMain()这样签名的方法)。
    2. 在更改.cs文件之后之需要用主框架程序load这个.cs文件,变化就体现出来了,但是总体的表现方式不变(逐行显示),便于二次开发使用。
    3. 甚至之后可以加入调试功能,方便调试,并且省去每个user的电脑上都安装vs(涉及到费用和权限等等诸多问题)。
    好多好多。
    因此我想问问大家又无什么思路,看看到底是怎么实现的,我这边已经见到这样的软件了,只是不知道到底是怎么开发的(而且开发好像难度不应该非常非常大,因为开发者并不不是专业的软件工程师...)
    非常感谢大家指点。
      

  2.   

    sorry, 上面的例子里边,red.cs应该有个ShowReports()方法的具体实现;green.cs应该有ShowReports何SaveDatas方法的具体实现,我忘记写了,只是个示意,请大家帮忙看看。
      

  3.   

    哦,你的意思是,主框架动态编译.cs文件(其中涉及到对主框架的dll的引用)为.dll之后再自己引用么?
      

  4.   

    CodeDom[1]在Microsoft .NET Framework 的中文全名是“代码文档对象模型”, 使用该模型建立的代码文档可以被.NET Framework编译成应用程序集。也就是说,你可以使用该模型“发明”一个自己的.net语言,用你的语言编写程序,再翻译成codeDom,最后编译成可以执行的.net应用程序。实际上,codedom是其他语言编译成.net 应用程序的接口,比如Delphi.net   {CodeDOM的中文全名就是“代码文档对象模型”。   要知道模型这个东西其实是很虚的,它基本是不干实事。它那里面那么多的类,从最基本的Expression与Statement开始,一点点的堆起来,最后得到一个表示Namespace或CompileUnit类,归根结底在System.CodeDom这个命名空间里你new来new去只能是得到一些Object而已,而Object是什么呢,就是内存里的一点点数据,我们根本看不见摸不着(否则也用不着去O/R Mapping了),只有通过System.CodeDom.Compiler这个命名空间里的东西才能把它表现出来。前一个命名空间在于构造,后一个命名空间在于表现。构造就是搭个架子,把里面的各个部分聚合聚合,连接连接,这个一点点奥秘都没有,所有也不去深究了。}
    百度来的,好像不是这么回事哦,而且评价不咋地哦