CallSite <>p__site при декомпиляции большой базы кода

У меня есть большая база кода от клиента, чей разработчик отказался предоставить код.

Я декомпилировал большую часть этого, хотя у меня проблемы со следующим

Я использую dnSpy, Just Decompile, dotPeek для декомпиляции кода. Я пытался погуглить и просмотрел Stackoverflow, но не смог найти ничего, что могло бы мне ответить. Я был бы очень признателен, если кто-то может указать мне в правильном направлении.

Обновлять: Я вставил полную функцию

public virtual string ParseDealerInventoryLink(string toParseLinkData)
        {
            string pattern = "{([^}]+)}";
            string text = toParseLinkData;
            RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled;
            if (this != null && !string.IsNullOrWhiteSpace(text))
            {
                object dyn = new PropertyBag(this);
                Regex regex = new Regex(pattern, options);
                Dictionary<string, DealerInventoryLinkPatternParam> linkPatternMap = DealerInventoryFeedUrlParser.GetLinkPatternParamValueMap();
                text = regex.Replace(text, delegate(Match mat)
                {
                    if (mat.Success && mat.Groups.Count > 0)
                    {
                        Group group = mat.Groups[mat.Groups.Count - 1];
                        if (group.Success)
                        {
                            string value = group.Value;
                            if (linkPatternMap.ContainsKey(value))
                            {
                                if (DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site1 == null)
                                {
                                    DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite, object, string>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.Convert(CSharpBinderFlags.None, typeof(string), typeof(DealerInventoryFeedUrlParser)));
                                }
                                Func<CallSite, object, string> target = DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site1.Target;
                                CallSite <>p__Site = DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site1;
                                if (DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site2 == null)
                                {
                                    DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site2 = CallSite<Func<CallSite, Type, object, object>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.InvokeMember(CSharpBinderFlags.None, "ToString", null, typeof(DealerInventoryFeedUrlParser), new CSharpArgumentInfo[]
                                    {
                                        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType | CSharpArgumentInfoFlags.IsStaticType, null),
                                        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
                                    }));
                                }
                                Func<CallSite, Type, object, object> target2 = DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site2.Target;
                                CallSite <>p__Site2 = DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site2;
                                Type typeFromHandle = typeof(Convert);
                                if (DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site3 == null)
                                {
                                    DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site3 = CallSite<Func<CallSite, object, string, object>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.GetIndex(CSharpBinderFlags.None, typeof(DealerInventoryFeedUrlParser), new CSharpArgumentInfo[]
                                    {
                                        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
                                        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null)
                                    }));
                                }
                                return target(<>p__Site, target2(<>p__Site2, typeFromHandle, DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site3.Target(DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site3, dyn, linkPatternMap[value].ColumnName)));
                            }
                        }
                    }
                    return mat.Value;
                });
            }
            return text;
        }
dynamic ParseDealerInventoryLink(string input) { return null; } string link = ParseDealerInventoryLink(""); генерирует аналогичный код. Покажите нам, что происходит с вызовом цели <>p__Site1 позже в вашем коде.
Kirill Shlenskiy 30.05.2019 14:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
1 472
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
class DealerInventoryFeedUrlParser
{
    void ParseDealerInventoryLink()
    {
        dynamic input = new object();
        string link = input;
    }
}

генерирует следующее при компиляции и последующей декомпиляции в ILSpy:

class DealerInventoryFeedUrlParser
{
    private void ParseDealerInventoryLink()
    {
        object input = new object();
        if (<>o__0.<>p__0 == null)
        {
            <>o__0.<>p__0 = CallSite<Func<CallSite, object, string>>.Create(Binder.Convert(CSharpBinderFlags.None, typeof(string), typeof(DealerInventoryFeedUrlParser)));
        }
        string link = <>o__0.<>p__0.Target(<>o__0.<>p__0, input);
    }
  }

... который я бы классифицировал как «достаточно близкий».

Нет особой причины, по которой я выбрал new object() в качестве значения, присвоенного dynamic. Это могло быть целое число, строка — что угодно. Код инициализации CallSite будет выглядеть так же. T2 в CallSite<Func<T1, T2, TResult>> является объектом всегда, поэтому вы не узнаете, каково ваше реальное входное значение, если вы не посмотрите на место в вашем декомпилированном исходном коде, где DealerInventoryFeedUrlParser.<ParseDealerInventoryLink>o__SiteContainer0.<>p__Site1 фактически используется.

РЕДАКТИРОВАТЬ

Теперь, когда полный исходный код опубликован, давайте попробуем собрать его воедино:

class DealerInventoryFeedUrlParser
{
    static Dictionary<string, DealerInventoryLinkPatternParam> GetLinkPatternParamValueMap() => throw new NotImplementedException();

