private static IEnumerable <AssemblyBinding> AddBindingRedirects( Project project, IFileSystemProvider fileSystemProvider, AppDomain domain, IDictionary <string, HashSet <string> > projectAssembliesCache, IVsFrameworkMultiTargeting frameworkMultiTargeting) { var redirects = Enumerable.Empty <AssemblyBinding>(); // Create a project system IFileSystem fileSystem = VsProjectSystemFactory.CreateProjectSystem(project, fileSystemProvider); // Run this on the UI thread since it enumerates all references IEnumerable <string> assemblies = ThreadHelper.Generic.Invoke(() => project.GetAssemblyClosure(fileSystemProvider, projectAssembliesCache)); redirects = BindingRedirectResolver.GetBindingRedirects(assemblies, domain); if (frameworkMultiTargeting != null) { // filter out assemblies that already exist in the target framework (CodePlex issue #3072) FrameworkName targetFrameworkName = project.GetTargetFrameworkName(); redirects = redirects.Where(p => !FrameworkAssemblyResolver.IsHigherAssemblyVersionInFramework(p.Name, p.AssemblyNewVersion, targetFrameworkName, fileSystemProvider)); } // Create a binding redirect manager over the configuration var manager = new BindingRedirectManager(fileSystem, project.GetConfigurationFile()); // Add the redirects manager.AddBindingRedirects(redirects); return(redirects); }
public void AddingBindingRedirectToEmptyConfig() { // Arrange var mockFileSystem = new Mock <IFileSystem>(); mockFileSystem.Setup(m => m.FileExists("config")).Returns(true); mockFileSystem.Setup(m => m.OpenFile("config")).Returns(@"<configuration></configuration>".AsStream()); var ms = new MemoryStream(); mockFileSystem.Setup(m => m.AddFile("config", It.IsAny <Stream>())).Callback <string, Stream>((path, stream) => { stream.CopyTo(ms); ms.Seek(0, SeekOrigin.Begin); }); var bindingRedirectManager = new BindingRedirectManager(mockFileSystem.Object, "config"); AssemblyBinding assemblyBinding = GetAssemblyBinding("A", "key", "3.0.0.0"); // Act bindingRedirectManager.AddBindingRedirects(new[] { assemblyBinding }); // Assert Assert.AreEqual(@"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""AssemblyName"" publicKeyToken=""token"" culture=""neutral"" /> <bindingRedirect oldVersion=""0.0.0.0-3.0.0.0"" newVersion=""3.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>", ms.ReadToEnd()); }
public void AddingBindingRedirectToEmptyConfig() { // Arrange var mockFileSystem = new MockFileSystem(); mockFileSystem.AddFile("config", @"<configuration></configuration>"); var bindingRedirectManager = new BindingRedirectManager(mockFileSystem, "config"); AssemblyBinding assemblyBinding = GetAssemblyBinding("AssemblyName", "token", "3.0.0.0"); // Act bindingRedirectManager.AddBindingRedirects(new[] { assemblyBinding }); // Assert string outputContent = mockFileSystem.OpenFile("config").ReadToEnd(); Assert.Equal(@"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""AssemblyName"" publicKeyToken=""token"" culture=""neutral"" /> <bindingRedirect oldVersion=""0.0.0.0-3.0.0.0"" newVersion=""3.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>", outputContent); }
private void AddBindingRedirects() { IEnumerable <AssemblyBinding> bindingRedirects = BindingRedirectResolver.GetBindingRedirects(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain); if (bindingRedirects.Any()) { BindingRedirectManager bindingRedirectManager = new BindingRedirectManager(mProjectManager.Project, mConfigurationFileName); bindingRedirectManager.AddBindingRedirects(bindingRedirects); } }
public void AddingBindingRedirectWithMultipleAssemblyBindingSectionsAddsToFirstOne() { // Arrange var mockFileSystem = new MockFileSystem(); mockFileSystem.AddFile("config", @" <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""System.Web.Mvc"" publicKeyToken=""31bf3856ad364e35"" /> <bindingRedirect oldVersion=""1.0.0.0"" newVersion=""2.0.0.0"" /> </dependentAssembly> </assemblyBinding> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""A.Library"" publicKeyToken=""a34a755ec277222f"" /> <bindingRedirect oldVersion=""1.0.0.0-2.0.0.0"" newVersion=""2.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>"); var bindingRedirectManager = new BindingRedirectManager(mockFileSystem, "config"); AssemblyBinding assemblyBinding = GetAssemblyBinding("AssemblyName", "token", "3.0.0.0"); // Act bindingRedirectManager.AddBindingRedirects(new[] { assemblyBinding }); // Assert string outputContent = mockFileSystem.OpenFile("config").ReadToEnd(); Assert.Equal(@"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""System.Web.Mvc"" publicKeyToken=""31bf3856ad364e35"" /> <bindingRedirect oldVersion=""1.0.0.0"" newVersion=""2.0.0.0"" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name=""AssemblyName"" publicKeyToken=""token"" culture=""neutral"" /> <bindingRedirect oldVersion=""0.0.0.0-3.0.0.0"" newVersion=""3.0.0.0"" /> </dependentAssembly> </assemblyBinding> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly> <assemblyIdentity name=""A.Library"" publicKeyToken=""a34a755ec277222f"" /> <bindingRedirect oldVersion=""1.0.0.0-2.0.0.0"" newVersion=""2.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>", outputContent); }
private void AddBindingRedirects(AppDomain appDomain) { if (DoNotAddBindingRedirects) { return; } // We can't use HttpRuntime.BinDirectory since there is no runtime when installing via WebMatrix. var binDirectory = Path.Combine(_siteRoot, "bin"); var assemblies = RemoteAssembly.GetAssembliesForBindingRedirect(appDomain, binDirectory); var bindingRedirects = BindingRedirectResolver.GetBindingRedirects(assemblies); if (bindingRedirects.Any()) { // NuGet ends up reading our web.config file regardless of if any bindingRedirects are needed. var bindingRedirectManager = new BindingRedirectManager(_projectManager.Project, "web.config"); bindingRedirectManager.AddBindingRedirects(bindingRedirects); } }
private void RemoveBindingRedirects() { IEnumerable <AssemblyBinding> bindingRedirects = BindingRedirectResolver.GetBindingRedirects(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain); string configurationFilePath = Path.Combine(mProjectManager.Project.Root, mConfigurationFileName); XDocument document = XDocument.Load(configurationFilePath); XElement runtimeElement = document.Root.Element("runtime"); IEnumerable <XElement> assemblyBindingElements = Enumerable.Empty <XElement>(); if (runtimeElement != null) { assemblyBindingElements = runtimeElement.Elements(XName.Get("assemblyBinding", "urn:schemas-microsoft-com:asm.v1")).Elements(XName.Get("dependentAssembly", "urn:schemas-microsoft-com:asm.v1")); } IEnumerable <AssemblyBinding> configurationBindingRedirects = assemblyBindingElements.Select(x => AssemblyBinding.Parse(x)); IEnumerable <AssemblyBinding> candidates = configurationBindingRedirects.Except(bindingRedirects); if (candidates.Any()) { BindingRedirectManager bindingRedirectManager = new BindingRedirectManager(mProjectManager.Project, mConfigurationFileName); bindingRedirectManager.RemoveBindingRedirects(candidates); } }
public void AddBindingRedirectUpdatesElementsPreservingCommentsAndWhitespace() { // Arrange var mockFileSystem = new MockFileSystem(); mockFileSystem.AddFile("config", @"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly><assemblyIdentity name=""AssemblyName"" publicKeyToken=""token"" culture=""neutral"" /> <!-- This is a comment that should not be removed --> <bindingRedirect oldVersion=""2.0.0.0"" newVersion=""3.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>"); var bindingRedirectManager = new BindingRedirectManager(mockFileSystem, "config"); AssemblyBinding assemblyBinding = GetAssemblyBinding("AssemblyName", "token", "4.0.0.0"); // Act bindingRedirectManager.AddBindingRedirects(new[] { assemblyBinding }); // Assert string outputContent = mockFileSystem.OpenFile("config").ReadToEnd(); Assert.Equal(@"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <dependentAssembly><assemblyIdentity name=""AssemblyName"" publicKeyToken=""token"" culture=""neutral"" /> <!-- This is a comment that should not be removed --> <bindingRedirect oldVersion=""0.0.0.0-4.0.0.0"" newVersion=""4.0.0.0"" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>", outputContent); }
private static IEnumerable <AssemblyBinding> AddBindingRedirects(Project project, IFileSystemProvider fileSystemProvider, AppDomain domain, IDictionary <string, HashSet <string> > projectAssembliesCache, bool checkProjectType = true) { var redirects = Enumerable.Empty <AssemblyBinding>(); // Only add binding redirects to projects that aren't class libraries if (!checkProjectType || project.SupportsConfig()) { // Create a project system IFileSystem fileSystem = VsProjectSystemFactory.CreateProjectSystem(project, fileSystemProvider); // Run this on the UI thread since it enumerates all references IEnumerable <string> assemblies = ThreadHelper.Generic.Invoke(() => project.GetAssemblyClosure(fileSystemProvider, projectAssembliesCache)); redirects = BindingRedirectResolver.GetBindingRedirects(assemblies, domain); // Create a binding redirect manager over the configuration var manager = new BindingRedirectManager(fileSystem, project.GetConfigurationFile()); // Add the redirects manager.AddBindingRedirects(redirects); } return(redirects); }