在VB.NET中查找未使用的ByRef参数

时间:2013-12-18 14:29:24

标签: vb.net reflection

我最近将一个项目从VB6转换为VB.NET。作为转换过程的一部分,大多数功能的参数都标记为ByRef。例如,我有这个功能:

Function HexToDec(ByRef HexValue As String) As Short
    HexToDec = Val("&H" & HexValue)
End Function

即使参数HexValue标记为ByRef,它也不会在函数中分配。删除ByRef关键字不会改变该功能的工作方式。

我项目中的大多数功能都是这样的,但是有些功能会使用ByRef功能。

有没有什么好方法可以找到不需要ByRef的所有功能?特别是,我想知道是否有一种方法使用反射来确定是否从未将某些字段分配给。

1 个答案:

答案 0 :(得分:0)

看起来没有简单的方法来做到这一点。但是,我的项目非常大,所以我不想手动完成。我写了一个小工具来帮助 - 也许这对某人有用。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Test
{
    class Program
    {
        static List<string> inUse = new List<string>();

        static void Main(string[] args)
        {
            var loc = @"C:\Users\Owner\Dev\VB6_Conversion";

            var files = DirSearch(loc).ToList();

            int i = 0;
            int tot = files.Count;
            foreach (var file in files)
            {
                Console.WriteLine(i++ + "/" + tot);

                if (file.EndsWith(".vb"))
                {

                    var fileData = File.ReadAllText(file);
                    ParseFile(fileData,file);
                }
            }

            var outFile = Path.Combine(Directory.GetCurrentDirectory(), "out.text");


            using (var fl = new StreamWriter(outFile))
            {

                Console.WriteLine("\n\n\n");
                foreach (var a in inUse)
                {
                    Console.WriteLine(a);
                    fl.WriteLine(a);
                }
            }

            Console.WriteLine("\n\n\nPress any key...");
            Console.Read();

        }

        static IEnumerable<string> DirSearch(string rootDir) 
        {

            foreach (var file in Directory.EnumerateFiles(rootDir,"*.*",SearchOption.AllDirectories))
            {
                yield return file;
            }
        }


        static void ParseFile(string file, string filename)
        {

            var regex1 = @".*Sub .*\(.*\)(.*\r\n)*?.*End Sub";
            var regex2 = @".*Function .*\(.*\)(.*\r\n)*?.*End Function";

            var rx1 = new Regex(regex1, RegexOptions.Multiline);
            var rx2 = new Regex(regex2,RegexOptions.Multiline);

            var mc1 = rx1.Matches(file);
            var mc2 = rx2.Matches(file);

            for (int i = 0; i < mc1.Count; i++)
                FuncTest(mc1[i].Value,filename,file,mc1[i].Index);
            for (int i = 0; i < mc2.Count; i++)
                FuncTest(mc2[i].Value,filename,file,mc2[i].Index);

        }

        static int findLineNum(string text, int index)
        {
            var s = text.Substring(0, index);

            return s.Count(x => x == '\n');
        }

        static void FuncTest(string text, string filename, string fullFile, int index)
        {
            var firstLine = Regex.Split(text,"\r\n")[0];

            var regex = @"ByRef ([a-zA-Z0-9_]+)";
            var matches = Regex.Matches(firstLine, regex);

            var variables = new List<string>();

            for (int i = 0; i < matches.Count; i++)
            {
                variables.Add(matches[i].Groups[1].Value);
            }

            foreach (var variable in variables)
            {
                if (!variableInUse(text, variable))
                    continue;

                var line = findLineNum(fullFile, index);
                var fln = filename.PadRight(120);
                var vln = variable.PadRight(40);

                var ot = "Variable in use: {0}, file: {1}, line: {2}";
                inUse.Add(String.Format(ot, vln, fln,line));
            }

        }

        static bool variableInUse(string text, string variable)
        {
            var regex = String.Format(@"^\t*{0} ?=", variable);

            foreach (var line in Regex.Split(text, "\r\n"))
            {
                if (Regex.IsMatch(line, regex))
                    return true;
            }
            return false;
        }

    }
}