Exemplo n.º 1
0
        /*Telerik Authorship*/
        public string ResolveAssemblyPath(string strongName, SpecialTypeAssembly special)
        {
            AssemblyNameReference nameRef      = AssemblyNameReference.Parse(strongName);
            TargetArchitecture    architecture = GetArchitectureFromStrongName(strongName);

            AssemblyName assemblyName = new AssemblyName(nameRef.Name,
                                                         nameRef.FullName,
                                                         nameRef.Version,
                                                         nameRef.PublicKeyToken)
            {
                TargetArchitecture = architecture
            };

            AssemblyStrongNameExtended assemblyKey = new AssemblyStrongNameExtended(assemblyName.FullName, architecture, special);
            IEnumerable <string>       files       = assemblyPathResolver.GetAssemblyPaths(assemblyName, assemblyKey);

            foreach (string file in files)
            {
                if (GetAssemblyDefinition(file).main_module.GetModuleArchitecture().CanReference(architecture))
                {
                    return(file);
                }
            }
            return(string.Empty);
        }
Exemplo n.º 2
0
 protected override bool TryGetResolvedAssembly(AssemblyStrongNameExtended assemblyKey, out List <AssemblyDefinition> assemblyList)
 {
     lock (this.resolvedAssembliesAccessLock)
     {
         return(base.TryGetResolvedAssembly(assemblyKey, out assemblyList));
     }
 }
Exemplo n.º 3
0
 protected override void RemoveFromResolvedAssemblies(AssemblyStrongNameExtended assemblyKey)
 {
     lock (this.resolvedAssembliesAccessLock)
     {
         base.RemoveFromResolvedAssemblies(assemblyKey);
     }
 }
Exemplo n.º 4
0
 protected override void AddToResolvedAssembliesInternal(AssemblyStrongNameExtended assemblyKey, List <AssemblyDefinition> assemblyList)
 {
     lock (this.resolvedAssembliesAccessLock)
     {
         base.AddToResolvedAssembliesInternal(assemblyKey, assemblyList);
     }
 }
        public bool Equals(AssemblyStrongNameExtended other)
        {
            if (other == null)
            {
                return(false);
            }

            return(this.StrongName == other.StrongName && this.Architecture == other.Architecture && this.Special == other.Special);
        }
        protected override void CreateProjectReferenceInternal(ModuleDefinition module, AssemblyNameReference reference, ref int assemblyReferenceIndex, SpecialTypeAssembly special, string referencesPath, string copiedReferencesSubfolder)
        {
            AssemblyName assemblyName = new AssemblyName(reference.Name,
                                                         reference.FullName,
                                                         reference.Version,
                                                         reference.PublicKeyToken);
            AssemblyStrongNameExtended assemblyKey = new AssemblyStrongNameExtended(assemblyName.FullName, module.Architecture, special);

            string             currentReferenceInitialLocation = this.currentAssemblyResolver.FindAssemblyPath(assemblyName, null, assemblyKey);
            AssemblyDefinition referencedAssembly = this.currentAssemblyResolver.Resolve(reference, "", assembly.MainModule.GetModuleArchitecture(), special);

#if NET35
            if (!currentReferenceInitialLocation.IsNullOrWhiteSpace())
#else
            if (!string.IsNullOrWhiteSpace(currentReferenceInitialLocation))
#endif
            {
                if (!this.IsInDotNetAssemblies(referencedAssembly))
                {
                    if (!Directory.Exists(referencesPath))
                    {
                        Directory.CreateDirectory(referencesPath);
                    }

                    string currentReferenceFileName      = Path.GetFileName(currentReferenceInitialLocation);
                    string currentReferenceFinalLocation = Path.Combine(referencesPath, currentReferenceFileName);
                    File.Copy(currentReferenceInitialLocation, currentReferenceFinalLocation, true);

                    //set to normal for testing purposes-to allow the test project to delete the coppied file between test runs
                    File.SetAttributes(currentReferenceFinalLocation, FileAttributes.Normal);

                    string relativePath = Path.Combine(".", copiedReferencesSubfolder);
                    relativePath = Path.Combine(relativePath, currentReferenceFileName);

                    this.ProjectFileManager.AddReferenceProjectItem(
                        assemblyReferenceIndex,
                        Path.GetFileNameWithoutExtension(currentReferenceFinalLocation),
                        relativePath);
                }
            }
            else
            {
                if (this.IsAspNetAssembly(reference))
                {
                    this.ProjectFileManager.AddPackageReferenceProjectItem(reference.Name, reference.Version.ToString());
                }
                else
                {
                    this.ProjectFileManager.AddReferenceProjectItem(assemblyReferenceIndex, reference.FullName);
                }
            }
        }
        protected virtual void CreateProjectReferenceInternal(ModuleDefinition module, AssemblyNameReference reference, ref int assemblyReferenceIndex,
                                                              SpecialTypeAssembly special, string referencesPath, string copiedReferencesSubfolder)
        {
            AssemblyName assemblyName = new AssemblyName(reference.Name,
                                                         reference.FullName,
                                                         reference.Version,
                                                         reference.PublicKeyToken);
            AssemblyStrongNameExtended assemblyKey = new AssemblyStrongNameExtended(assemblyName.FullName, module.Architecture, special);

            string             currentReferenceInitialLocation = this.currentAssemblyResolver.FindAssemblyPath(assemblyName, null, assemblyKey);
            AssemblyDefinition referencedAssembly = this.currentAssemblyResolver.Resolve(reference, "", assembly.MainModule.GetModuleArchitecture(), special);

#if NET35
            if (!currentReferenceInitialLocation.IsNullOrWhiteSpace())
#else
            if (!string.IsNullOrWhiteSpace(currentReferenceInitialLocation))
#endif
            {
                if (this.IsInReferenceAssemblies(referencedAssembly))
                {
                    //TODO: Consider doing additional check, to see if the assembly is resolved because it was pointed by the used/already in the tree
                    //		In this case, it might be better to copy it.
                    this.projectFileManager.AddReferenceProjectItem(assemblyReferenceIndex, reference.Name);
                }
                else                 // Copy the referenced assembly
                {
                    if (!Directory.Exists(referencesPath))
                    {
                        Directory.CreateDirectory(referencesPath);
                    }

                    string currentReferenceFileName      = Path.GetFileName(currentReferenceInitialLocation);
                    string currentReferenceFinalLocation = Path.Combine(referencesPath, currentReferenceFileName);
                    File.Copy(currentReferenceInitialLocation, currentReferenceFinalLocation, true);

                    // set to normal for testing purposes- to allow the test project to delete the coppied file between test runs
                    File.SetAttributes(currentReferenceFinalLocation, FileAttributes.Normal);

                    string relativePath = Path.Combine(".", copiedReferencesSubfolder);
                    relativePath = Path.Combine(relativePath, currentReferenceFileName);

                    this.projectFileManager.AddReferenceProjectItem(
                        assemblyReferenceIndex,
                        Path.GetFileNameWithoutExtension(currentReferenceFinalLocation),
                        relativePath);
                }
            }
            else
            {
                this.projectFileManager.AddReferenceProjectItem(assemblyReferenceIndex, reference.FullName);
            }
        }
