#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. Похоже на то. И вы не должны расстраиваться по этому поводу, это нелегко понять / требует крутой кривой обучения.