/// <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; } }
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--; } }