Exemplo n.º 8
0
        /*Telerik Authorship*/
        private AssemblyDefinition GetFromResolvedAssemblies(AssemblyName assemblyName, SpecialTypeAssembly special)
        {
            foreach (string architectureString in GetReferencableArchitectures(assemblyName))
            {
                List <AssemblyDefinition>  assemblyList;
                AssemblyStrongNameExtended extendedStrongName = new AssemblyStrongNameExtended(assemblyName.FullName, (TargetArchitecture)Enum.Parse(typeof(TargetArchitecture), architectureString), special);
                if (TryGetResolvedAssembly(extendedStrongName, out assemblyList))
                {
                    return(assemblyList[0]);
                }
            }

            return(null);
        }
Exemplo n.º 9
0
        private void AddToResolvedAssemblies(AssemblyDefinition assemblyDef)
        {
            filePathToAssemblyDefinitionCache.Add(assemblyDef.MainModule.FilePath, assemblyDef);

            /*Telerik Authorship*/
            AssemblyStrongNameExtended assemblyKey = GetAssemblyKey(assemblyDef);
            List <AssemblyDefinition>  assemblyList;

            if (!TryGetResolvedAssembly(assemblyKey, out assemblyList))
            {
                assemblyList = new List <AssemblyDefinition>();
                AddToResolvedAssembliesInternal(assemblyKey, assemblyList);
            }

            assemblyList.Add(assemblyDef);
        }
        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj))
            {
                return(false);
            }

            if (ReferenceEquals(this, obj))
            {
                return(true);
            }

            AssemblyStrongNameExtended other = obj as AssemblyStrongNameExtended;

            return(this.Equals(other));
        }
