From b2ce55a56c7d93070601ec0af0a1e5342ff78084 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Tue, 6 Jul 2021 16:23:22 -0700 Subject: [PATCH 1/2] Generate binary redirects for OmniSharp libraries --- build.cake | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/build.cake b/build.cake index 00a05f3215..131d1af6b5 100644 --- a/build.cake +++ b/build.cake @@ -7,6 +7,8 @@ using System.ComponentModel; using System.Net; +using System.Reflection; +using System.Xml; // Arguments var target = Argument("target", "Default"); @@ -719,6 +721,53 @@ void CopyExtraDependencies(BuildEnvironment env, string outputFolder) FileHelper.Copy(CombinePaths(env.WorkingDirectory, "license.md"), CombinePaths(outputFolder, "license.md"), overwrite: true); } +void AddOmniSharpBindingRedirects(string outputFolder) +{ + var appConfig = CombinePaths(outputFolder, "OmniSharp.exe.config"); + + // Load app.config + var document = new XmlDocument(); + document.Load(appConfig); + + // Find bindings + var runtime = document.GetElementsByTagName("runtime")[0]; + var assemblyBinding = document.CreateElement("assemblyBinding", "urn:schemas-microsoft-com:asm.v1"); + + foreach (var filePath in System.IO.Directory.GetFiles(outputFolder, "OmniSharp.*.dll")) + { + // Read assembly names for OmniSharp libraries + var assemblyName = AssemblyName.GetAssemblyName(filePath); + + // Create binding redirect and add to bindings + var redirect = CreateBindingRedirect(document, assemblyName); + assemblyBinding.AppendChild(redirect); + } + + runtime.AppendChild(assemblyBinding); + + // Save updated app.config + document.Save(appConfig); +} + +XmlElement CreateBindingRedirect(XmlDocument document, AssemblyName assemblyName) +{ + var dependentAssembly = document.CreateElement("dependentAssembly", "urn:schemas-microsoft-com:asm.v1"); + + var assemblyIdentity = document.CreateElement("assemblyIdentity", "urn:schemas-microsoft-com:asm.v1"); + assemblyIdentity.SetAttribute("name", assemblyName.Name); + var publicKeyToken = BitConverter.ToString(assemblyName.GetPublicKeyToken()).Replace("-", string.Empty).ToLower(); + assemblyIdentity.SetAttribute("publicKeyToken", publicKeyToken); + assemblyIdentity.SetAttribute("culture", "neutral"); + dependentAssembly.AppendChild(assemblyIdentity); + + var bindingRedirect = document.CreateElement("bindingRedirect", "urn:schemas-microsoft-com:asm.v1"); + bindingRedirect.SetAttribute("oldVersion", $"0.0.0.0-{assemblyName.Version}"); + bindingRedirect.SetAttribute("newVersion", assemblyName.Version.ToString()); + dependentAssembly.AppendChild(bindingRedirect); + + return dependentAssembly; +} + string PublishMonoBuild(string project, BuildEnvironment env, BuildPlan plan, string configuration) { Information($"Publishing Mono build for {project}..."); @@ -730,6 +779,7 @@ string PublishMonoBuild(string project, BuildEnvironment env, BuildPlan plan, st CopyMonoBuild(env, buildFolder, outputFolder); CopyExtraDependencies(env, outputFolder); + AddOmniSharpBindingRedirects(outputFolder); // Copy dependencies of Mono build FileHelper.Copy( @@ -767,6 +817,7 @@ string PublishMonoBuildForPlatform(string project, MonoRuntime monoRuntime, Buil CopyMonoBuild(env, sourceFolder, omnisharpFolder); CopyExtraDependencies(env, outputFolder); + AddOmniSharpBindingRedirects(outputFolder); Package(project, monoRuntime.PlatformName, outputFolder, env.Folders.ArtifactsPackage, env.Folders.DeploymentPackage); @@ -829,6 +880,7 @@ string PublishWindowsBuild(string project, BuildEnvironment env, BuildPlan plan, DirectoryHelper.Copy($"{env.Folders.MSBuild}", CombinePaths(outputFolder, ".msbuild")); CopyExtraDependencies(env, outputFolder); + AddOmniSharpBindingRedirects(outputFolder); Package(project, rid, outputFolder, env.Folders.ArtifactsPackage, env.Folders.DeploymentPackage); From 9466e75e695a89f8b83f45468ac6e655306bcdf1 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Tue, 6 Jul 2021 17:50:23 -0700 Subject: [PATCH 2/2] Fix path for mono platform builds --- build.cake | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/build.cake b/build.cake index 131d1af6b5..65de200b66 100644 --- a/build.cake +++ b/build.cake @@ -721,9 +721,9 @@ void CopyExtraDependencies(BuildEnvironment env, string outputFolder) FileHelper.Copy(CombinePaths(env.WorkingDirectory, "license.md"), CombinePaths(outputFolder, "license.md"), overwrite: true); } -void AddOmniSharpBindingRedirects(string outputFolder) +void AddOmniSharpBindingRedirects(string omnisharpFolder) { - var appConfig = CombinePaths(outputFolder, "OmniSharp.exe.config"); + var appConfig = CombinePaths(omnisharpFolder, "OmniSharp.exe.config"); // Load app.config var document = new XmlDocument(); @@ -733,9 +733,10 @@ void AddOmniSharpBindingRedirects(string outputFolder) var runtime = document.GetElementsByTagName("runtime")[0]; var assemblyBinding = document.CreateElement("assemblyBinding", "urn:schemas-microsoft-com:asm.v1"); - foreach (var filePath in System.IO.Directory.GetFiles(outputFolder, "OmniSharp.*.dll")) + // Find OmniSharp libraries + foreach (var filePath in System.IO.Directory.GetFiles(omnisharpFolder, "OmniSharp.*.dll")) { - // Read assembly names for OmniSharp libraries + // Read assembly name from OmniSharp library var assemblyName = AssemblyName.GetAssemblyName(filePath); // Create binding redirect and add to bindings @@ -817,7 +818,7 @@ string PublishMonoBuildForPlatform(string project, MonoRuntime monoRuntime, Buil CopyMonoBuild(env, sourceFolder, omnisharpFolder); CopyExtraDependencies(env, outputFolder); - AddOmniSharpBindingRedirects(outputFolder); + AddOmniSharpBindingRedirects(omnisharpFolder); Package(project, monoRuntime.PlatformName, outputFolder, env.Folders.ArtifactsPackage, env.Folders.DeploymentPackage);