Esempio n. 1
0
        /// <summary>
        /// Constructor for token type. (non-string)
        /// </summary>
        /// <param name="resolvedToken">Original token.</param>
        /// <param name="source">Source method from compile tree ("requester").</param>
        internal TokenContext(ref ResolvedToken resolvedToken, MemberInfo source)
        {
            _resolvedToken = resolvedToken;
            Module         = _resolvedToken.Module;
            Source         = source;

            TokenType     = _resolvedToken.Type;
            Context       = _resolvedToken.Context;
            MetadataToken = _resolvedToken.Token;

            switch (TokenType)
            {
            case TokenKind.Method:
                Handle = _resolvedToken.HMethod;
                break;

            case TokenKind.Field:
                Handle = _resolvedToken.HField;
                break;

            case TokenKind.Class:
                Handle = _resolvedToken.HClass;
                break;
            }
        }
Esempio n. 2
0
        private void ResolveToken(IntPtr thisHandle, IntPtr pResolvedToken)
        {
            _tokenTls ??= new TokenTls();
            _tokenTls.EnterCount++;

            if (thisHandle == IntPtr.Zero)
            {
                return;
            }

            try
            {
                if (_tokenTls.EnterCount == 1 && _tokenResolvers != null)
                {
                    IEnumerable <Delegate> resolvers = _tokenResolvers.GetInvocationList();

                    if (!resolvers.Any())
                    {
                        CEEInfo.ResolveToken(thisHandle, pResolvedToken);
                        return;
                    }

                    //Capture method who trying resolve that token.
                    _tokenTls.Source = _tokenTls.GetSource();

                    ResolvedToken resolvedToken = new ResolvedToken(pResolvedToken);
                    TokenContext  context       = new TokenContext(ref resolvedToken, _tokenTls.Source);

                    foreach (TokenResolverHandler resolver in resolvers)
                    {
                        resolver(context);
                    }
                }

                CEEInfo.ResolveToken(thisHandle, pResolvedToken);
            }
            finally
            {
                _tokenTls.EnterCount--;
            }
        }