Изменилось ли поведение операторов goto и их область и когда? - PullRequest
0 голосов
/ 21 сентября 2019

Я декомпилировал очень старое приложение с помощью 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Я знаю, что это ужасный код, но это не мое, и мне нужно всего лишь закомментировать несколько строк, чтобы он работал так, как мне нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...