예제 #1
0
        internal BfType GetBfType(TypeReference typeReference)
        {
            BfType bfType = null;

            if (typeReference == null)
            {
                bfType = null;
            }
            else
            {
                typeReference = GetTypeReference(typeReference);

                if (typeReference is GenericParameter)
                {
                    var bfAssembly = _dictionary.Values.Where(assembly =>
                    {
                        if (assembly.Name == "mscorlib")
                        {
                            return(string.Compare(assembly.Version, "2.0.0.0", StringComparison.Ordinal) > -1);
                        }
                        return(false);
                    }).FirstOrDefault() ?? _dictionary.Values.FirstOrDefault(assembly => assembly.IsCoreAssembly);

                    // ReSharper disable once PossibleNullReferenceException
                    bfType = !bfAssembly.GetTypesDictionary().ContainsKey(typeReference.FullName)
                        ? CreateBfType(new TypeDefinition(typeReference.Name, typeReference.Namespace, TypeAttributes.Abstract, null), bfAssembly)
                        : bfAssembly.GetTypesDictionary()[typeReference.FullName];
                }
                else
                {
                    try
                    {
                        BfAssembly bfAssembly = null;

                        var scope = typeReference.Scope as AssemblyNameReference;

                        if (scope != null && _dictionary.ContainsKey(scope.FullName))
                        {
                            bfAssembly = _dictionary[scope.FullName];
                        }
                        else if (typeReference.Scope is ModuleDefinition && _dictionary.ContainsKey(((ModuleDefinition)typeReference.Scope).Assembly.Name.FullName))
                        {
                            bfAssembly = _dictionary[((ModuleDefinition)typeReference.Scope).Assembly.Name.FullName];
                        }
                        else if (typeReference.Scope is ModuleReference && _dictionary.ContainsKey(((ModuleReference)typeReference.Scope).Name))
                        {
                            bfAssembly = _assembliesDictionary[((ModuleReference)typeReference.Scope).Name];
                        }

                        BfType type = null;

                        if (bfAssembly != null)
                        {
                            bfAssembly.GetTypesDictionary().TryGetValue(GetKey(typeReference), out type);

                            if (type == null)
                            {
                                var typeDefinition = bfAssembly.GetAssemblyDefinition().Modules.SelectMany(m => m.Types).FirstOrDefault(p => typeReference.FullName == p.FullName);

                                if (typeDefinition != null)
                                {
                                    type = CreateBfType(typeDefinition, bfAssembly);
                                }
                            }
                        }

                        if (type != null)
                        {
                            bfType = type;
                        }
                    }
                    catch (KeyNotFoundException)
                    {
                    }
                }
            }

            return(bfType);
        }