用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中,呵呵,所以我带了源码工程;可以下载编译试试看。
也许你用的着。

下载点这里

这个是图例


posted @ 2005-04-18 13:35  suifei  阅读(4332)  评论(11编辑  收藏  举报