zoukankan      html  css  js  c++  java
  • 用c#编写一个vb 工程源码分析工具(带源码工程下载)

        最近加入一个公司,试用期间要我学习他们的旧系统,旧系统的代码是Visual Basic 6.0编写的,源码大概有10多万行,要一下子看完可不容易,并且还得出一个源码分析的文档。而最近的项目是新版本的开发,采用.Net的Visual C#开发,所以我边学c#边看代码;一是为了解决文档编写的问题,二是为了学习c#,就编写了一套专门分析vb Project的工具,其原理就是根据vb的工程文件解析所有的“变量、常量、API、过程、函数、事件”还有它们的类型“私有、全局”;由于时间关系,准备实现的“事件调用”分析并没有完成,但最后我的文档还是出来了。其中就有它的功劳。
        软件的原型是参照 Aivosto 公司的"Aivosto Project Analyzer"制作的,它的功能很强大,只是它需要¥¥才能使用全部功能,否则只能导出txt文件,谁能有破解发我一份吧 :)
    代码其实并不复杂,因为vb的语法很简单,都是行模式,虽然支持 & _ 连接符号,但是处理起来只需要替换掉即可。
        以下是核心的算法(也算不上什么算法,只是我的分析模式
    dd
        /******************************************
         * 返回文本内容
         *****************************************
    */

        
    private string loadForm(string fileName)
        
    {
          
    if (fileName != "")
          
    {
            
    try
            
    {
              System.IO.StreamReader sr 
    = new System.IO.StreamReader(fileName,System.Text.Encoding.Default);
              
    return sr.ReadToEnd();
            }

            
    catch
            
    {
              
    return null;
            }

          }

          
    else
          
    {
            
    return null;
          }

        }


        
    分析窗体组件
        
        
    private void button1_Click(object sender, System.EventArgs e)
        
    {      
          callMain(listView1,textBox1.Lines);
        }


        
    private void Form1_Resize(object sender, System.EventArgs e)
        
    {
          
    try
          
    {
            listView1.Height
    = textBox1.Top - listView1.Top;
          }

          
    catch
          
    {
          }

        }


        
    /********************************
         * 通用函数,返回按分隔符、位的单词
         ******************************
    */

        
    private string CharIndex(string sSrc,string SplitChar,int CharIndex)
        
    {
          
    string[] tmpArray = sSrc.Split(SplitChar.ToCharArray());
          
    return tmpArray[CharIndex];
        }

        
    /********************************
         * 通用保存ListView到文件得过程
         ******************************
    */

        
    private void mSaveLvToFile_Click(object sender, System.EventArgs e)
        
    {

          
    if(mSaveLvToFile.GetContextMenu().SourceControl is ListView)
          
    {
            
            saveFileDlg.ShowDialog(
    this);
            
    if(saveFileDlg.FileName!="")
            
    {
              
    string sTextFile = "";
              ListView lv
    =(ListView)mSaveLvToFile.GetContextMenu().SourceControl;
              
    for(int i=0;i<lv.Items.Count;i++)
              
    {
                
    string sLine = "";
                
    for(int j=0;j<lv.Items[i].SubItems.Count;j++)
                
    {
                  
    if(j!=(lv.Items[i].SubItems.Count-1))
                  
    {
                    sLine 
    += lv.Items[i].SubItems[j].Text + ",";
                  }

                  
    else
                  
    {
                    sLine 
    += lv.Items[i].SubItems[j].Text + "\r\n";
                  }

                    
                }

              
                
    if(sTextFile.IndexOf(sLine)==-1)
                
    {
                  sTextFile 
    += sLine;
                }

              }

              
    try
              
    {
                System.IO.StreamWriter sw 
    = new System.IO.StreamWriter(saveFileDlg.FileName,false,System.Text.Encoding.Default);
                sw.Write(sTextFile);
                sw.Close();
                MessageBox.Show(
    "保存文件完成!");
              }

              
    catch
              
    {
                MessageBox.Show(
    "保存文件错误!");
              }

            }

          }

        }


        
    private void btnParseVar_Click(object sender, System.EventArgs e)
        
    {
          callMain2(
                listViewConst,
                listViewType,
                listViewAPI,
                listViewPubvar,
                listViewPrivar,
                textBox2.Lines
            );
        }


        
    分析变量,声明等类型

        
    private void btnParseProc_Click(object sender, System.EventArgs e)
        
    {
        
        }

        
    /**************************************
         * 主循环处理内容3
         ************************************
    */

        
    private void callMain2(
          System.Windows.Forms.ListView lv1,
          
    string[] listFiles)
        
    {
          lv1.Items.Clear();
          lv1.Items.Add(
    "事件过程");
          
    for (int i=0;i<listFiles.Length;i++)
          
    {
            parseProc(lv1,listFiles[i],loadForm(listFiles[i]));
          }

          MessageBox.Show(
    "分析完毕!");
        }

        
    /******************************************
         * 处理变量结果并增加结果到listview
         ****************************************
    */

        
    private void parseProc(
          System.Windows.Forms.ListView lv1,
          
    string fileName,string s)
        
    {
          
    //1.寻找API声明
          
    //2.寻找过程、函数、事件

          
    if(s==null)return;
          s 
    = replace2bank(s);
          
    string[] strLines = s.Split (Environment.NewLine.ToCharArray());  //获取分隔符号

          
    string[] strConstList = parseVarConst(strLines);
          
    //lv.Items.Add("API声明");
          if(strConstList!=null)
          
    {
            
    for(int i=0;i<strConstList.Length;i++)
            
    {
              
    if(strConstList[i].Trim()==""){continue;}
              
    string[] smaillList = strConstList[i].Split("\r".ToCharArray());
              ListViewItem lvi 
    = new ListViewItem(smaillList,-1);
              
    if(fileName.LastIndexOf("\\")!=-1)
                lvi.SubItems.Add(fileName.Substring(fileName.LastIndexOf(
    "\\")+1));
              
    else lvi.SubItems.Add(fileName);
              lv1.Items.Add(lvi);
            }

          }


        }


        也许你看到这大段的代码,感觉乱七八糟的,那确实;我只是为了满足自己的需要,并且没有封装整理,全在一个Form.cs中,呵呵,所以我带了源码工程;可以下载编译试试看。
    也许你用的着。

    下载点这里

    这个是图例


  • 相关阅读:
    Vant 中 底部弹窗(picker)选择数据
    捷克 Jetbranis布拉格 利迪策
    解决github默认忽略文件名字大小写问题
    钉钉独立聊天窗口功能
    查看 Github 上项目创建时间,更新时间
    CSS 上下布局
    Git 和 HTTPS
    {"error":"invalid_scope"}的问题解决记录
    uni-app 里使用colorui时复选框无法选中的问题解决
    win7 安装 sp1记录
  • 原文地址:https://www.cnblogs.com/Chinasf/p/139653.html
Copyright © 2011-2022 走看看