Exemplo n.º 11
0
        private bool TryResolveTypeAssemblyFilePath(TypeReference typeReference, out string assemblyFilePath)
        {
            ModuleDefinition           moduleDefinition      = typeReference.Module;
            AssemblyNameReference      assemblyNameReference = typeReference.Module.Assembly.Name;
            AssemblyStrongNameExtended assemblyKey           = this.GetExtendedStrongName(moduleDefinition);
            AssemblyName assemblyName = new AssemblyName(assemblyNameReference.Name,
                                                         assemblyNameReference.FullName,
                                                         assemblyNameReference.Version,
                                                         assemblyNameReference.PublicKeyToken)
            {
                TargetArchitecture = moduleDefinition.GetModuleArchitecture()
            };

            assemblyFilePath = moduleDefinition.AssemblyResolver.FindAssemblyPath(assemblyName, null, assemblyKey);

            return(!string.IsNullOrEmpty(assemblyFilePath));
        }
 protected override void AddToResolvedAssembliesInternal(AssemblyStrongNameExtended assemblyKey, List <AssemblyDefinition> assemblyList)
 {
     V_0 = this.resolvedAssembliesAccessLock;
     V_1 = false;
     try
     {
         Monitor.Enter(V_0, ref V_1);
         this.AddToResolvedAssembliesInternal(assemblyKey, assemblyList);
     }
     finally
     {
         if (V_1)
         {
             Monitor.Exit(V_0);
         }
     }
     return;
 }
 protected override void RemoveFromResolvedAssemblies(AssemblyStrongNameExtended assemblyKey)
 {
     V_0 = this.resolvedAssembliesAccessLock;
     V_1 = false;
     try
     {
         Monitor.Enter(V_0, ref V_1);
         this.RemoveFromResolvedAssemblies(assemblyKey);
     }
     finally
     {
         if (V_1)
         {
             Monitor.Exit(V_0);
         }
     }
     return;
 }
 protected override bool TryGetResolvedAssembly(AssemblyStrongNameExtended assemblyKey, out List <AssemblyDefinition> assemblyList)
 {
     V_0 = this.resolvedAssembliesAccessLock;
     V_1 = false;
     try
     {
         Monitor.Enter(V_0, ref V_1);
         V_2 = this.TryGetResolvedAssembly(assemblyKey, ref assemblyList);
     }
     finally
     {
         if (V_1)
         {
             Monitor.Exit(V_0);
         }
     }
     return(V_2);
 }
Exemplo n.º 15
0
        AssemblyDefinition GetTargetAssembly(AssemblyNameReference reference, ReaderParameters parameters, TargetArchitecture architecture)
        {
            if (reference == null)
            {
                return(null);
            }
            var assemblyName = new AssemblyName(reference.Name,
                                                reference.FullName,
                                                reference.Version,
                                                reference.PublicKeyToken)
            {
                TargetArchitecture = architecture
            };

            AssemblyStrongNameExtended assemblyKey = new AssemblyStrongNameExtended(assemblyName.FullName, architecture, SpecialTypeAssembly.None);
            IEnumerable <string>       filePaths   = assemblyPathResolver.GetAssemblyPaths(assemblyName, assemblyKey);

            return(GetTargetAssembly(filePaths, parameters, architecture));
        }
Exemplo n.º 16
0
        /*Telerik Authorship*/
        public virtual void AddToAssemblyCache(string filePath, TargetArchitecture platform, bool storeAssemblyDefInCahce = false)
        {
            assemblyPathResolver.AddToAssemblyCache(filePath, platform);

            AddSearchDirectory(Path.GetDirectoryName(filePath));
            if (storeAssemblyDefInCahce && !filePathToAssemblyDefinitionCache.ContainsKey(filePath))
            {
                AssemblyDefinition assemblyDef = LoadAssemblyDefinition(filePath, new ReaderParameters(this), loadPdb: true);
                if (assemblyDef != null)
                {
                    string              strongName   = assemblyDef.MainModule.Name;
                    TargetArchitecture  architecture = assemblyDef.MainModule.Architecture;
                    SpecialTypeAssembly special      = assemblyDef.MainModule.IsReferenceAssembly() ? SpecialTypeAssembly.Reference : SpecialTypeAssembly.None;

                    AssemblyStrongNameExtended assemblyKey = new AssemblyStrongNameExtended(strongName, architecture, special);

                    AddToResolvedAssemblies(assemblyDef);
                    assemblyPathResolver.RemoveFromUnresolvedCache(assemblyKey);
                }
            }
        }
