我最近将一个项目从VB6转换为VB.NET。作为转换过程的一部分,大多数功能的参数都标记为ByRef
。例如,我有这个功能:
Function HexToDec(ByRef HexValue As String) As Short
HexToDec = Val("&H" & HexValue)
End Function
即使参数HexValue
标记为ByRef
,它也不会在函数中分配。删除ByRef
关键字不会改变该功能的工作方式。
我项目中的大多数功能都是这样的,但是有些功能会使用ByRef
功能。
有没有什么好方法可以找到不需要ByRef
的所有功能?特别是,我想知道是否有一种方法使用反射来确定是否从未将某些字段分配给。
答案 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;
}
}
}