Я декомпилировал очень старое приложение с помощью Telerik's JustDecompile.Мне нужно сделать небольшое изменение и пересобрать код.Но он не встраивается во многих местах из-за операторов goto
, где соответствующая метка находится вне области видимости.
Я могу переписать логический поток для использования операторов flags / continue, но это будет много работы,Я хотел бы знать, изменилось ли это поведение в какой-то момент?Я использую сообщество Visual Studio 2019 - интересно, могу ли я использовать более старую версию C # и / или версию .NET, где этот код будет компилироваться как есть?
Вот пример одного из множества методов, которые ударилиошибки компиляции из-за метки вне области видимости.Ближе к концу там, в goto label1;
, отображается ошибка, что в области видимости нет label1.
public static Dictionary<Guid, UpdateFuncs.UpdateEntry> GetUpdateList()
{
Dictionary<Guid, UpdateFuncs.UpdateEntry> guids;
List<string> mirrors = UpdateFuncs.GetMirrors();
Dictionary<Guid, UpdateFuncs.UpdateEntry> guids1 = new Dictionary<Guid, UpdateFuncs.UpdateEntry>();
while (true)
{
Label1:
UpdateFuncs.DoLog(string.Concat("Fetching updatelist, mirror ", mirrors[0]));
try
{
StreamReader file = UpdateFuncs.GetFile(mirrors[0]);
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(file);
XmlNode documentElement = xmlDocument.DocumentElement;
if (new Version(documentElement.Attributes["Version"].Value) > Assembly.GetExecutingAssembly().GetName().Version)
{
throw new Exception("Your version of this filter is out of date. You must install the latest version to get updates.");
}
foreach (XmlNode childNode in documentElement.ChildNodes)
{
if (!(childNode.Name != "update"))
{
UpdateFuncs.UpdateEntry updateEntry = new UpdateFuncs.UpdateEntry()
{
Name = childNode.Attributes["Name"].Value,
GUID = new Guid(childNode.Attributes["GUID"].Value),
SourceURL = childNode.Attributes["SourceURL"].Value,
Version = new Version(childNode.Attributes["Version"].Value),
Signature = childNode.Attributes["Signature"].Value,
IType = (UpdateFuncs.eItemType)int.Parse(childNode.Attributes["ItemType"].Value)
};
foreach (XmlNode xmlNodes in childNode.ChildNodes)
{
if (xmlNodes.Name == "prereq")
{
UpdateFuncs.Prerequisite prerequisite = new UpdateFuncs.Prerequisite()
{
GUID = new Guid(xmlNodes.Attributes["GUID"].Value),
IType = (UpdateFuncs.eItemType)int.Parse(xmlNodes.Attributes["ItemType"].Value),
Version = new Version(xmlNodes.Attributes["Version"].Value)
};
updateEntry.Prerequisites.Add(prerequisite);
}
}
guids1.Add(updateEntry.GUID, updateEntry);
}
}
}
catch (Exception exception1)
{
Exception exception = exception1;
UpdateFuncs.DoLog(string.Concat("Error: ", exception.Message), Color.Red);
goto Label0;
}
guids = guids1;
break;
}
return guids;
Label0:
mirrors.RemoveAt(0);
if (mirrors.Count != 0)
{
goto Label1;
}
else
{
UpdateFuncs.DoLog("No more mirrors to try.");
guids = new Dictionary<Guid, UpdateFuncs.UpdateEntry>();
return guids;
}
}
Затем существует масса методов, в которых выдается синтаксическая ошибка с метками.Как в этом примере ниже, где строка label0:
ближе к концу выдает ошибки "CS1525 Недопустимый термин выражения"} "и" CS1002; ожидается ".
private void BeginUpdating()
{
this.PluginListbox.Visible = false;
this.cmd1Install.Visible = false;
this.cmd2Okay.Visible = false;
this.lbl2InstDir.Visible = false;
this.lbl2Message.Visible = false;
this.btn2ChangeDir.Visible = false;
Form1.AllocConsole();
UpdateFuncs.LogMessage += new UpdateFuncs.delStringColor(this.UpdateFuncs_LogMessage);
string text = this.lbl2InstDir.Text;
for (int i = 0; i < this.Plugins.Count; i++)
{
UpdateFuncs.UpdateEntry item = this.Plugins[i];
UpdateFuncs.InstalledComponentInfo installedComponentInfo = this.InstalledInfo[i];
if (!installedComponentInfo.Installed)
{
string str = Path.Combine(text, this.GetDirectoryForComponentName(item.Name));
Console.WriteLine();
Console.WriteLine(string.Concat("Selected ", item.Name, " for install to ", str));
try
{
UpdateFuncs.DoUpdate(item, str);
}
catch (Exception exception)
{
Console.WriteLine(string.Concat("Error: ", exception.Message));
goto Label0;
}
}
else if (installedComponentInfo.CurrentVersion.CompareTo(item.Version) < 0)
{
Console.WriteLine();
Console.WriteLine(string.Concat("Selected ", item.Name, " for update."));
try
{
UpdateFuncs.DoUpdate(item, installedComponentInfo.InstallDirectory);
}
catch (Exception exception1)
{
Console.WriteLine(string.Concat("Error: ", exception1.Message));
goto Label0;
}
}
Label0:
}
Console.WriteLine();
Console.WriteLine("Install complete. You may close this program.");
}
Понятно, поскольку это скомпилированный EXE-файл, которыйЯ декомпилировал, этот код работал в какой-то момент (хотя я думаю, что, возможно, это мог быть VB, а не C #? Я не знаю? Я декомпилировал его в C #. Если возможно, я бы хотел, чтобы этот код работал, изменяя настройки проекта. IЯ знаю, что это ужасный код, но это не мое, и мне нужно всего лишь закомментировать несколько строк, чтобы он работал так, как мне нужно.