Exemplo n.º 17
0
        public void RemoveFromAssemblyCache(string fileName)
        {
            assemblyPathResolver.RemoveFromAssemblyCache(fileName);

            AssemblyDefinition assemblyDef;

            if (filePathToAssemblyDefinitionCache.TryGetValue(fileName, out assemblyDef))
            {
                /*Telerik Authorship*/
                AssemblyStrongNameExtended assemblyKey = GetAssemblyKey(assemblyDef);
                List <AssemblyDefinition>  assemblyDefinitions;
                if (TryGetResolvedAssembly(assemblyKey, out assemblyDefinitions))
                {
                    assemblyDefinitions.Remove(assemblyDef);
                    if (assemblyDefinitions.Count == 0)
                    {
                        RemoveFromResolvedAssemblies(assemblyKey);
                    }
                }

                filePathToAssemblyDefinitionCache.Remove(fileName);
            }
        }
Exemplo n.º 18
0
        /*Telerik Authorship*/
        private AssemblyDefinition UserSpecifiedAssembly(AssemblyNameReference name, TargetArchitecture architecture, AssemblyStrongNameExtended assemblyKey)
        {
            //If not in denied assemblies cache
            if (assemblyPathResolver.IsFailedAssembly(assemblyKey))
            {
                return(null);
            }
            if (ResolveFailure != null)
            {
                AssemblyDefinition assembly = ResolveFailure(this, new AssemblyResolveEventArgs(name, architecture));
                if (assembly != null)
                {
                    if (!filePathToAssemblyDefinitionCache.ContainsKey(assembly.MainModule.FilePath))
                    {
                        AddToResolvedAssemblies(assembly);
                    }
                    if (!userDefinedAssemblies.Contains(assembly.MainModule.FilePath))
                    {
                        userDefinedAssemblies.Add(assembly.MainModule.FilePath);
                    }
                    RemoveFromFailedAssemblies(assemblyKey);

                    return(assembly);
                }
            }
            assemblyPathResolver.AddToUnresolvedCache(assemblyKey);
            return(null);
        }
Exemplo n.º 19
0
 public override string FindAssemblyPath(AssemblyName assemblyName, string fallbackDir, AssemblyStrongNameExtended assemblyKey, bool bubbleToUserIfFailed = true)
 {
     return(base.FindAssemblyPath(assemblyName, fallbackDir, assemblyKey, bubbleToUserIfFailed: false));
 }
Exemplo n.º 20
0
 /*Telerik Authorship*/
 protected virtual void RemoveFromResolvedAssemblies(AssemblyStrongNameExtended assemblyKey)
 {
     resolvedAssemblies.Remove(assemblyKey);
 }
Exemplo n.º 21
0
        /*Telerik Authorship*/
        public virtual string FindAssemblyPath(AssemblyName assemblyName, string fallbackDir, AssemblyStrongNameExtended assemblyKey, bool bubbleToUserIfFailed = true)
        {
            if (assemblyPathResolver.IsFailedAssembly(assemblyKey))
            {
                return(null);
            }

            AssemblyDefinition resolvedAssembly = GetFromResolvedAssemblies(assemblyName, SpecialTypeAssembly.None);

            if (resolvedAssembly != null)
            {
                return(resolvedAssembly.MainModule.FilePath);
            }

            var assemblyNameRef = new AssemblyNameReference(assemblyName.Name, assemblyName.Version)
            {
                PublicKeyToken = assemblyName.PublicKeyToken
            };

            IEnumerable <string> results;

            if (assemblyPathResolver.TryGetAssemblyPathsFromCache(assemblyName, assemblyKey, out results))
            {
                return(results.FirstOrDefault());
            }
            AssemblyDefinition assemblyDefinition = SearchDirectory(assemblyNameRef, new ReaderParameters(this), assemblyName.TargetArchitecture, fallbackDir);

            if (assemblyDefinition != null)
            {
                assemblyPathResolver.AddToAssemblyPathNameCache(assemblyName, assemblyDefinition.MainModule.FilePath);

                return(assemblyDefinition.MainModule.FilePath);
            }

            string result = assemblyPathResolver.GetAssemblyPath(assemblyName, assemblyKey);

        #if !NET_4_0
            if (!result.IsNullOrWhiteSpace())
        #else
            if (!string.IsNullOrWhiteSpace(result))
        #endif
            {
                return(result);
            }
            if (bubbleToUserIfFailed)
            {
                assemblyDefinition = UserSpecifiedAssembly(assemblyNameRef, assemblyName.TargetArchitecture, assemblyKey);
            }
            if (assemblyDefinition != null)
            {
                string filePath = assemblyDefinition.MainModule.FilePath;

                this.AddSearchDirectory(Path.GetDirectoryName(filePath));

                return(filePath);
            }

            return(result);
        }
