Как работает / реализован .NET DispatchProxy?

#c# #.net-core #proxy-pattern

#c# #.net-ядро #прокси-шаблон

Вопрос:

Я искал способ реализовать прокси-сервер класса в .NET (Core) и обнаружил, что на самом деле в фреймворке существует реализация под названием DispatchProxy (исходный код). Когда я посмотрел на исходный код, он фактически реализован здесь, в DispatchProxyGenerator.

Мне интересно узнать, как это реализовано. Однако здесь я захожу в тупик, поскольку мои знания ограничены. Я действительно не могу понять, как это работает. Кто-нибудь может меня просветить?

Мое лучшее предположение из кода заключается в том, что он пытается создать во время выполнения элементы типа с использованием System.Reflection и выдает некоторый IL-код, это правильно? Предположим, я хочу создать очень простую реализацию DispatchProxy, могу ли я просто использовать что-то вроде DynamicObject и возвращает вместо этого делегат?

         private void Complete()
        {
            Type[] args = new Type[_fields.Count];
            for (int i = 0; i < args.Length; i  )
            {
                args[i] = _fields[i].FieldType;
            }

            ConstructorBuilder cb = _tb.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, args);
            ILGenerator il = cb.GetILGenerator();

            // chained ctor call
            ConstructorInfo baseCtor = _proxyBaseType.GetTypeInfo().DeclaredConstructors.SingleOrDefault(c => c.IsPublic amp;amp; c.GetParameters().Length == 0);
            Debug.Assert(baseCtor != null);

            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Call, baseCtor);

            // store all the fields
            for (int i = 0; i < args.Length; i  )
            {
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldarg, i   1);
                il.Emit(OpCodes.Stfld, _fields[i]);
            }

            il.Emit(OpCodes.Ret);
        }
  

Комментарии:

1. Итак, ILGenerator можно использовать для создания реализаций методов, но я не уверен, что вы пытаетесь сделать или с какой проблемой сталкиваетесь. Использование этих типов требует знания внутренних компонентов .NET и промежуточного языка (IL), и я не уверен, о какой части всех задействованных методов вы спрашиваете конкретно

2. Спасибо. Да, вот где я застрял. Я мало что знаю о . СЕТЕВЫЕ внутренности. Я думаю, это то, где я не могу углубиться, не познакомившись сначала с IL?

3. Похоже на то. И вы не должны расстраиваться по этому поводу, это нелегко понять / требует крутой кривой обучения.