public void AddFrameworkReference(string name, string packageId) { NuGetUIThreadHelper.JoinableTaskFactory.Run(async delegate { await NuGetUIThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); try { AddGacReference(name); NuGetProjectContext.Log(ProjectManagement.MessageLevel.Debug, Strings.Debug_AddGacReference, name, ProjectName); } catch (Exception e) { if (IsReferenceUnavailableException(e)) { var frameworkName = EnvDTEProjectInfoUtility.GetDotNetFrameworkName(EnvDTEProject); if (FrameworkAssemblyResolver.IsFrameworkFacade(name, frameworkName)) { NuGetProjectContext.Log(ProjectManagement.MessageLevel.Info, Strings.FailedToAddFacadeReference, name, packageId); return; } } throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Strings.FailedToAddGacReference, packageId, name), e); } }); }
public static async Task <IEnumerable <AssemblyBinding> > AddBindingRedirectsAsync( ISolutionManager solutionManager, IVsProjectAdapter vsProjectAdapter, AppDomain domain, IDictionary <string, HashSet <string> > projectAssembliesCache, IVsFrameworkMultiTargeting frameworkMultiTargeting, INuGetProjectContext nuGetProjectContext) { // Run this on the UI thread since it enumerates all references await NuGetUIThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); var redirects = Enumerable.Empty <AssemblyBinding>(); var msBuildNuGetProjectSystem = GetMSBuildNuGetProjectSystem(solutionManager, vsProjectAdapter); // If no msBuildNuGetProjectSystem, no binding redirects. Bail if (msBuildNuGetProjectSystem == null) { return(redirects); } // Get the full path from envDTEProject var root = vsProjectAdapter.FullPath; IEnumerable <string> assemblies = EnvDTEProjectUtility.GetAssemblyClosure(vsProjectAdapter.Project, projectAssembliesCache); redirects = BindingRedirectResolver.GetBindingRedirects(assemblies, domain); if (frameworkMultiTargeting != null) { // filter out assemblies that already exist in the target framework (CodePlex issue #3072) var targetFrameworkName = EnvDTEProjectInfoUtility.GetDotNetFrameworkName(vsProjectAdapter.Project); redirects = redirects.Where(p => !FrameworkAssemblyResolver.IsHigherAssemblyVersionInFramework(p.Name, p.AssemblyNewVersion, targetFrameworkName)); } // Create a binding redirect manager over the configuration var manager = new BindingRedirectManager(EnvDTEProjectInfoUtility.GetConfigurationFile(vsProjectAdapter.Project), msBuildNuGetProjectSystem); // Add the redirects manager.AddBindingRedirects(redirects); return(redirects); }