Exemplo n.º 22
0
        AssemblyDefinition TryGetTargetAssembly(AssemblyNameReference reference, ReaderParameters parameters, TargetArchitecture architecture, AssemblyStrongNameExtended assemblyKey)
        {
            if (reference == null)
            {
                return(null);
            }
            var assemblyName = new AssemblyName(reference.Name,
                                                reference.FullName,
                                                reference.Version,
                                                reference.PublicKeyToken)
            {
                TargetArchitecture = architecture
            };
            IEnumerable <string> filePaths;

            if (assemblyPathResolver.TryGetAssemblyPathsFromCache(assemblyName, assemblyKey, out filePaths))
            {
                return(GetTargetAssembly(filePaths, parameters, architecture));
            }
            return(null);
        }
Exemplo n.º 23
0
 /*Telerik Authorship*/
 public void RemoveFromFailedAssemblies(AssemblyStrongNameExtended assemblyName)
 {
     assemblyPathResolver.RemoveFromUnresolvedCache(assemblyName);
 }
Exemplo n.º 24
0
 /*Telerik Authorship*/
 protected virtual bool TryGetResolvedAssembly(AssemblyStrongNameExtended key, out List <AssemblyDefinition> assemblyList)
 {
     return(resolvedAssemblies.TryGetValue(key, out assemblyList));
 }
Exemplo n.º 25
0
 /*Telerik Authorship*/
 protected virtual void AddToResolvedAssembliesInternal(AssemblyStrongNameExtended assemblyKey, List <AssemblyDefinition> assemblyList)
 {
     resolvedAssemblies.Add(assemblyKey, assemblyList);
 }
Exemplo n.º 26
0
        /*Telerik Authorship*/
        private AssemblyDefinition Resolve(AssemblyNameReference name, string defaultPath, ReaderParameters parameters, TargetArchitecture architecture, SpecialTypeAssembly special, bool bubbleToUserIfFailed, bool addToFailedCache = true)
        {
            if (!string.IsNullOrEmpty(defaultPath))
            {
                this.AddSearchDirectory(defaultPath);
            }

            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (parameters == null)
            {
                parameters = new ReaderParameters(this);
            }

            /*Telerik Authorship*/
            AssemblyStrongNameExtended assemblyKey = new AssemblyStrongNameExtended(name.FullName, architecture, special);
            AssemblyName assemblyName = new AssemblyName(name.Name, name.FullName, name.Version, name.PublicKey)
            {
                TargetArchitecture = architecture
            };
            AssemblyDefinition assembly = null;

            /*Telerik Authorship*/
            bool isResolved = DoWithReadLock(this.resolveLock, () =>
            {
                if (assemblyPathResolver.IsFailedAssembly(assemblyKey))
                {
                    assembly = null;

                    return(true);
                }

                assembly = GetFromResolvedAssemblies(assemblyName, special);
                return(assembly != null);
            });

            if (isResolved)
            {
                return(assembly);
            }

            /*Telerik Authorship*/
            return(DoWithWriteLock(this.resolveLock, () =>
            {
                // Double checks to ensure that the entry is not added in the meantime.
                if (assemblyPathResolver.IsFailedAssembly(assemblyKey))
                {
                    return null;
                }

                assembly = GetFromResolvedAssemblies(assemblyName, special);
                if (assembly != null)
                {
                    return assembly;
                }

                /*Telerik Authorship*/
                // This code has been added by Mono.Cecil 0.9.6. It has been commented, because retargetable references should be further
                // researched and handled appropriately across the application. TP item N. 323383
                //if (name.IsRetargetable)
                //{
                //	// if the reference is retargetable, zero it
                //	name = new AssemblyNameReference(name.Name, new Version(0, 0, 0, 0))
                //	{
                //		PublicKeyToken = Empty<byte>.Array,
                //	};
                //}

                assembly = SearchDirectory(name, parameters, architecture, defaultPath) ?? TryGetTargetAssembly(name, parameters, architecture, assemblyKey);

                if (assembly != null)
                {
                    if (!filePathToAssemblyDefinitionCache.ContainsKey(assembly.MainModule.FilePath))
                    {
                        AddToResolvedAssemblies(assembly);
                    }
                    return assembly;
                }
                assembly = GetTargetAssembly(name, parameters, architecture);
                if (assembly != null)
                {
                    if (!filePathToAssemblyDefinitionCache.ContainsKey(assembly.MainModule.FilePath))
                    {
                        AddToResolvedAssemblies(assembly);
                    }
                    return assembly;
                }
                if (bubbleToUserIfFailed)
                {
                    return UserSpecifiedAssembly(name, architecture, assemblyKey);
                }
                else if (addToFailedCache)
                {
                    assemblyPathResolver.AddToUnresolvedCache(assemblyKey);
                }
                return null;
            }));
        }