Exemplo n.º 1
0
        private void AddReference(Project projectNeedingReference, Project projectRemoving, string filePath)
        {
            var vsProject = ((VSProject)projectNeedingReference.Object);

            filePath = ToAbsolute(filePath, vsProject.Project.FullName);

            foreach (Reference reference in vsProject.References)
            {
                if (reference.SourceProject == null)
                {
                    continue;
                }

                if (reference.SourceProject.FullName == projectRemoving.FullName)
                {
                    reference.Remove();
                    break;
                }
            }

            VSLangProj.Reference newRef = vsProject.References.Add(filePath);

            if (!newRef.Path.Equals(filePath, StringComparison.OrdinalIgnoreCase))
            {
                Microsoft.Build.Evaluation.Project     msBuildProj = Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.GetLoadedProjects(projectNeedingReference.FullName).First();
                Microsoft.Build.Evaluation.ProjectItem msBuildRef  = null;

                AssemblyName newFileAssemblyName = AssemblyName.GetAssemblyName(filePath);
                foreach (var item in msBuildProj.GetItems("Reference"))
                {
                    AssemblyName refAssemblyName = null;
                    try
                    {
                        refAssemblyName = new AssemblyName(item.EvaluatedInclude);
                    }
                    catch { }

                    if (refAssemblyName != null)
                    {
                        var refToken = refAssemblyName.GetPublicKeyToken() ?? new byte[0];
                        var newToken = newFileAssemblyName.GetPublicKeyToken() ?? new byte[0];

                        if
                        (
                            refAssemblyName.Name.Equals(newFileAssemblyName.Name, StringComparison.OrdinalIgnoreCase) &&
                            ((refAssemblyName.Version != null && refAssemblyName.Version.Equals(newFileAssemblyName.Version)) ||
                             (refAssemblyName.Version == null && newFileAssemblyName.Version == null)) &&
                            (refAssemblyName.CultureInfo != null && (refAssemblyName.CultureInfo.Equals(newFileAssemblyName.CultureInfo)) ||
                             (refAssemblyName.CultureInfo == null && newFileAssemblyName.CultureInfo == null)) &&
                            ((Enumerable.SequenceEqual(refToken, newToken)))
                        )
                        {
                            msBuildRef = item;
                            break;
                        }
                    }
                }

                if (msBuildRef != null)
                {
                    _ = msBuildRef.SetMetadataValue("HintPath", ToRelative(filePath, projectNeedingReference.FullName));
                }
            }
        }