From dbcac41be7ca731d07ea296423758ccfbd3bf383 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Fri, 4 Aug 2017 15:56:59 -0700 Subject: [PATCH] Get the correct version of Mvc for multitargeting --- .../DefaultTemplateEngineFactoryService.cs | 34 ++++++++++++++++++- ...crosoft.VisualStudio.RazorExtension.csproj | 9 +++++ .../Properties/BindingRedirectAttributes.cs | 8 +++++ .../source.extension.vsixmanifest | 1 + 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTemplateEngineFactoryService.cs b/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTemplateEngineFactoryService.cs index e97fe40e15..321dfcdfe7 100644 --- a/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTemplateEngineFactoryService.cs +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTemplateEngineFactoryService.cs @@ -2,7 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; +using System.Linq; using Microsoft.AspNetCore.Razor.Language; +using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Host; using Mvc1_X = Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X; using MvcLatest = Microsoft.AspNetCore.Mvc.Razor.Extensions; @@ -11,6 +14,7 @@ namespace Microsoft.CodeAnalysis.Razor { internal class DefaultTemplateEngineFactoryService : RazorTemplateEngineFactoryService { + private const string MvcAssemblyName = "Microsoft.AspNetCore.Mvc.Razor"; private static readonly Version LatestSupportedMvc = new Version(2, 1, 0); private readonly HostLanguageServices _services; @@ -70,8 +74,36 @@ namespace Microsoft.CodeAnalysis.Razor private Version GetMvcVersion(string projectPath) { - // TODO: Need to figure out the actual referenced Mvc version in the project. https://github.com/aspnet/Razor/issues/1183 + var workspace = _services.WorkspaceServices.Workspace; + + var project = workspace.CurrentSolution.Projects.FirstOrDefault(p => + { + var directory = Path.GetDirectoryName(p.FilePath); + return string.Equals( + NormalizeDirectoryPath(directory), + NormalizeDirectoryPath(projectPath), + StringComparison.OrdinalIgnoreCase); + }); + + if (project != null) + { + var compilation = CSharpCompilation.Create(project.AssemblyName).AddReferences(project.MetadataReferences); + + foreach (var identity in compilation.ReferencedAssemblyNames) + { + if (identity.Name == MvcAssemblyName) + { + return identity.Version; + } + } + } + return null; } + + private string NormalizeDirectoryPath(string path) + { + return path.Replace('\\', '/').TrimEnd('/'); + } } } diff --git a/tooling/Microsoft.VisualStudio.RazorExtension/Microsoft.VisualStudio.RazorExtension.csproj b/tooling/Microsoft.VisualStudio.RazorExtension/Microsoft.VisualStudio.RazorExtension.csproj index a3cfc05525..3c55aef940 100644 --- a/tooling/Microsoft.VisualStudio.RazorExtension/Microsoft.VisualStudio.RazorExtension.csproj +++ b/tooling/Microsoft.VisualStudio.RazorExtension/Microsoft.VisualStudio.RazorExtension.csproj @@ -153,6 +153,14 @@ + + Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X + False + + + + + {932f3c9c-a6c0-40d3-ba50-9309886242fc} Microsoft.AspNetCore.Razor.Language @@ -246,6 +254,7 @@ + diff --git a/tooling/Microsoft.VisualStudio.RazorExtension/Properties/BindingRedirectAttributes.cs b/tooling/Microsoft.VisualStudio.RazorExtension/Properties/BindingRedirectAttributes.cs index e92d97308d..fa59580d9f 100644 --- a/tooling/Microsoft.VisualStudio.RazorExtension/Properties/BindingRedirectAttributes.cs +++ b/tooling/Microsoft.VisualStudio.RazorExtension/Properties/BindingRedirectAttributes.cs @@ -11,6 +11,14 @@ using Microsoft.VisualStudio.Shell; OldVersionUpperBound = "2.1.0.0", NewVersion = "2.1.0.0")] +[assembly: ProvideBindingRedirection( + AssemblyName = "Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X", + GenerateCodeBase = true, + PublicKeyToken = "adb9793829ddae60", + OldVersionLowerBound = "0.0.0.0", + OldVersionUpperBound = "2.1.0.0", + NewVersion = "2.1.0.0")] + [assembly: ProvideBindingRedirection( AssemblyName = "Microsoft.AspNetCore.Razor.Language", GenerateCodeBase = true, diff --git a/tooling/Microsoft.VisualStudio.RazorExtension/source.extension.vsixmanifest b/tooling/Microsoft.VisualStudio.RazorExtension/source.extension.vsixmanifest index cbc0bb2263..6494e606f5 100644 --- a/tooling/Microsoft.VisualStudio.RazorExtension/source.extension.vsixmanifest +++ b/tooling/Microsoft.VisualStudio.RazorExtension/source.extension.vsixmanifest @@ -24,6 +24,7 @@ +