Пример #1
0
        private static void ctx_TokenResolveEvent(object sender, TokenResolveArgs e)
        {
            var module = e.Module;
            var token  = e.Token;

            switch (e.ResolveKind)
            {
            case TokenResolveArgs.ResolveKinds.String:
                e.ResolvedString = module.ResolveString(token);
                break;

            case TokenResolveArgs.ResolveKinds.Signature:
                e.ResolvedSignature = module.ResolveSignature(token);
                break;

            case TokenResolveArgs.ResolveKinds.Member:
                e.ResolvedMember = module.ResolveMember(token, e.TypeGenericArguments, e.MethodGenericArguments);
                break;
            }
        }
Пример #2
0
        private static Func <Int32, ILResolveKind, Object> TokenResolverFromArgs(CILReflectionContextImpl ctx, MethodBodyLoadArgs args)
        {
            var module = new Lazy <System.Reflection.Module>(() => ctx.LaunchTypeModuleLoadEvent(new TypeModuleEventArgs(args.Method.DeclaringType)), System.Threading.LazyThreadSafetyMode.ExecutionAndPublication);

            var dType = args.Method.DeclaringType;
            var gArgs = dType
#if WINDOWS_PHONE_APP
                        .GetTypeInfo()
#endif
                        .IsGenericType ? dType.GetGenericTypeDefinition().GetGenericArguments() : null;
            var mgArgs = args.Method is System.Reflection.MethodInfo && args.Method.GetGenericArguments().Any() ? ((System.Reflection.MethodInfo)args.Method).GetGenericMethodDefinition().GetGenericArguments() : null;

            return((token, rKind) =>
            {
                var tArgs = new TokenResolveArgs(module.Value, token, rKind == ILResolveKind.String ? TokenResolveArgs.ResolveKinds.String : (rKind == ILResolveKind.Signature ? TokenResolveArgs.ResolveKinds.Signature : TokenResolveArgs.ResolveKinds.Member), gArgs, mgArgs);
                ctx.LaunchTokenResolveEvent(tArgs);
                switch (rKind)
                {
                case ILResolveKind.String:
                    return tArgs.ResolvedString;

                case ILResolveKind.Signature:
                    // TODO basically same thing as in ModuleReadingContext, except use this method to resolve tokens.
                    // Maybe could make static methods to ModuleReadingContext (ReadFieldSignature, ReadMethodSignature, ReadType) that would use callbacks to resolve tokens.
                    throw new NotImplementedException("Implement creating method signature + var args from byte array (at this point).");

                default:
                    return tArgs.ResolvedMember is Type?
                    ctx.Cache.GetOrAdd((Type)tArgs.ResolvedMember) :
                        (tArgs.ResolvedMember is System.Reflection.FieldInfo ?
                         ctx.Cache.GetOrAdd((System.Reflection.FieldInfo)tArgs.ResolvedMember) :
                         (tArgs.ResolvedMember is System.Reflection.MethodInfo ?
                          (Object)ctx.Cache.GetOrAdd((System.Reflection.MethodInfo)tArgs.ResolvedMember) :
                          ctx.Cache.GetOrAdd((System.Reflection.ConstructorInfo)tArgs.ResolvedMember)
                         )
                        );
                }
            });
        }