    public virtual string ParseDealerInventoryLink(string toParseLinkData)
    {
        string pattern = "{([^}]+)}";
        string text = toParseLinkData;
        RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled;
        if (/*this != null &&*/ !string.IsNullOrWhiteSpace(text))
        {
            dynamic dyn = new PropertyBag(this);
            Regex regex = new Regex(pattern, options);
            Dictionary<string, DealerInventoryLinkPatternParam> linkPatternMap = GetLinkPatternParamValueMap();
            text = regex.Replace(text, delegate (Match mat)
            {
                if (mat.Success && mat.Groups.Count > 0)
                {
                    Group group = mat.Groups[mat.Groups.Count - 1];
                    if (group.Success)
                    {
                        string value = group.Value;
                        if (linkPatternMap.ContainsKey(value))
                        {
                            return Convert.ToString(dyn[linkPatternMap[value].ColumnName]);
                        }
                    }
                }
                return mat.Value;
            });
        }
        return text;
    }
}

class PropertyBag
{
    private readonly object Owner;

    public PropertyBag(object obj)
    {
        Owner = obj;
    }
}

class DealerInventoryLinkPatternParam
{
    public string ColumnName { get; set; }
}

ParseDealerInventoryLink скомпилировано/декомпилировано:

public virtual string ParseDealerInventoryLink(string toParseLinkData)
{
    string pattern = "{([^}]+)}";
    string text = toParseLinkData;
    RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled;
    if (!string.IsNullOrWhiteSpace(text))
    {
        dynamic dyn = new PropertyBag(this);
        Regex regex = new Regex(pattern, options);
        Dictionary<string, DealerInventoryLinkPatternParam> linkPatternMap = DealerInventoryFeedUrlParser.GetLinkPatternParamValueMap();
        text = regex.Replace(text, delegate(Match mat)
        {
            if (mat.Success && mat.Groups.Count > 0)
            {
                Group group = mat.Groups[mat.Groups.Count - 1];
                if (group.Success)
                {
                    string value = group.Value;
                    if (linkPatternMap.ContainsKey(value))
                    {
                        if (<>o__1.<>p__2 == null)
                        {
                            <>o__1.<>p__2 = CallSite<Func<CallSite, object, string>>.Create(Binder.Convert(CSharpBinderFlags.None, typeof(string), typeof(DealerInventoryFeedUrlParser)));
                        }
                        Func<CallSite, object, string> target = <>o__1.<>p__2.Target;
                        CallSite<Func<CallSite, object, string>> <>p__ = <>o__1.<>p__2;
                        if (<>o__1.<>p__1 == null)
                        {
                            <>o__1.<>p__1 = CallSite<Func<CallSite, Type, object, object>>.Create(Binder.InvokeMember(CSharpBinderFlags.None, "ToString", null, typeof(DealerInventoryFeedUrlParser), new CSharpArgumentInfo[2]
                            {
                                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType | CSharpArgumentInfoFlags.IsStaticType, null),
                                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
                            }));
                        }
                        Func<CallSite, Type, object, object> target2 = <>o__1.<>p__1.Target;
                        CallSite<Func<CallSite, Type, object, object>> <>p__2 = <>o__1.<>p__1;
                        Type typeFromHandle = typeof(Convert);
                        if (<>o__1.<>p__0 == null)
                        {
                            <>o__1.<>p__0 = CallSite<Func<CallSite, object, string, object>>.Create(Binder.GetIndex(CSharpBinderFlags.None, typeof(DealerInventoryFeedUrlParser), new CSharpArgumentInfo[2]
                            {
                                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
                                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null)
                            }));
                        }
                        return target(<>p__, target2(<>p__2, typeFromHandle, <>o__1.<>p__0.Target(<>o__1.<>p__0, dyn, linkPatternMap[value].ColumnName)));
                    }
                }
            }
            return mat.Value;
        });
    }
    return text;
}

Вы можете заменить сгенерированные компилятором имена, чтобы проверить, все ли я правильно понял. То, что я сделал, — это честная, но очень, очень быстрая попытка угадать, на что я смотрю, основываясь на моем ограниченном понимании dynamic. Теперь ваша задача все проверить, убедиться в правильности и при необходимости исправить.

P.S. Чек this != null немного сбил меня с толку. Должно быть причуда декомпилятора. Я прокомментировал это, так как это не кажется существенным.

П.П.С. Декомпиляция и перекомпиляция двоичных файлов — довольно грязный и подверженный ошибкам процесс. Если изменения, которые вам нужно внести, небольшие, рассмотрите возможность исправления двоичных файлов .NET (погуглите), то есть с помощью ILSpy + Reflexil.

Удачи.

Спасибо Кирилл, это на самом деле большая помощь. Я также вставил всю функцию на случай, если вы сможете помочь мне в этом.

user1527106 30.05.2019 15:43

Большое спасибо за помощь, теперь я гораздо лучше понимаю, как это сделать.

user1527106 30.05.2019 17:25

Другие вопросы по теме