/// <summary>
        /// Resolves the given memberID to a monocecil methodDefinition. The out parameter is null if the assembly containing the method is an untracked assembly
        /// and does not need to be tracked. In case it is tracked, the out parameter contains the containing assembly and a new reference has to be added.
        /// </summary>
        public static MethodDefinition ResolveToMethodDefinition(MemberID member, IAssemblyTracker tracker, out AssemblyNameReference containingTrackedAssembly)
        {
            if (member == null)
            {
                containingTrackedAssembly = null;
                return(null);
            }
            if (!_cachedMethods.ContainsKey(member))
            {
                var containingType = ResolveToTypeDefinition(member, tracker, out containingTrackedAssembly);
                if (containingType == null)
                {
                    return(null);
                }

                foreach (var md in containingType.Methods)
                {
                    if (md.MetadataToken.ToInt32() == member.Token)
                    {
                        _cachedMethods[member] = new Tuple <MethodDefinition, AssemblyNameReference>(md, containingTrackedAssembly);
                        return(_cachedMethods[member].Item1);
                    }
                }
                containingTrackedAssembly = null;
                return(null);
            }
            containingTrackedAssembly = _cachedMethods[member].Item2;
            return(_cachedMethods[member].Item1);
        }
 public MemberID GetFactoryMethodFunc(MemberID ctorID)
 {
     var type = Type.GetType (ctorID.AssemblyQualifiedTypeName);
       var ctorInfo = type.GetConstructors().FirstOrDefault (c => c.MetadataToken == ctorID.Token);
       var result = (MethodBase) _getFactoryMethod.Invoke (null, new[] { ctorInfo });
       if (result == null)
     return null;
       return new MemberID (result.DeclaringType.AssemblyQualifiedName, result.Module.FullyQualifiedName, result.MetadataToken);
 }
        /// <summary>
        /// Resolves the given memberID to a monocecil typeDefinition. The out parameter is null if the assembly containing the type is an untracked assembly
        /// and does not need to be tracked. In case it is tracked, the out parameter contains the containing assembly and a new reference has to be added.
        /// </summary>
        public static TypeDefinition ResolveToTypeDefinition(MemberID member, IAssemblyTracker tracker, out AssemblyNameReference containingTrackedAssembly)
        {
            if (member == null)
            {
                containingTrackedAssembly = null;
                return(null);
            }
            containingTrackedAssembly = null;
            if (!_cachedTypes.ContainsKey(member))
            {
                AssemblyDefinition containingAssembly = null;
                foreach (var assemblyDefinition in tracker.GetAssemblies())
                {
                    if (assemblyDefinition.FullName == member.AssemblyQualifiedTypeName.Substring(member.AssemblyQualifiedTypeName.IndexOf(",") + 1).Trim())
                    {
                        containingAssembly = assemblyDefinition;
                    }
                }

                if (containingAssembly == null)
                {
                    containingAssembly = AssemblyDefinition.ReadAssembly(member.ModuleName);
                }
                else
                {
                    containingTrackedAssembly = containingAssembly.Name;
                }

                foreach (var moduleDefinition in containingAssembly.Modules)
                {
                    if (moduleDefinition.FullyQualifiedName == member.ModuleName)
                    {
                        foreach (var typeDefinition in moduleDefinition.Types)
                        {
                            if (typeDefinition.FullName == member.AssemblyQualifiedTypeName.Substring(0, member.AssemblyQualifiedTypeName.IndexOf(",")))
                            {
                                _cachedTypes[member] = new Tuple <TypeDefinition, AssemblyNameReference> (typeDefinition, containingAssembly.Name);
                                return(_cachedTypes[member].Item1);
                            }
                        }
                    }
                }
                containingTrackedAssembly = null;
                return(null);
            }
            containingTrackedAssembly = _cachedTypes[member].Item2;
            return(_cachedTypes[member].Item1);
        }
 public string GetWrapperName(MemberID ctorID)
 {
     var type = Type.GetType (ctorID.AssemblyQualifiedTypeName);
       var ctorInfo = type.GetConstructors().FirstOrDefault(c => c.MetadataToken == ctorID.Token);
       return (string)_getWrapperMethod.Invoke (null, new[] { ctorInfo });
 }